diff --git a/.env b/.env index b2afa7a..c072c77 100644 --- a/.env +++ b/.env @@ -70,3 +70,4 @@ SQLRUNNER_URL=http://sqlrunner.app-sf.orb.local:8080 # Email SERVER_EMAIL=no-reply@dbplay.pan93.com +SERVER_EMAIL_FOR_TEST=dbplay@pan93.com diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml index 22a1e06..ccf8503 100644 --- a/.github/workflows/check.yaml +++ b/.github/workflows/check.yaml @@ -38,6 +38,8 @@ jobs: - name: Install dependencies run: | devenv shell composer -- install --prefer-dist --no-progress + devenv shell composer -- -d tools/php-cs-fixer install + devenv shell composer -- -d tools/twig-cs-fixer install devenv shell pnpm install - name: Lint PHP files diff --git a/.gitignore b/.gitignore index 50db1a6..781723d 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,8 @@ phpstan.neon # node_modules node_modules/ -.pnpm-store/ \ No newline at end of file +.pnpm-store/ +###> php-cs-fixer/shim ### +/.php-cs-fixer.php +/.php-cs-fixer.cache +###< php-cs-fixer/shim ### diff --git a/.idea/app-sf.iml b/.idea/app-sf.iml index 77d0cc6..c89420c 100644 --- a/.idea/app-sf.iml +++ b/.idea/app-sf.iml @@ -5,7 +5,6 @@ - @@ -203,6 +202,7 @@ + diff --git a/.idea/php.xml b/.idea/php.xml index 638aee1..66d6fb8 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -47,7 +47,6 @@ - @@ -56,16 +55,8 @@ - - - - - - - - @@ -124,7 +115,6 @@ - @@ -160,7 +150,6 @@ - @@ -220,6 +209,10 @@ + + + + diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index bf19668..b6709df 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -8,12 +8,11 @@ return (new PhpCsFixer\Config()) ->setParallelConfig(PhpCsFixer\Runner\Parallel\ParallelConfigFactory::detect()) ->setRules([ - '@PER-CS' => true, - '@PER-CS:risky' => true, - '@PHP82Migration' => true, - '@PHP80Migration:risky' => true, - '@Symfony' => true, - '@Symfony:risky' => true, + '@PHP83Migration' => true, + '@PHP82Migration:risky' => true, + '@PHPUnit100Migration:risky' => true, + '@PhpCsFixer' => true, + '@PhpCsFixer:risky' => true, 'no_unused_imports' => true, ]) ->setFinder($finder) diff --git a/.phpactor.json b/.phpactor.json new file mode 100644 index 0000000..8db6c9f --- /dev/null +++ b/.phpactor.json @@ -0,0 +1,6 @@ +{ + "language_server_phpstan.enabled": true, + "symfony.enabled": true, + "language_server_php_cs_fixer.enabled": true, + "phpunit.enabled": true +} diff --git a/composer.json b/composer.json index af8e5d4..53bb7bc 100644 --- a/composer.json +++ b/composer.json @@ -105,8 +105,8 @@ "pnpm typecheck", "pnpm lint", "pnpm format", - "php-cs-fixer fix --config .php-cs-fixer.dist.php", - "twig-cs-fixer lint --fix templates", + "tools/php-cs-fixer/vendor/bin/php-cs-fixer fix --config .php-cs-fixer.dist.php", + "tools/twig-cs-fixer/vendor/bin/twig-cs-fixer lint --fix templates", "phpstan analyse", "hadolint Dockerfile*" ], @@ -133,7 +133,6 @@ } }, "require-dev": { - "friendsofphp/php-cs-fixer": "dev-master", "phpstan/extension-installer": "1.4.x-dev", "phpstan/phpstan": "2.0.x-dev", "phpstan/phpstan-doctrine": "2.0.x-dev", diff --git a/composer.lock b/composer.lock index f120a30..7085440 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "410a4fbdac52136dd4a56f4be4ccb880", + "content-hash": "2339213a08e3dfed9f129ee5429dd7af", "packages": [ { "name": "async-aws/core", @@ -591,12 +591,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "67eb7938e7593456714f3d3de9df65a1a7b25c1d" + "reference": "7014f6c1c322bb040c7db23ed44516b9a4535d20" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/67eb7938e7593456714f3d3de9df65a1a7b25c1d", - "reference": "67eb7938e7593456714f3d3de9df65a1a7b25c1d", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/7014f6c1c322bb040c7db23ed44516b9a4535d20", + "reference": "7014f6c1c322bb040c7db23ed44516b9a4535d20", "shasum": "" }, "require": { @@ -606,7 +606,7 @@ "doctrine/coding-standard": "^9 || ^12", "phpstan/phpstan": "1.4.10 || 2.0.3", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5", "psr/log": "^1 || ^2 || ^3" }, "suggest": { @@ -629,7 +629,7 @@ "issues": "https://github.com/doctrine/deprecations/issues", "source": "https://github.com/doctrine/deprecations/tree/1.1.x" }, - "time": "2024-12-16T12:46:45+00:00" + "time": "2024-12-20T07:18:16+00:00" }, { "name": "doctrine/doctrine-bundle", @@ -846,12 +846,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "0ceae6fc4e647486dae93de00feed49b8e8322fb" + "reference": "5e8cc1e1f35ee134fcbf8f9752a0a4e090555d18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/0ceae6fc4e647486dae93de00feed49b8e8322fb", - "reference": "0ceae6fc4e647486dae93de00feed49b8e8322fb", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/5e8cc1e1f35ee134fcbf8f9752a0a4e090555d18", + "reference": "5e8cc1e1f35ee134fcbf8f9752a0a4e090555d18", "shasum": "" }, "require": { @@ -930,7 +930,7 @@ "type": "tidelift" } ], - "time": "2024-11-26T10:59:05+00:00" + "time": "2024-12-17T14:52:16+00:00" }, { "name": "doctrine/inflector", @@ -1029,12 +1029,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "a9e64e5ea80184e14a66c262e5bcf3c2cb4a94d7" + "reference": "139dfa4ac9355bc99d37ae9f94c268f3bcb0c8c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/a9e64e5ea80184e14a66c262e5bcf3c2cb4a94d7", - "reference": "a9e64e5ea80184e14a66c262e5bcf3c2cb4a94d7", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/139dfa4ac9355bc99d37ae9f94c268f3bcb0c8c1", + "reference": "139dfa4ac9355bc99d37ae9f94c268f3bcb0c8c1", "shasum": "" }, "require": { @@ -1091,7 +1091,7 @@ "type": "tidelift" } ], - "time": "2024-12-02T21:34:17+00:00" + "time": "2024-12-16T19:06:38+00:00" }, { "name": "doctrine/lexer", @@ -1279,12 +1279,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "a15543a2cee2d548e94a3a867b4ca6cf1354cfc3" + "reference": "9f2b367081c200b588a0a4faca38f8179ec58850" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/a15543a2cee2d548e94a3a867b4ca6cf1354cfc3", - "reference": "a15543a2cee2d548e94a3a867b4ca6cf1354cfc3", + "url": "https://api.github.com/repos/doctrine/orm/zipball/9f2b367081c200b588a0a4faca38f8179ec58850", + "reference": "9f2b367081c200b588a0a4faca38f8179ec58850", "shasum": "" }, "require": { @@ -1361,7 +1361,7 @@ "issues": "https://github.com/doctrine/orm/issues", "source": "https://github.com/doctrine/orm/tree/3.4.x" }, - "time": "2024-12-08T12:02:05+00:00" + "time": "2024-12-24T23:20:07+00:00" }, { "name": "doctrine/persistence", @@ -1369,12 +1369,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "94ded2b76bd408ee90eaecef157f04aaed7fc705" + "reference": "bedc1c5743b7a39204eef6d2a6c1fd73f5df356e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/94ded2b76bd408ee90eaecef157f04aaed7fc705", - "reference": "94ded2b76bd408ee90eaecef157f04aaed7fc705", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/bedc1c5743b7a39204eef6d2a6c1fd73f5df356e", + "reference": "bedc1c5743b7a39204eef6d2a6c1fd73f5df356e", "shasum": "" }, "require": { @@ -1394,7 +1394,6 @@ "phpunit/phpunit": "^8.5.38 || ^9.5", "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0" }, - "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -1458,7 +1457,7 @@ "type": "tidelift" } ], - "time": "2024-10-30T23:19:02+00:00" + "time": "2024-12-16T20:48:16+00:00" }, { "name": "doctrine/sql-formatter", @@ -1522,12 +1521,12 @@ "source": { "type": "git", "url": "https://github.com/EasyCorp/EasyAdminBundle.git", - "reference": "81e468dbe9690103328d069b43655183f3c0cb1f" + "reference": "c4d72d40a5da6cca67aa0e5dc6346a81d56d10b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/81e468dbe9690103328d069b43655183f3c0cb1f", - "reference": "81e468dbe9690103328d069b43655183f3c0cb1f", + "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/c4d72d40a5da6cca67aa0e5dc6346a81d56d10b4", + "reference": "c4d72d40a5da6cca67aa0e5dc6346a81d56d10b4", "shasum": "" }, "require": { @@ -1613,7 +1612,7 @@ "type": "github" } ], - "time": "2024-12-15T11:07:04+00:00" + "time": "2024-12-27T19:08:12+00:00" }, { "name": "egulias/email-validator", @@ -1621,12 +1620,12 @@ "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "87db43e4ffecdf458016e8c1b6d4801e872654bc" + "reference": "dcf8f79c410bb3906c915136369465bebead5990" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/87db43e4ffecdf458016e8c1b6d4801e872654bc", - "reference": "87db43e4ffecdf458016e8c1b6d4801e872654bc", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/dcf8f79c410bb3906c915136369465bebead5990", + "reference": "dcf8f79c410bb3906c915136369465bebead5990", "shasum": "" }, "require": { @@ -1681,7 +1680,7 @@ "type": "github" } ], - "time": "2024-10-16T21:10:38+00:00" + "time": "2024-12-27T22:41:39+00:00" }, { "name": "jblond/php-diff", @@ -1761,12 +1760,12 @@ "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "88365ec0a908702ae6dec328322d6666c9ceae0f" + "reference": "dfe07db97886facb6d9b93be98cb8ca26448e67f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/88365ec0a908702ae6dec328322d6666c9ceae0f", - "reference": "88365ec0a908702ae6dec328322d6666c9ceae0f", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/dfe07db97886facb6d9b93be98cb8ca26448e67f", + "reference": "dfe07db97886facb6d9b93be98cb8ca26448e67f", "shasum": "" }, "require": { @@ -1860,7 +1859,7 @@ "type": "tidelift" } ], - "time": "2024-12-10T13:07:29+00:00" + "time": "2024-12-29T14:14:05+00:00" }, { "name": "league/config", @@ -1947,16 +1946,16 @@ }, { "name": "meilisearch/meilisearch-php", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/meilisearch/meilisearch-php.git", - "reference": "4dd127cb87848f7a7b28e83bb355b4b86d329867" + "reference": "78879c29cb2eb1c9e3cf09707b87d8a369a4579d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/meilisearch/meilisearch-php/zipball/4dd127cb87848f7a7b28e83bb355b4b86d329867", - "reference": "4dd127cb87848f7a7b28e83bb355b4b86d329867", + "url": "https://api.github.com/repos/meilisearch/meilisearch-php/zipball/78879c29cb2eb1c9e3cf09707b87d8a369a4579d", + "reference": "78879c29cb2eb1c9e3cf09707b87d8a369a4579d", "shasum": "" }, "require": { @@ -1970,10 +1969,10 @@ "http-interop/http-factory-guzzle": "^1.2.0", "php-cs-fixer/shim": "^3.59.3", "phpstan/extension-installer": "^1.4.1", - "phpstan/phpstan": "^1.11.5", - "phpstan/phpstan-deprecation-rules": "^1.2.0", - "phpstan/phpstan-phpunit": "^1.4.0", - "phpstan/phpstan-strict-rules": "^1.6.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^9.5 || ^10.5" }, "suggest": { @@ -2008,9 +2007,9 @@ ], "support": { "issues": "https://github.com/meilisearch/meilisearch-php/issues", - "source": "https://github.com/meilisearch/meilisearch-php/tree/v1.11.0" + "source": "https://github.com/meilisearch/meilisearch-php/tree/v1.12.0" }, - "time": "2024-10-28T14:04:37+00:00" + "time": "2024-12-23T11:46:42+00:00" }, { "name": "meilisearch/search-bundle", @@ -2351,12 +2350,12 @@ "source": { "type": "git", "url": "https://github.com/Akollade/mjml-bundle.git", - "reference": "f5cebcce8b18f115d8f8aafeb87b0a1af9b2b066" + "reference": "cbc473a06ba0875900da78ca22c2e23e8c844986" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Akollade/mjml-bundle/zipball/f5cebcce8b18f115d8f8aafeb87b0a1af9b2b066", - "reference": "f5cebcce8b18f115d8f8aafeb87b0a1af9b2b066", + "url": "https://api.github.com/repos/Akollade/mjml-bundle/zipball/cbc473a06ba0875900da78ca22c2e23e8c844986", + "reference": "cbc473a06ba0875900da78ca22c2e23e8c844986", "shasum": "" }, "require": { @@ -2395,9 +2394,9 @@ ], "support": { "issues": "https://github.com/Akollade/mjml-bundle/issues", - "source": "https://github.com/Akollade/mjml-bundle/tree/main" + "source": "https://github.com/Akollade/mjml-bundle/tree/v3.8.5" }, - "time": "2024-12-11T11:24:33+00:00" + "time": "2024-12-20T08:11:57+00:00" }, { "name": "nyholm/psr7", @@ -2484,12 +2483,12 @@ "source": { "type": "git", "url": "https://github.com/openai-php/client.git", - "reference": "4a565d145e0fb3ea1baba8fffe39d86c56b6dc2c" + "reference": "17d1a23755886b5e1fcc030bec84ecb98e2cd6d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/openai-php/client/zipball/4a565d145e0fb3ea1baba8fffe39d86c56b6dc2c", - "reference": "4a565d145e0fb3ea1baba8fffe39d86c56b6dc2c", + "url": "https://api.github.com/repos/openai-php/client/zipball/17d1a23755886b5e1fcc030bec84ecb98e2cd6d9", + "reference": "17d1a23755886b5e1fcc030bec84ecb98e2cd6d9", "shasum": "" }, "require": { @@ -2552,7 +2551,7 @@ ], "support": { "issues": "https://github.com/openai-php/client/issues", - "source": "https://github.com/openai-php/client/tree/v0.10.3" + "source": "https://github.com/openai-php/client/tree/main" }, "funding": [ { @@ -2568,7 +2567,7 @@ "type": "github" } ], - "time": "2024-11-12T20:51:16+00:00" + "time": "2024-12-22T14:38:20+00:00" }, { "name": "oro/doctrine-extensions", @@ -3724,12 +3723,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/asset-mapper.git", - "reference": "df9a4f9cd7d6d78ad38b515c08478f6da7bbce9d" + "reference": "bc4cdc36fe21396db3137264dd603d6c4bfb7008" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/df9a4f9cd7d6d78ad38b515c08478f6da7bbce9d", - "reference": "df9a4f9cd7d6d78ad38b515c08478f6da7bbce9d", + "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/bc4cdc36fe21396db3137264dd603d6c4bfb7008", + "reference": "bc4cdc36fe21396db3137264dd603d6c4bfb7008", "shasum": "" }, "require": { @@ -3796,7 +3795,7 @@ "type": "tidelift" } ], - "time": "2024-12-14T16:08:18+00:00" + "time": "2024-12-18T08:37:39+00:00" }, { "name": "symfony/cache", @@ -3804,12 +3803,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "916032b874b9881c6b91cf9ab05c2cb60459156d" + "reference": "e0b48c8319d6ba614ddcc920c2979d09f75f41e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/916032b874b9881c6b91cf9ab05c2cb60459156d", - "reference": "916032b874b9881c6b91cf9ab05c2cb60459156d", + "url": "https://api.github.com/repos/symfony/cache/zipball/e0b48c8319d6ba614ddcc920c2979d09f75f41e8", + "reference": "e0b48c8319d6ba614ddcc920c2979d09f75f41e8", "shasum": "" }, "require": { @@ -3894,7 +3893,7 @@ "type": "tidelift" } ], - "time": "2024-12-12T06:45:37+00:00" + "time": "2024-12-21T15:46:09+00:00" }, { "name": "symfony/cache-contracts", @@ -3917,12 +3916,12 @@ "default-branch": true, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.6-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -4315,12 +4314,12 @@ "default-branch": true, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.6-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -4369,12 +4368,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "5f8c317a0f3539b7e2f12d50248fff7db93443f2" + "reference": "299f44d7bea798830214a3ef3136a25ec7d29216" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/5f8c317a0f3539b7e2f12d50248fff7db93443f2", - "reference": "5f8c317a0f3539b7e2f12d50248fff7db93443f2", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/299f44d7bea798830214a3ef3136a25ec7d29216", + "reference": "299f44d7bea798830214a3ef3136a25ec7d29216", "shasum": "" }, "require": { @@ -4470,7 +4469,7 @@ "type": "tidelift" } ], - "time": "2024-12-12T06:45:37+00:00" + "time": "2024-12-19T14:34:50+00:00" }, { "name": "symfony/doctrine-messenger", @@ -4794,12 +4793,12 @@ "default-branch": true, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.6-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -5152,12 +5151,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "06e1348872bae94fff34a6f231822b3cf697f492" + "reference": "63ae3072686697ea6a85fa88af87f5da91be9b99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/06e1348872bae94fff34a6f231822b3cf697f492", - "reference": "06e1348872bae94fff34a6f231822b3cf697f492", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/63ae3072686697ea6a85fa88af87f5da91be9b99", + "reference": "63ae3072686697ea6a85fa88af87f5da91be9b99", "shasum": "" }, "require": { @@ -5172,7 +5171,7 @@ "symfony/event-dispatcher": "^6.4|^7.0", "symfony/filesystem": "^7.1", "symfony/finder": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-foundation": "^7.3", "symfony/http-kernel": "^7.2", "symfony/polyfill-mbstring": "~1.0", "symfony/routing": "^6.4|^7.0" @@ -5296,7 +5295,7 @@ "type": "tidelift" } ], - "time": "2024-12-12T15:16:25+00:00" + "time": "2024-12-21T15:33:15+00:00" }, { "name": "symfony/http-client", @@ -5478,12 +5477,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "c2508e48b252f02b1364980ff79fb168a074e199" + "reference": "9e485dd3094b0bcf2d9cd9f9b822ef7ebc0e5dbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/c2508e48b252f02b1364980ff79fb168a074e199", - "reference": "c2508e48b252f02b1364980ff79fb168a074e199", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9e485dd3094b0bcf2d9cd9f9b822ef7ebc0e5dbc", + "reference": "9e485dd3094b0bcf2d9cd9f9b822ef7ebc0e5dbc", "shasum": "" }, "require": { @@ -5548,7 +5547,7 @@ "type": "tidelift" } ], - "time": "2024-12-12T06:45:37+00:00" + "time": "2024-12-14T10:46:23+00:00" }, { "name": "symfony/http-kernel", @@ -5556,12 +5555,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "406c453966dc1420d8b19ff45007bac8a51d401c" + "reference": "9330977b6a5f87cafaab051c71796494ef13752c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/406c453966dc1420d8b19ff45007bac8a51d401c", - "reference": "406c453966dc1420d8b19ff45007bac8a51d401c", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9330977b6a5f87cafaab051c71796494ef13752c", + "reference": "9330977b6a5f87cafaab051c71796494ef13752c", "shasum": "" }, "require": { @@ -5570,7 +5569,7 @@ "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-foundation": "^7.3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -5662,7 +5661,7 @@ "type": "tidelift" } ], - "time": "2024-12-12T06:45:37+00:00" + "time": "2024-12-19T14:34:50+00:00" }, { "name": "symfony/intl", @@ -6316,12 +6315,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/notifier.git", - "reference": "b5104341c0b0d78fe2cfc8a7a0a185d544ee5c1c" + "reference": "217ed655e0e399fe0487e3d5c3a5099b5f8e1ef4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/notifier/zipball/b5104341c0b0d78fe2cfc8a7a0a185d544ee5c1c", - "reference": "b5104341c0b0d78fe2cfc8a7a0a185d544ee5c1c", + "url": "https://api.github.com/repos/symfony/notifier/zipball/217ed655e0e399fe0487e3d5c3a5099b5f8e1ef4", + "reference": "217ed655e0e399fe0487e3d5c3a5099b5f8e1ef4", "shasum": "" }, "require": { @@ -6370,7 +6369,7 @@ "notifier" ], "support": { - "source": "https://github.com/symfony/notifier/tree/v7.2.0" + "source": "https://github.com/symfony/notifier/tree/7.3" }, "funding": [ { @@ -6386,7 +6385,7 @@ "type": "tidelift" } ], - "time": "2024-11-15T13:52:25+00:00" + "time": "2024-12-18T08:31:59+00:00" }, { "name": "symfony/options-resolver", @@ -6612,12 +6611,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "73069150fec16f319d59283e3b223bfc2f413fee" + "reference": "763d2a91fea5681509ca01acbc1c5e450d127811" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/73069150fec16f319d59283e3b223bfc2f413fee", - "reference": "73069150fec16f319d59283e3b223bfc2f413fee", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/763d2a91fea5681509ca01acbc1c5e450d127811", + "reference": "763d2a91fea5681509ca01acbc1c5e450d127811", "shasum": "" }, "require": { @@ -6630,8 +6629,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -6689,7 +6688,7 @@ "type": "tidelift" } ], - "time": "2024-09-18T09:52:53+00:00" + "time": "2024-12-21T18:38:29+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -6863,15 +6862,16 @@ "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2369cb908b33d7b7518cce042615de430142497f" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2369cb908b33d7b7518cce042615de430142497f", - "reference": "2369cb908b33d7b7518cce042615de430142497f", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, "provide": { @@ -6936,7 +6936,7 @@ "type": "tidelift" } ], - "time": "2024-09-10T14:38:51+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { "name": "symfony/polyfill-php84", @@ -6944,12 +6944,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "48e55b8ecb3a52432be17bcac66eaaa3c3336f68" + "reference": "6f7d7d5d6fba86c59105abea438b6459e567f64f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/48e55b8ecb3a52432be17bcac66eaaa3c3336f68", - "reference": "48e55b8ecb3a52432be17bcac66eaaa3c3336f68", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/6f7d7d5d6fba86c59105abea438b6459e567f64f", + "reference": "6f7d7d5d6fba86c59105abea438b6459e567f64f", "shasum": "" }, "require": { @@ -7013,7 +7013,7 @@ "type": "tidelift" } ], - "time": "2024-09-10T14:38:51+00:00" + "time": "2024-12-21T18:37:24+00:00" }, { "name": "symfony/polyfill-uuid", @@ -7238,12 +7238,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "0f06ce4cbb81ea8b184e8d645d936eb1a2fccd18" + "reference": "37f1de9a30e736c1c7bea4113077b0ff54041ff2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/0f06ce4cbb81ea8b184e8d645d936eb1a2fccd18", - "reference": "0f06ce4cbb81ea8b184e8d645d936eb1a2fccd18", + "url": "https://api.github.com/repos/symfony/property-info/zipball/37f1de9a30e736c1c7bea4113077b0ff54041ff2", + "reference": "37f1de9a30e736c1c7bea4113077b0ff54041ff2", "shasum": "" }, "require": { @@ -7313,7 +7313,7 @@ "type": "tidelift" } ], - "time": "2024-12-14T16:08:18+00:00" + "time": "2024-12-17T12:08:08+00:00" }, { "name": "symfony/redis-messenger", @@ -7548,12 +7548,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "f3e75ef04ca541ca46fc31030c8f01f9c9215964" + "reference": "9c234fd0d6d413b6092c99f053c82fc68cc1f175" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/f3e75ef04ca541ca46fc31030c8f01f9c9215964", - "reference": "f3e75ef04ca541ca46fc31030c8f01f9c9215964", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/9c234fd0d6d413b6092c99f053c82fc68cc1f175", + "reference": "9c234fd0d6d413b6092c99f053c82fc68cc1f175", "shasum": "" }, "require": { @@ -7646,7 +7646,7 @@ "type": "tidelift" } ], - "time": "2024-12-15T10:51:57+00:00" + "time": "2024-12-18T14:02:41+00:00" }, { "name": "symfony/security-core", @@ -8016,12 +8016,12 @@ "default-branch": true, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.6-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -8300,12 +8300,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "dc89e16b44048ceecc879054e5b7f38326ab6cc5" + "reference": "e2674a30132b7cc4d74540d6c2573aa363f05923" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/dc89e16b44048ceecc879054e5b7f38326ab6cc5", - "reference": "dc89e16b44048ceecc879054e5b7f38326ab6cc5", + "url": "https://api.github.com/repos/symfony/translation/zipball/e2674a30132b7cc4d74540d6c2573aa363f05923", + "reference": "e2674a30132b7cc4d74540d6c2573aa363f05923", "shasum": "" }, "require": { @@ -8371,7 +8371,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.2.0" + "source": "https://github.com/symfony/translation/tree/7.2" }, "funding": [ { @@ -8387,7 +8387,7 @@ "type": "tidelift" } ], - "time": "2024-11-12T20:47:56+00:00" + "time": "2024-12-07T08:18:10+00:00" }, { "name": "symfony/translation-contracts", @@ -8409,12 +8409,12 @@ "default-branch": true, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.6-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -8474,12 +8474,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "d5cdf4d59da5ab44ebd7503480c22d8235887de0" + "reference": "9a7310e5b7950f172a07199187485d8c07035d3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/d5cdf4d59da5ab44ebd7503480c22d8235887de0", - "reference": "d5cdf4d59da5ab44ebd7503480c22d8235887de0", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/9a7310e5b7950f172a07199187485d8c07035d3f", + "reference": "9a7310e5b7950f172a07199187485d8c07035d3f", "shasum": "" }, "require": { @@ -8513,7 +8513,7 @@ "symfony/finder": "^6.4|^7.0", "symfony/form": "^6.4|^7.0", "symfony/html-sanitizer": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-foundation": "^7.3", "symfony/http-kernel": "^6.4|^7.0", "symfony/intl": "^6.4|^7.0", "symfony/mime": "^6.4|^7.0", @@ -8560,7 +8560,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/7.2" + "source": "https://github.com/symfony/twig-bridge/tree/7.3" }, "funding": [ { @@ -8576,7 +8576,7 @@ "type": "tidelift" } ], - "time": "2024-12-07T09:50:32+00:00" + "time": "2024-12-22T13:04:21+00:00" }, { "name": "symfony/twig-bundle", @@ -8668,12 +8668,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "73b998e2af1e47ad6a564559dfa2c74600331379" + "reference": "5ffb87d2c05861d7c667542269304a7882e22179" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/73b998e2af1e47ad6a564559dfa2c74600331379", - "reference": "73b998e2af1e47ad6a564559dfa2c74600331379", + "url": "https://api.github.com/repos/symfony/type-info/zipball/5ffb87d2c05861d7c667542269304a7882e22179", + "reference": "5ffb87d2c05861d7c667542269304a7882e22179", "shasum": "" }, "require": { @@ -8719,7 +8719,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/7.2" + "source": "https://github.com/symfony/type-info/tree/7.3" }, "funding": [ { @@ -8735,7 +8735,7 @@ "type": "tidelift" } ], - "time": "2024-12-11T15:34:14+00:00" + "time": "2024-12-28T08:42:15+00:00" }, { "name": "symfony/uid", @@ -8898,12 +8898,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-live-component.git", - "reference": "c79661f127496b2243b6420184b150810351ffcb" + "reference": "3fedfd9e1d96af5b2b5089123e27b0d71482dc7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-live-component/zipball/c79661f127496b2243b6420184b150810351ffcb", - "reference": "c79661f127496b2243b6420184b150810351ffcb", + "url": "https://api.github.com/repos/symfony/ux-live-component/zipball/3fedfd9e1d96af5b2b5089123e27b0d71482dc7e", + "reference": "3fedfd9e1d96af5b2b5089123e27b0d71482dc7e", "shasum": "" }, "require": { @@ -8985,7 +8985,7 @@ "type": "tidelift" } ], - "time": "2024-12-11T00:38:37+00:00" + "time": "2024-12-24T05:27:07+00:00" }, { "name": "symfony/ux-turbo", @@ -9092,12 +9092,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-twig-component.git", - "reference": "e91b59107feb9fd297623bec5f353021ebc45c2e" + "reference": "38d07b67a32fcd3e4c21a8bace22ef1f7b8b6187" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/e91b59107feb9fd297623bec5f353021ebc45c2e", - "reference": "e91b59107feb9fd297623bec5f353021ebc45c2e", + "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/38d07b67a32fcd3e4c21a8bace22ef1f7b8b6187", + "reference": "38d07b67a32fcd3e4c21a8bace22ef1f7b8b6187", "shasum": "" }, "require": { @@ -9168,7 +9168,7 @@ "type": "tidelift" } ], - "time": "2024-12-11T00:55:08+00:00" + "time": "2024-12-24T05:28:13+00:00" }, { "name": "symfony/validator", @@ -9176,12 +9176,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "6036f24941aa2f5bc6d2cf274f04521273485dec" + "reference": "bf859ce6bdb96796a5a41265c3714f60c5025067" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/6036f24941aa2f5bc6d2cf274f04521273485dec", - "reference": "6036f24941aa2f5bc6d2cf274f04521273485dec", + "url": "https://api.github.com/repos/symfony/validator/zipball/bf859ce6bdb96796a5a41265c3714f60c5025067", + "reference": "bf859ce6bdb96796a5a41265c3714f60c5025067", "shasum": "" }, "require": { @@ -9265,7 +9265,7 @@ "type": "tidelift" } ], - "time": "2024-12-12T06:45:37+00:00" + "time": "2024-12-29T13:01:23+00:00" }, { "name": "symfony/var-dumper", @@ -9515,12 +9515,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "7a9c072bdb56cd0c3e95993f67abc3dc923dc267" + "reference": "f5fa82bee4c3dfbe96612b488713e5129687e9d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/7a9c072bdb56cd0c3e95993f67abc3dc923dc267", - "reference": "7a9c072bdb56cd0c3e95993f67abc3dc923dc267", + "url": "https://api.github.com/repos/symfony/yaml/zipball/f5fa82bee4c3dfbe96612b488713e5129687e9d0", + "reference": "f5fa82bee4c3dfbe96612b488713e5129687e9d0", "shasum": "" }, "require": { @@ -9579,7 +9579,7 @@ "type": "tidelift" } ], - "time": "2024-12-14T16:08:18+00:00" + "time": "2024-12-29T21:06:05+00:00" }, { "name": "symfonycasts/sass-bundle", @@ -9643,12 +9643,12 @@ "source": { "type": "git", "url": "https://github.com/twbs/bootstrap.git", - "reference": "a353ed4b19a6849d021aa23b4bd6395f6bf3c2bb" + "reference": "0cbfe13adf669ad39ae9d8e873c2ad59befd3a3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twbs/bootstrap/zipball/a353ed4b19a6849d021aa23b4bd6395f6bf3c2bb", - "reference": "a353ed4b19a6849d021aa23b4bd6395f6bf3c2bb", + "url": "https://api.github.com/repos/twbs/bootstrap/zipball/0cbfe13adf669ad39ae9d8e873c2ad59befd3a3a", + "reference": "0cbfe13adf669ad39ae9d8e873c2ad59befd3a3a", "shasum": "" }, "replace": { @@ -9686,7 +9686,7 @@ "issues": "https://github.com/twbs/bootstrap/issues", "source": "https://github.com/twbs/bootstrap/tree/main" }, - "time": "2024-12-16T09:19:39+00:00" + "time": "2024-12-19T07:23:57+00:00" }, { "name": "twig/extra-bundle", @@ -9749,7 +9749,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.17.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.18.0" }, "funding": [ { @@ -9822,7 +9822,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/markdown-extra/tree/v3.17.0" + "source": "https://github.com/twigphp/markdown-extra/tree/v3.18.0" }, "funding": [ { @@ -9890,7 +9890,7 @@ "unicode" ], "support": { - "source": "https://github.com/twigphp/string-extra/tree/v3.17.0" + "source": "https://github.com/twigphp/string-extra/tree/v3.18.0" }, "funding": [ { @@ -9910,12 +9910,12 @@ "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "918f52e818f7c56e90ec462ae90b230da244a7ed" + "reference": "d184e9fe12e1a8d219a95638ee78ad577a59e299" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/918f52e818f7c56e90ec462ae90b230da244a7ed", - "reference": "918f52e818f7c56e90ec462ae90b230da244a7ed", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/d184e9fe12e1a8d219a95638ee78ad577a59e299", + "reference": "d184e9fe12e1a8d219a95638ee78ad577a59e299", "shasum": "" }, "require": { @@ -9983,7 +9983,7 @@ "type": "tidelift" } ], - "time": "2024-12-14T19:06:36+00:00" + "time": "2024-12-29T10:52:41+00:00" }, { "name": "webmozart/assert", @@ -10046,32 +10046,35 @@ ], "packages-dev": [ { - "name": "clue/ndjson-react", - "version": "1.x-dev", + "name": "masterminds/html5", + "version": "2.9.0", "source": { "type": "git", - "url": "https://github.com/clue/reactphp-ndjson.git", - "reference": "8fc557eaa902e4f1de171b5b4eaa6246fbe4118e" + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/8fc557eaa902e4f1de171b5b4eaa6246fbe4118e", - "reference": "8fc557eaa902e4f1de171b5b4eaa6246fbe4118e", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", "shasum": "" }, "require": { - "php": ">=5.3", - "react/stream": "^1.2" + "ext-dom": "*", + "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/event-loop": "^1.2" + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" }, - "default-branch": true, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, "autoload": { "psr-4": { - "Clue\\React\\NDJson\\": "src/" + "Masterminds\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -10080,362 +10083,304 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering" + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" } ], - "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", - "homepage": "https://github.com/clue/reactphp-ndjson", + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", "keywords": [ - "NDJSON", - "json", - "jsonlines", - "newline", - "reactphp", - "streaming" + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" ], "support": { - "issues": "https://github.com/clue/reactphp-ndjson/issues", - "source": "https://github.com/clue/reactphp-ndjson/tree/1.x" + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" }, - "funding": [ - { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2023-11-24T09:04:50+00:00" + "time": "2024-03-31T07:05:07+00:00" }, { - "name": "composer/pcre", - "version": "dev-main", + "name": "myclabs/deep-copy", + "version": "1.x-dev", "source": { "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "deb3871d20d5012eb5faa5a9caa71c44f151db49" + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "4764e040f8743e92b86c36f488f32d0265dd1dae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/deb3871d20d5012eb5faa5a9caa71c44f151db49", - "reference": "deb3871d20d5012eb5faa5a9caa71c44f151db49", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/4764e040f8743e92b86c36f488f32d0265dd1dae", + "reference": "4764e040f8743e92b86c36f488f32d0265dd1dae", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "php": "^7.1 || ^8.0" }, "conflict": { - "phpstan/phpstan": "<1.11.10" + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { - "phpstan/phpstan": "^1.12 || ^2", - "phpstan/phpstan-deprecation-rules": "^1 || ^2", - "phpstan/phpstan-strict-rules": "^1 || ^2", - "phpunit/phpunit": "^8 || ^9" + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "default-branch": true, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - } - }, "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], "psr-4": { - "Composer\\Pcre\\": "src" + "DeepCopy\\": "src/DeepCopy/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "description": "Create deep copies (clones) of your objects", "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" + "clone", + "copy", + "duplicate", + "object", + "object graph" ], "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/main" + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.x" }, "funding": [ { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", "type": "tidelift" } ], - "time": "2024-11-20T09:10:58+00:00" + "time": "2024-11-26T13:04:49+00:00" }, { - "name": "composer/xdebug-handler", - "version": "3.0.5", + "name": "nikic/php-parser", + "version": "v5.3.1", "source": { "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", "shasum": "" }, "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" }, "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" }, + "bin": [ + "bin/php-parse" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, "autoload": { "psr-4": { - "Composer\\XdebugHandler\\": "src" + "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" + "name": "Nikita Popov" } ], - "description": "Restarts a process without Xdebug.", + "description": "A PHP parser written in PHP", "keywords": [ - "Xdebug", - "performance" + "parser", + "php" ], "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-05-06T16:37:16+00:00" + "time": "2024-10-08T18:51:32+00:00" }, { - "name": "evenement/evenement", - "version": "v3.0.2", + "name": "phar-io/manifest", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/igorw/evenement.git", - "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", - "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^9 || ^6" + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" }, + "default-branch": true, "type": "library", - "autoload": { - "psr-4": { - "Evenement\\": "src/" + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" } }, + "autoload": { + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "description": "Événement is a very simple event dispatching library for PHP", - "keywords": [ - "event-dispatcher", - "event-emitter" - ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { - "issues": "https://github.com/igorw/evenement/issues", - "source": "https://github.com/igorw/evenement/tree/v3.0.2" + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2023-08-08T05:53:35+00:00" - }, - { - "name": "fidry/cpu-core-counter", - "version": "1.2.0", + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", "source": { "type": "git", - "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "8520451a140d3f46ac33042715115e290cf5785f" + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", - "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, - "require-dev": { - "fidry/makefile": "^0.2.0", - "fidry/php-cs-fixer-config": "^1.1.2", - "phpstan/extension-installer": "^1.2.0", - "phpstan/phpstan": "^1.9.2", - "phpstan/phpstan-deprecation-rules": "^1.0.0", - "phpstan/phpstan-phpunit": "^1.2.2", - "phpstan/phpstan-strict-rules": "^1.4.4", - "phpunit/phpunit": "^8.5.31 || ^9.5.26", - "webmozarts/strict-phpunit": "^7.5" - }, "type": "library", "autoload": { - "psr-4": { - "Fidry\\CpuCoreCounter\\": "src/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Théo FIDRY", - "email": "theo.fidry@gmail.com" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "description": "Tiny utility to get the number of CPU cores.", - "keywords": [ - "CPU", - "core" - ], + "description": "Library for handling version information and constraints", "support": { - "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "funding": [ - { - "url": "https://github.com/theofidry", - "type": "github" - } - ], - "time": "2024-08-06T10:04:20+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { - "name": "friendsofphp/php-cs-fixer", - "version": "dev-master", + "name": "php-cs-fixer/shim", + "version": "v3.66.0", "source": { "type": "git", - "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "a3726ef887235d7cd7457991935b5ddfc6a3a7fd" + "url": "https://github.com/PHP-CS-Fixer/shim.git", + "reference": "6824b91b16d2e123afed9bf9c96ec283882346c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a3726ef887235d7cd7457991935b5ddfc6a3a7fd", - "reference": "a3726ef887235d7cd7457991935b5ddfc6a3a7fd", + "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/6824b91b16d2e123afed9bf9c96ec283882346c9", + "reference": "6824b91b16d2e123afed9bf9c96ec283882346c9", "shasum": "" }, "require": { - "clue/ndjson-react": "^1.0", - "composer/semver": "^3.4", - "composer/xdebug-handler": "^3.0.3", - "ext-filter": "*", "ext-json": "*", "ext-tokenizer": "*", - "fidry/cpu-core-counter": "^1.2", - "php": "^7.4 || ^8.0", - "react/child-process": "^0.6.5", - "react/event-loop": "^1.0", - "react/promise": "^2.0 || ^3.0", - "react/socket": "^1.0", - "react/stream": "^1.0", - "sebastian/diff": "^4.0 || ^5.0 || ^6.0", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", - "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", - "symfony/finder": "^5.4 || ^6.0 || ^7.0", - "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", - "symfony/polyfill-mbstring": "^1.28", - "symfony/polyfill-php80": "^1.28", - "symfony/polyfill-php81": "^1.28", - "symfony/process": "^5.4 || ^6.0 || ^7.0", - "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" - }, - "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.4", - "infection/infection": "^0.29.8", - "justinrainbow/json-schema": "^5.3 || ^6.0", - "keradus/cli-executor": "^2.1", - "mikey179/vfsstream": "^1.6.12", - "php-coveralls/php-coveralls": "^2.7", - "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", - "phpunit/phpunit": "^9.6.21 || ^10.5.38 || ^11.4.3", - "symfony/var-dumper": "^5.4.47 || ^6.4.15 || ^7.1.8", - "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.1.6" + "php": "^7.4 || ^8.0" + }, + "replace": { + "friendsofphp/php-cs-fixer": "self.version" }, "suggest": { "ext-dom": "For handling output formats in XML", "ext-mbstring": "For handling non-UTF8 characters." }, - "default-branch": true, "bin": [ - "php-cs-fixer" + "php-cs-fixer", + "php-cs-fixer.phar" ], "type": "application", - "autoload": { - "psr-4": { - "PhpCsFixer\\": "src/" - }, - "exclude-from-classmap": [ - "src/Fixer/Internal/*" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -10451,1132 +10396,345 @@ } ], "description": "A tool to automatically fix PHP code style", - "keywords": [ - "Static code analysis", - "fixer", - "standards", - "static analysis" - ], "support": { - "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/master" + "issues": "https://github.com/PHP-CS-Fixer/shim/issues", + "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.66.0" }, - "funding": [ - { - "url": "https://github.com/keradus", - "type": "github" - } - ], - "time": "2024-12-10T10:53:16+00:00" + "time": "2024-12-29T13:46:48+00:00" }, { - "name": "masterminds/html5", - "version": "2.9.0", + "name": "phpstan/extension-installer", + "version": "1.4.x-dev", "source": { "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "e7bd2bf9662c96368303a284be3f2079e204b341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/e7bd2bf9662c96368303a284be3f2079e204b341", + "reference": "e7bd2bf9662c96368303a284be3f2079e204b341", "shasum": "" }, "require": { - "ext-dom": "*", - "php": ">=5.3.0" + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.12.0 || ^2.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" }, - "type": "library", + "default-branch": true, + "type": "composer-plugin", "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } + "class": "PHPStan\\ExtensionInstaller\\Plugin" }, "autoload": { "psr-4": { - "Masterminds\\": "src" + "PHPStan\\ExtensionInstaller\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Matt Butcher", - "email": "technosophos@gmail.com" - }, - { - "name": "Matt Farina", - "email": "matt@mattfarina.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - } - ], - "description": "An HTML5 parser and serializer.", - "homepage": "http://masterminds.github.io/html5-php", + "description": "Composer plugin for automatic installation of PHPStan extensions", "keywords": [ - "HTML5", - "dom", - "html", - "parser", - "querypath", - "serializer", - "xml" + "dev", + "static analysis" ], "support": { - "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.4.x" }, - "time": "2024-03-31T07:05:07+00:00" + "time": "2024-09-06T14:27:20+00:00" }, { - "name": "myclabs/deep-copy", - "version": "1.x-dev", + "name": "phpstan/phpstan", + "version": "2.0.x-dev", "source": { "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "4764e040f8743e92b86c36f488f32d0265dd1dae" + "url": "https://github.com/phpstan/phpstan.git", + "reference": "87f4671b7d0d5d1b872dea26c46a92546b09f656" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/4764e040f8743e92b86c36f488f32d0265dd1dae", - "reference": "4764e040f8743e92b86c36f488f32d0265dd1dae", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/87f4671b7d0d5d1b872dea26c46a92546b09f656", + "reference": "87f4671b7d0d5d1b872dea26c46a92546b09f656", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^7.4|^8.0" }, "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + "phpstan/phpstan-shim": "*" }, "default-branch": true, + "bin": [ + "phpstan", + "phpstan.phar" + ], "type": "library", "autoload": { "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } + "bootstrap.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Create deep copies (clones) of your objects", + "description": "PHPStan - PHP Static Analysis Tool", "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" + "dev", + "static analysis" ], "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.x" + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" }, "funding": [ { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" } ], - "time": "2024-11-26T13:04:49+00:00" + "time": "2024-12-21T14:52:04+00:00" }, { - "name": "nikic/php-parser", - "version": "v5.3.1", + "name": "phpstan/phpstan-doctrine", + "version": "2.0.x-dev", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" + "url": "https://github.com/phpstan/phpstan-doctrine.git", + "reference": "bdb6a835c5aa9725979694ae9b70591e180f4853" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", - "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", + "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/bdb6a835c5aa9725979694ae9b70591e180f4853", + "reference": "bdb6a835c5aa9725979694ae9b70591e180f4853", "shasum": "" }, "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "php": ">=7.4" + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.0.3" + }, + "conflict": { + "doctrine/collections": "<1.0", + "doctrine/common": "<2.7", + "doctrine/mongodb-odm": "<1.2", + "doctrine/orm": "<2.5", + "doctrine/persistence": "<1.3" }, "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" + "cache/array-adapter": "^1.1", + "composer/semver": "^3.3.2", + "cweagans/composer-patches": "^1.7.3", + "doctrine/annotations": "^2.0", + "doctrine/collections": "^1.6 || ^2.1", + "doctrine/common": "^2.7 || ^3.0", + "doctrine/dbal": "^3.3.8", + "doctrine/lexer": "^2.0 || ^3.0", + "doctrine/mongodb-odm": "^2.4.3", + "doctrine/orm": "^2.16.0", + "doctrine/persistence": "^2.2.1 || ^3.2", + "gedmo/doctrine-extensions": "^3.8", + "nesbot/carbon": "^2.49", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6.20", + "ramsey/uuid": "^4.2", + "symfony/cache": "^5.4" }, - "bin": [ - "bin/php-parse" - ], - "type": "library", + "default-branch": true, + "type": "phpstan-extension", "extra": { - "branch-alias": { - "dev-master": "5.0-dev" + "phpstan": { + "includes": [ + "extension.neon", + "rules.neon" + ] } }, "autoload": { "psr-4": { - "PhpParser\\": "lib/PhpParser" + "PHPStan\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" - }, - "time": "2024-10-08T18:51:32+00:00" - }, - { - "name": "phar-io/manifest", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpstan/extension-installer", - "version": "1.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/phpstan/extension-installer.git", - "reference": "e7bd2bf9662c96368303a284be3f2079e204b341" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/e7bd2bf9662c96368303a284be3f2079e204b341", - "reference": "e7bd2bf9662c96368303a284be3f2079e204b341", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^2.0", - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.12.0 || ^2.0" - }, - "require-dev": { - "composer/composer": "^2.0", - "php-parallel-lint/php-parallel-lint": "^1.2.0", - "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" - }, - "default-branch": true, - "type": "composer-plugin", - "extra": { - "class": "PHPStan\\ExtensionInstaller\\Plugin" - }, - "autoload": { - "psr-4": { - "PHPStan\\ExtensionInstaller\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Composer plugin for automatic installation of PHPStan extensions", - "keywords": [ - "dev", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpstan/extension-installer/issues", - "source": "https://github.com/phpstan/extension-installer/tree/1.4.x" - }, - "time": "2024-09-06T14:27:20+00:00" - }, - { - "name": "phpstan/phpstan", - "version": "2.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "549528309e8a7e214f0af2aeb385499fec1b31bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/549528309e8a7e214f0af2aeb385499fec1b31bb", - "reference": "549528309e8a7e214f0af2aeb385499fec1b31bb", - "shasum": "" - }, - "require": { - "php": "^7.4|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "default-branch": true, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan - PHP Static Analysis Tool", - "keywords": [ - "dev", - "static analysis" + "MIT" ], + "description": "Doctrine extensions for PHPStan", "support": { - "docs": "https://phpstan.org/user-guide/getting-started", - "forum": "https://github.com/phpstan/phpstan/discussions", - "issues": "https://github.com/phpstan/phpstan/issues", - "security": "https://github.com/phpstan/phpstan/security/policy", - "source": "https://github.com/phpstan/phpstan-src" + "issues": "https://github.com/phpstan/phpstan-doctrine/issues", + "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.1" }, - "funding": [ - { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://github.com/phpstan", - "type": "github" - } - ], - "time": "2024-12-16T13:24:01+00:00" + "time": "2024-12-02T16:48:00+00:00" }, { - "name": "phpstan/phpstan-doctrine", + "name": "phpstan/phpstan-phpunit", "version": "2.0.x-dev", "source": { "type": "git", - "url": "https://github.com/phpstan/phpstan-doctrine.git", - "reference": "bdb6a835c5aa9725979694ae9b70591e180f4853" + "url": "https://github.com/phpstan/phpstan-phpunit.git", + "reference": "e32ac656788a5bf3dedda89e6a2cad5643bf1a18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/bdb6a835c5aa9725979694ae9b70591e180f4853", - "reference": "bdb6a835c5aa9725979694ae9b70591e180f4853", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/e32ac656788a5bf3dedda89e6a2cad5643bf1a18", + "reference": "e32ac656788a5bf3dedda89e6a2cad5643bf1a18", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.0.3" + "phpstan/phpstan": "^2.0.4" }, "conflict": { - "doctrine/collections": "<1.0", - "doctrine/common": "<2.7", - "doctrine/mongodb-odm": "<1.2", - "doctrine/orm": "<2.5", - "doctrine/persistence": "<1.3" + "phpunit/phpunit": "<7.0" }, "require-dev": { - "cache/array-adapter": "^1.1", - "composer/semver": "^3.3.2", - "cweagans/composer-patches": "^1.7.3", - "doctrine/annotations": "^2.0", - "doctrine/collections": "^1.6 || ^2.1", - "doctrine/common": "^2.7 || ^3.0", - "doctrine/dbal": "^3.3.8", - "doctrine/lexer": "^2.0 || ^3.0", - "doctrine/mongodb-odm": "^2.4.3", - "doctrine/orm": "^2.16.0", - "doctrine/persistence": "^2.2.1 || ^3.2", - "gedmo/doctrine-extensions": "^3.8", - "nesbot/carbon": "^2.49", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-phpunit": "^2.0", - "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^9.6.20", - "ramsey/uuid": "^4.2", - "symfony/cache": "^5.4" - }, - "default-branch": true, - "type": "phpstan-extension", - "extra": { - "phpstan": { - "includes": [ - "extension.neon", - "rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Doctrine extensions for PHPStan", - "support": { - "issues": "https://github.com/phpstan/phpstan-doctrine/issues", - "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.1" - }, - "time": "2024-12-02T16:48:00+00:00" - }, - { - "name": "phpstan/phpstan-phpunit", - "version": "2.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "4b6ad7fab8683ff4efd7887ba26ef8ee171c7475" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/4b6ad7fab8683ff4efd7887ba26ef8ee171c7475", - "reference": "4b6ad7fab8683ff4efd7887ba26ef8ee171c7475", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.0" - }, - "conflict": { - "phpunit/phpunit": "<7.0" - }, - "require-dev": { - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^9.6" - }, - "default-branch": true, - "type": "phpstan-extension", - "extra": { - "phpstan": { - "includes": [ - "extension.neon", - "rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPUnit extensions and rules for PHPStan", - "support": { - "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.1" - }, - "time": "2024-11-12T12:48:00+00:00" - }, - { - "name": "phpstan/phpstan-strict-rules", - "version": "2.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "ed6fea0ad4ad9c7e25f3ad2e7c4d420cf1e67fe3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/ed6fea0ad4ad9c7e25f3ad2e7c4d420cf1e67fe3", - "reference": "ed6fea0ad4ad9c7e25f3ad2e7c4d420cf1e67fe3", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.0.4" - }, - "require-dev": { - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-deprecation-rules": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpunit/phpunit": "^9.6" - }, - "default-branch": true, - "type": "phpstan-extension", - "extra": { - "phpstan": { - "includes": [ - "rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Extra strict and opinionated rules for PHPStan", - "support": { - "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.x" - }, - "time": "2024-12-12T20:21:10+00:00" - }, - { - "name": "phpstan/phpstan-symfony", - "version": "2.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "1ef4dce2baabd464c2dd3109d051bad94efa1e79" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/1ef4dce2baabd464c2dd3109d051bad94efa1e79", - "reference": "1ef4dce2baabd464c2dd3109d051bad94efa1e79", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.0" - }, - "conflict": { - "symfony/framework-bundle": "<3.0" - }, - "require-dev": { - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-phpunit": "^2.0", - "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^9.6", - "psr/container": "1.0 || 1.1.1", - "symfony/config": "^5.4 || ^6.1", - "symfony/console": "^5.4 || ^6.1", - "symfony/dependency-injection": "^5.4 || ^6.1", - "symfony/form": "^5.4 || ^6.1", - "symfony/framework-bundle": "^5.4 || ^6.1", - "symfony/http-foundation": "^5.4 || ^6.1", - "symfony/messenger": "^5.4", - "symfony/polyfill-php80": "^1.24", - "symfony/serializer": "^5.4", - "symfony/service-contracts": "^2.2.0" - }, - "default-branch": true, - "type": "phpstan-extension", - "extra": { - "phpstan": { - "includes": [ - "extension.neon", - "rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Lukáš Unger", - "email": "looky.msc@gmail.com", - "homepage": "https://lookyman.net" - } - ], - "description": "Symfony Framework extensions and rules for PHPStan", - "support": { - "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.0" - }, - "time": "2024-11-06T10:13:40+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "10.1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "e656040b5bdab9d6ca046287327bbb47c62be886" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e656040b5bdab9d6ca046287327bbb47c62be886", - "reference": "e656040b5bdab9d6ca046287327bbb47c62be886", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.3.1", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-text-template": "^3.0.1", - "sebastian/code-unit-reverse-lookup": "^3.0.0", - "sebastian/complexity": "^3.2.0", - "sebastian/environment": "^6.1.0", - "sebastian/lines-of-code": "^2.0.2", - "sebastian/version": "^4.0.1", - "theseer/tokenizer": "^1.2.3" - }, - "require-dev": { - "phpunit/phpunit": "^10.5.36" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-12-07T06:07:48+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "4.1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "585510209bc946b0b5686db50aaa89a20d574f94" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/585510209bc946b0b5686db50aaa89a20d574f94", - "reference": "585510209bc946b0b5686db50aaa89a20d574f94", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-09-29T07:03:34+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "4.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "b278fa2f7b3adbb1601635ccae52dd2ae28208f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/b278fa2f7b3adbb1601635ccae52dd2ae28208f7", - "reference": "b278fa2f7b3adbb1601635ccae52dd2ae28208f7", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^10.5" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-09-29T07:04:02+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "3.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "20d18853f9a3da202c01565c55130fb2c95f0f57" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/20d18853f9a3da202c01565c55130fb2c95f0f57", - "reference": "20d18853f9a3da202c01565c55130fb2c95f0f57", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-09-29T07:04:29+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "6.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "2bcef0a54b678667378fb2f6eabd332eec28ed7e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2bcef0a54b678667378fb2f6eabd332eec28ed7e", - "reference": "2bcef0a54b678667378fb2f6eabd332eec28ed7e", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6" }, - "type": "library", + "default-branch": true, + "type": "phpstan-extension", "extra": { - "branch-alias": { - "dev-main": "6.0-dev" + "phpstan": { + "includes": [ + "extension.neon", + "rules.neon" + ] } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "PHPStan\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" + "MIT" ], + "description": "PHPUnit extensions and rules for PHPStan", "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0" + "issues": "https://github.com/phpstan/phpstan-phpunit/issues", + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.3" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-09-29T07:04:59+00:00" + "time": "2024-12-19T09:14:43+00:00" }, { - "name": "phpunit/phpunit", - "version": "10.5.x-dev", + "name": "phpstan/phpstan-strict-rules", + "version": "2.0.x-dev", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "54ae58f62c551a1c73498b053bd11697aac16abe" + "url": "https://github.com/phpstan/phpstan-strict-rules.git", + "reference": "ed6fea0ad4ad9c7e25f3ad2e7c4d420cf1e67fe3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/54ae58f62c551a1c73498b053bd11697aac16abe", - "reference": "54ae58f62c551a1c73498b053bd11697aac16abe", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/ed6fea0ad4ad9c7e25f3ad2e7c4d420cf1e67fe3", + "reference": "ed6fea0ad4ad9c7e25f3ad2e7c4d420cf1e67fe3", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.1", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.16", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-invoker": "^4.0.0", - "phpunit/php-text-template": "^3.0.1", - "phpunit/php-timer": "^6.0.0", - "sebastian/cli-parser": "^2.0.1", - "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.3", - "sebastian/diff": "^5.1.1", - "sebastian/environment": "^6.1.0", - "sebastian/exporter": "^5.1.2", - "sebastian/global-state": "^6.0.2", - "sebastian/object-enumerator": "^5.0.0", - "sebastian/recursion-context": "^5.0.0", - "sebastian/type": "^4.0.0", - "sebastian/version": "^4.0.1" + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.0.4" }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6" }, - "bin": [ - "phpunit" - ], - "type": "library", + "default-branch": true, + "type": "phpstan-extension", "extra": { - "branch-alias": { - "dev-main": "10.5-dev" + "phpstan": { + "includes": [ + "rules.neon" + ] } }, "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] + "psr-4": { + "PHPStan\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" + "MIT" ], + "description": "Extra strict and opinionated rules for PHPStan", "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5" + "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.1" }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" - } - ], - "time": "2024-12-12T06:30:58+00:00" + "time": "2024-12-12T20:21:10+00:00" }, { - "name": "react/cache", - "version": "1.x-dev", + "name": "phpstan/phpstan-symfony", + "version": "2.0.x-dev", "source": { "type": "git", - "url": "https://github.com/reactphp/cache.git", - "reference": "36c51f36d5f3c23cfcc2b5dc5e443bb5ff085605" + "url": "https://github.com/phpstan/phpstan-symfony.git", + "reference": "1ef4dce2baabd464c2dd3109d051bad94efa1e79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/cache/zipball/36c51f36d5f3c23cfcc2b5dc5e443bb5ff085605", - "reference": "36c51f36d5f3c23cfcc2b5dc5e443bb5ff085605", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/1ef4dce2baabd464c2dd3109d051bad94efa1e79", + "reference": "1ef4dce2baabd464c2dd3109d051bad94efa1e79", "shasum": "" }, "require": { - "php": ">=5.3.0", - "react/promise": "^3.0 || ^2.0 || ^1.1" + "ext-simplexml": "*", + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.0" + }, + "conflict": { + "symfony/framework-bundle": "<3.0" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "psr/container": "1.0 || 1.1.1", + "symfony/config": "^5.4 || ^6.1", + "symfony/console": "^5.4 || ^6.1", + "symfony/dependency-injection": "^5.4 || ^6.1", + "symfony/form": "^5.4 || ^6.1", + "symfony/framework-bundle": "^5.4 || ^6.1", + "symfony/http-foundation": "^5.4 || ^6.1", + "symfony/messenger": "^5.4", + "symfony/polyfill-php80": "^1.24", + "symfony/serializer": "^5.4", + "symfony/service-contracts": "^2.2.0" }, "default-branch": true, - "type": "library", + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon", + "rules.neon" + ] + } + }, "autoload": { "psr-4": { - "React\\Cache\\": "src/" + "PHPStan\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -11585,505 +10743,441 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Lukáš Unger", + "email": "looky.msc@gmail.com", + "homepage": "https://lookyman.net" } ], - "description": "Async, Promise-based cache interface for ReactPHP", - "keywords": [ - "cache", - "caching", - "promise", - "reactphp" - ], + "description": "Symfony Framework extensions and rules for PHPStan", "support": { - "issues": "https://github.com/reactphp/cache/issues", - "source": "https://github.com/reactphp/cache/tree/1.x" + "issues": "https://github.com/phpstan/phpstan-symfony/issues", + "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.0" }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2024-01-04T09:16:03+00:00" + "time": "2024-11-06T10:13:40+00:00" }, { - "name": "react/child-process", - "version": "0.6.x-dev", + "name": "phpunit/php-code-coverage", + "version": "10.1.x-dev", "source": { "type": "git", - "url": "https://github.com/reactphp/child-process.git", - "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43" + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "e656040b5bdab9d6ca046287327bbb47c62be886" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", - "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e656040b5bdab9d6ca046287327bbb47c62be886", + "reference": "e656040b5bdab9d6ca046287327bbb47c62be886", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.0", - "react/event-loop": "^1.2", - "react/stream": "^1.2" + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.3.1", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", - "react/socket": "^1.8", - "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + "phpunit/phpunit": "^10.5.36" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, - "default-branch": true, "type": "library", - "autoload": { - "psr-4": { - "React\\ChildProcess\\": "src" + "extra": { + "branch-alias": { + "dev-main": "10.1.x-dev" } }, + "autoload": { + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Event-driven library for executing child processes with ReactPHP.", + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "keywords": [ - "event-driven", - "process", - "reactphp" + "coverage", + "testing", + "xunit" ], "support": { - "issues": "https://github.com/reactphp/child-process/issues", - "source": "https://github.com/reactphp/child-process/tree/v0.6.5" + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", + "url": "https://github.com/sebastianbergmann", "type": "github" } ], - "time": "2022-09-16T13:41:56+00:00" + "time": "2024-12-07T06:07:48+00:00" }, { - "name": "react/dns", - "version": "1.x-dev", + "name": "phpunit/php-file-iterator", + "version": "4.1.x-dev", "source": { "type": "git", - "url": "https://github.com/reactphp/dns.git", - "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "585510209bc946b0b5686db50aaa89a20d574f94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", - "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/585510209bc946b0b5686db50aaa89a20d574f94", + "reference": "585510209bc946b0b5686db50aaa89a20d574f94", "shasum": "" }, "require": { - "php": ">=5.3.0", - "react/cache": "^1.0 || ^0.6 || ^0.5", - "react/event-loop": "^1.2", - "react/promise": "^3.2 || ^2.7 || ^1.2.1" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/async": "^4.3 || ^3 || ^2", - "react/promise-timer": "^1.11" + "phpunit/phpunit": "^10.5" }, "type": "library", - "autoload": { - "psr-4": { - "React\\Dns\\": "src/" + "extra": { + "branch-alias": { + "dev-main": "4.1-dev" } }, + "autoload": { + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Async DNS resolver for ReactPHP", + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", "keywords": [ - "async", - "dns", - "dns-resolver", - "reactphp" + "filesystem", + "iterator" ], "support": { - "issues": "https://github.com/reactphp/dns/issues", - "source": "https://github.com/reactphp/dns/tree/v1.13.0" + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "url": "https://github.com/sebastianbergmann", + "type": "github" } ], - "time": "2024-06-13T14:18:03+00:00" + "time": "2024-09-29T07:03:34+00:00" }, { - "name": "react/event-loop", - "version": "1.x-dev", + "name": "phpunit/php-invoker", + "version": "4.0.x-dev", "source": { "type": "git", - "url": "https://github.com/reactphp/event-loop.git", - "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "b278fa2f7b3adbb1601635ccae52dd2ae28208f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", - "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/b278fa2f7b3adbb1601635ccae52dd2ae28208f7", + "reference": "b278fa2f7b3adbb1601635ccae52dd2ae28208f7", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + "ext-pcntl": "*", + "phpunit/phpunit": "^10.5" }, "suggest": { - "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + "ext-pcntl": "*" }, - "default-branch": true, "type": "library", - "autoload": { - "psr-4": { - "React\\EventLoop\\": "src/" + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" } }, + "autoload": { + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ - "asynchronous", - "event-loop" + "process" ], "support": { - "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "url": "https://github.com/sebastianbergmann", + "type": "github" } ], - "time": "2023-11-13T13:48:05+00:00" + "time": "2024-09-29T07:04:02+00:00" }, { - "name": "react/promise", - "version": "3.x-dev", + "name": "phpunit/php-text-template", + "version": "3.0.x-dev", "source": { "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "5f80055cc21ba7bcd3989e4902061fc12e2bcc1d" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "20d18853f9a3da202c01565c55130fb2c95f0f57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/5f80055cc21ba7bcd3989e4902061fc12e2bcc1d", - "reference": "5f80055cc21ba7bcd3989e4902061fc12e2bcc1d", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/20d18853f9a3da202c01565c55130fb2c95f0f57", + "reference": "20d18853f9a3da202c01565c55130fb2c95f0f57", "shasum": "" }, "require": { - "php": ">=7.1.0" + "php": ">=8.1" }, "require-dev": { - "phpstan/phpstan": "1.10.39 || 1.4.10", - "phpunit/phpunit": "^9.6 || ^7.5" + "phpunit/phpunit": "^10.5" }, - "default-branch": true, "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Promise\\": "src/" + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" } }, + "autoload": { + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ - "promise", - "promises" + "template" ], "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/3.x" + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "url": "https://github.com/sebastianbergmann", + "type": "github" } ], - "time": "2024-11-19T18:32:50+00:00" + "time": "2024-09-29T07:04:29+00:00" }, { - "name": "react/socket", - "version": "1.x-dev", + "name": "phpunit/php-timer", + "version": "6.0.x-dev", "source": { "type": "git", - "url": "https://github.com/reactphp/socket.git", - "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "2bcef0a54b678667378fb2f6eabd332eec28ed7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", - "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2bcef0a54b678667378fb2f6eabd332eec28ed7e", + "reference": "2bcef0a54b678667378fb2f6eabd332eec28ed7e", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.0", - "react/dns": "^1.13", - "react/event-loop": "^1.2", - "react/promise": "^3.2 || ^2.6 || ^1.2.1", - "react/stream": "^1.4" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/async": "^4.3 || ^3.3 || ^2", - "react/promise-stream": "^1.4", - "react/promise-timer": "^1.11" + "phpunit/phpunit": "^10.5" }, "type": "library", - "autoload": { - "psr-4": { - "React\\Socket\\": "src/" + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" } }, + "autoload": { + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ - "Connection", - "Socket", - "async", - "reactphp", - "stream" + "timer" ], "support": { - "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.16.0" + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "url": "https://github.com/sebastianbergmann", + "type": "github" } ], - "time": "2024-07-26T10:38:09+00:00" + "time": "2024-09-29T07:04:59+00:00" }, { - "name": "react/stream", - "version": "1.x-dev", + "name": "phpunit/phpunit", + "version": "10.5.x-dev", "source": { "type": "git", - "url": "https://github.com/reactphp/stream.git", - "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "e6ddda95af52f69c1e0c7b4f977cccb58048798c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", - "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e6ddda95af52f69c1e0c7b4f977cccb58048798c", + "reference": "e6ddda95af52f69c1e0c7b4f977cccb58048798c", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.8", - "react/event-loop": "^1.2" + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.1", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.3", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.2", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.0", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" }, - "require-dev": { - "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" }, + "bin": [ + "phpunit" + ], "type": "library", - "autoload": { - "psr-4": { - "React\\Stream\\": "src/" + "extra": { + "branch-alias": { + "dev-main": "10.5-dev" } }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", "keywords": [ - "event-driven", - "io", - "non-blocking", - "pipe", - "reactphp", - "readable", - "stream", - "writable" + "phpunit", + "testing", + "xunit" ], "support": { - "issues": "https://github.com/reactphp/stream/issues", - "source": "https://github.com/reactphp/stream/tree/v1.4.0" + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.40" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2024-06-11T12:45:25+00:00" + "time": "2024-12-21T05:49:06+00:00" }, { "name": "sebastian/cli-parser", @@ -13284,22 +12378,23 @@ }, { "name": "symfony/maker-bundle", - "version": "v1.61.0", + "version": "dev-main", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18" + "reference": "0624f13b1e0ff86df6f6646c711d806d9af12629" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/a3b7f14d349f8f44ed752d4dde2263f77510cc18", - "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/0624f13b1e0ff86df6f6646c711d806d9af12629", + "reference": "0624f13b1e0ff86df6f6646c711d806d9af12629", "shasum": "" }, "require": { "doctrine/inflector": "^2.0", "nikic/php-parser": "^4.18|^5.0", "php": ">=8.1", + "php-cs-fixer/shim": "^v3.64", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", @@ -13324,6 +12419,7 @@ "symfony/yaml": "^6.4|^7.0", "twig/twig": "^3.0|^4.x-dev" }, + "default-branch": true, "type": "symfony-bundle", "extra": { "branch-alias": { @@ -13356,7 +12452,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.61.0" + "source": "https://github.com/symfony/maker-bundle/tree/main" }, "funding": [ { @@ -13372,7 +12468,7 @@ "type": "tidelift" } ], - "time": "2024-08-29T22:50:23+00:00" + "time": "2024-12-10T23:51:12+00:00" }, { "name": "symfony/phpunit-bridge", @@ -13594,12 +12690,12 @@ "source": { "type": "git", "url": "https://github.com/VincentLanglet/Twig-CS-Fixer.git", - "reference": "f81af33e48c384be7e0e3689f02e6e712fa68beb" + "reference": "63c500016f7eb34a0f2aa2cfe8e1ac834fd857ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/f81af33e48c384be7e0e3689f02e6e712fa68beb", - "reference": "f81af33e48c384be7e0e3689f02e6e712fa68beb", + "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/63c500016f7eb34a0f2aa2cfe8e1ac834fd857ba", + "reference": "63c500016f7eb34a0f2aa2cfe8e1ac834fd857ba", "shasum": "" }, "require": { @@ -13620,15 +12716,15 @@ "ergebnis/composer-normalize": "^2.29", "friendsofphp/php-cs-fixer": "^3.13.0", "infection/infection": "^0.26.16 || ^0.27.0", - "phpstan/phpstan": "^1.9.1", - "phpstan/phpstan-phpunit": "^1.2.2", - "phpstan/phpstan-strict-rules": "^1.4.4", - "phpstan/phpstan-symfony": "^1.2.16", - "phpstan/phpstan-webmozart-assert": "^1.2.2", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpstan/phpstan-symfony": "^2.0", + "phpstan/phpstan-webmozart-assert": "^2.0", "phpunit/phpunit": "^9.5.26 || ^10.0.9", - "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-phpunit": "^0.19.0", "psalm/plugin-symfony": "^5.0.0", - "rector/rector": "^1.0.0", + "rector/rector": "^2.0.0", "shipmonk/composer-dependency-analyser": "^1.6", "symfony/process": "^5.4 || ^6.4 || ^7.0", "symfony/twig-bridge": "^5.4 || ^6.4 || ^7.0", @@ -13659,7 +12755,7 @@ "homepage": "https://github.com/VincentLanglet/Twig-CS-Fixer", "support": { "issues": "https://github.com/VincentLanglet/Twig-CS-Fixer/issues", - "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/3.5.0" + "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/main" }, "funding": [ { @@ -13667,13 +12763,12 @@ "type": "github" } ], - "time": "2024-12-13T16:55:11+00:00" + "time": "2024-12-22T01:22:57+00:00" } ], "aliases": [], "minimum-stability": "dev", "stability-flags": { - "friendsofphp/php-cs-fixer": 20, "jblond/php-diff": 20, "league/commonmark": 20, "meilisearch/search-bundle": 20, diff --git a/config/bundles.php b/config/bundles.php index d517e16..02cb557 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -1,26 +1,46 @@ ['all' => true], - Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], - Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], - Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true], - Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], - Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], - Symfony\UX\StimulusBundle\StimulusBundle::class => ['all' => true], - Symfony\UX\Turbo\TurboBundle::class => ['all' => true], - Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], - Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], - Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], - Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], - EasyCorp\Bundle\EasyAdminBundle\EasyAdminBundle::class => ['all' => true], - Symfonycasts\SassBundle\SymfonycastsSassBundle::class => ['all' => true], - Symfony\UX\TwigComponent\TwigComponentBundle::class => ['all' => true], - Symfony\UX\LiveComponent\LiveComponentBundle::class => ['all' => true], - Sensiolabs\TypeScriptBundle\SensiolabsTypeScriptBundle::class => ['all' => true], - Meilisearch\Bundle\MeilisearchBundle::class => ['all' => true], - Symfony\UX\Chartjs\ChartjsBundle::class => ['all' => true], - NotFloran\MjmlBundle\MjmlBundle::class => ['all' => true], + FrameworkBundle::class => ['all' => true], + DoctrineBundle::class => ['all' => true], + DoctrineMigrationsBundle::class => ['all' => true], + DebugBundle::class => ['dev' => true], + TwigBundle::class => ['all' => true], + WebProfilerBundle::class => ['dev' => true, 'test' => true], + StimulusBundle::class => ['all' => true], + TurboBundle::class => ['all' => true], + TwigExtraBundle::class => ['all' => true], + SecurityBundle::class => ['all' => true], + MonologBundle::class => ['all' => true], + MakerBundle::class => ['dev' => true], + EasyAdminBundle::class => ['all' => true], + SymfonycastsSassBundle::class => ['all' => true], + TwigComponentBundle::class => ['all' => true], + LiveComponentBundle::class => ['all' => true], + SensiolabsTypeScriptBundle::class => ['all' => true], + MeilisearchBundle::class => ['all' => true], + ChartjsBundle::class => ['all' => true], + MjmlBundle::class => ['all' => true], ]; diff --git a/config/packages/asset_mapper.php b/config/packages/asset_mapper.php index 04de67d..c650211 100644 --- a/config/packages/asset_mapper.php +++ b/config/packages/asset_mapper.php @@ -11,5 +11,6 @@ ->excludedPatterns([ '*/assets/styles/_*.scss', '*/assets/styles/**/_*.scss', - ]); + ]) + ; }; diff --git a/config/packages/cache.php b/config/packages/cache.php index e2a2091..85f59bc 100644 --- a/config/packages/cache.php +++ b/config/packages/cache.php @@ -10,5 +10,6 @@ $frameworkConfig->cache() ->prefixSeed('database_playground/app') ->app('cache.adapter.redis_tag_aware') - ->defaultRedisProvider(param('app.redis_uri')); + ->defaultRedisProvider(param('app.redis_uri')) + ; }; diff --git a/config/packages/csrf.php b/config/packages/csrf.php index 352483f..21140f7 100644 --- a/config/packages/csrf.php +++ b/config/packages/csrf.php @@ -7,10 +7,12 @@ return static function (FrameworkConfig $frameworkConfig): void { $frameworkConfig ->form() - ->csrfProtection() - ->tokenId('submit'); + ->csrfProtection() + ->tokenId('submit') + ; $frameworkConfig ->csrfProtection() - ->statelessTokenIds(['submit', 'authenticate', 'logout']); + ->statelessTokenIds(['submit', 'authenticate', 'logout']) + ; }; diff --git a/config/packages/dev/web_profiler.php b/config/packages/dev/web_profiler.php index d46eba3..3c5acc9 100644 --- a/config/packages/dev/web_profiler.php +++ b/config/packages/dev/web_profiler.php @@ -21,12 +21,16 @@ $webProfilerConfig->interceptRedirects(false); $frameworkProfilerConfig ->onlyExceptions(false) - ->collectSerializerData(true); + ->collectSerializerData(true) + ; + break; + case 'test': $webProfilerConfig->toolbar(false); $webProfilerConfig->interceptRedirects(false); $frameworkProfilerConfig->collect(false); + break; } }; diff --git a/config/packages/doctrine.php b/config/packages/doctrine.php index df3e512..6431537 100644 --- a/config/packages/doctrine.php +++ b/config/packages/doctrine.php @@ -26,12 +26,14 @@ ->connection('default') ->url(env('DATABASE_URL')->resolve()) ->profilingCollectBacktrace(param('kernel.debug')) - ->useSavepoints(true); + ->useSavepoints(true) + ; $ormConfig = $doctrineConfig->orm(); $ormConfig ->autoGenerateProxyClasses(true) - ->enableLazyGhostObjects(true); + ->enableLazyGhostObjects(true) + ; $entityManager = $ormConfig->entityManager('default'); $entityManager @@ -45,11 +47,13 @@ 'dir' => '%kernel.project_dir%/src/Entity', 'prefix' => 'App\Entity', 'alias' => 'App', - ]); + ]) + ; $ormConfig ->controllerResolver() - ->autoMapping(false); + ->autoMapping(false) + ; $entityManager->dql() ->datetimeFunction('date', SimpleFunction::class) @@ -77,13 +81,15 @@ ->stringFunction('concat_ws', ConcatWs::class) ->stringFunction('cast', Cast::class) ->stringFunction('replace', Replace::class) - ->stringFunction('date_format', DateFormat::class); + ->stringFunction('date_format', DateFormat::class) + ; if ('test' === $containerConfigurator->env()) { $dbalConfig ->connection('default') // "TEST_TOKEN" is typically set by ParaTest - ->dbnameSuffix('_test.%env(default::TEST_TOKEN)%'); + ->dbnameSuffix('_test.%env(default::TEST_TOKEN)%') + ; } if ('prod' === $containerConfigurator->env()) { @@ -92,19 +98,22 @@ $ormConfig ->autoGenerateProxyClasses(false) - ->proxyDir('%kernel.build_dir%/doctrine/orm/Proxies'); + ->proxyDir('%kernel.build_dir%/doctrine/orm/Proxies') + ; $entityManager ->queryCacheDriver([ 'type' => 'pool', 'pool' => $systemCachePool, - ]); + ]) + ; $entityManager ->resultCacheDriver([ 'type' => 'pool', 'pool' => $resultCachePool, - ]); + ]) + ; $cache = $frameworkConfig->cache(); $cache->pool($systemCachePool)->adapters(['cache.system']); diff --git a/config/packages/doctrine_migrations.php b/config/packages/doctrine_migrations.php index 1927c51..631e044 100644 --- a/config/packages/doctrine_migrations.php +++ b/config/packages/doctrine_migrations.php @@ -6,10 +6,12 @@ return static function (DoctrineMigrationsConfig $doctrineMigrationsConfig): void { $doctrineMigrationsConfig - ->enableProfiler(false); + ->enableProfiler(false) + ; $doctrineMigrationsConfig // namespace is arbitrary but should be different from App\Migrations // as migrations classes should NOT be autoloaded - ->migrationsPath('DoctrineMigrations', '%kernel.project_dir%/migrations'); + ->migrationsPath('DoctrineMigrations', '%kernel.project_dir%/migrations') + ; }; diff --git a/config/packages/http_discovery.php b/config/packages/http_discovery.php index 303701a..4f5a96b 100644 --- a/config/packages/http_discovery.php +++ b/config/packages/http_discovery.php @@ -18,5 +18,6 @@ ->alias(ServerRequestFactoryInterface::class, Psr17Factory::class) ->alias(StreamFactoryInterface::class, Psr17Factory::class) ->alias(UploadedFileFactoryInterface::class, Psr17Factory::class) - ->alias(UriFactoryInterface::class, Psr17Factory::class); + ->alias(UriFactoryInterface::class, Psr17Factory::class) + ; }; diff --git a/config/packages/mailer.php b/config/packages/mailer.php index e9df49e..3fb222d 100644 --- a/config/packages/mailer.php +++ b/config/packages/mailer.php @@ -8,5 +8,6 @@ return static function (FrameworkConfig $frameworkConfig): void { $frameworkConfig->mailer() - ->dsn(env('MAILER_DSN')); + ->dsn(env('MAILER_DSN')) + ; }; diff --git a/config/packages/meilisearch.php b/config/packages/meilisearch.php index df18cf2..a16e6af 100644 --- a/config/packages/meilisearch.php +++ b/config/packages/meilisearch.php @@ -12,16 +12,17 @@ ->url(env('MEILISEARCH_URL')) ->apiKey(env('MEILISEARCH_API_KEY')) ->indices() - ->name('questions') - ->class(Question::class) - ->enableSerializerGroups(true) - ->settings([ - 'filterableAttributes' => [ - 'type', - 'difficulty', - ], - 'sortableAttributes' => [ - 'id', - ], - ]); + ->name('questions') + ->class(Question::class) + ->enableSerializerGroups(true) + ->settings([ + 'filterableAttributes' => [ + 'type', + 'difficulty', + ], + 'sortableAttributes' => [ + 'id', + ], + ]) + ; }; diff --git a/config/packages/messenger.php b/config/packages/messenger.php index e501458..ae62ae0 100644 --- a/config/packages/messenger.php +++ b/config/packages/messenger.php @@ -21,7 +21,8 @@ $asyncTransport->dsn(env('MESSENGER_TRANSPORT_DSN')); $asyncTransport->retryStrategy() ->maxRetries(3) - ->multiplier(2); + ->multiplier(2) + ; $failedTransport = $messenger->transport('failed'); assert($failedTransport instanceof TransportConfig); diff --git a/config/packages/mjml.php b/config/packages/mjml.php index 14e637e..e6102ff 100644 --- a/config/packages/mjml.php +++ b/config/packages/mjml.php @@ -1,8 +1,9 @@ options([ 'binary' => '%kernel.project_dir%/node_modules/.bin/mjml', 'minify' => false, diff --git a/config/packages/monolog.php b/config/packages/monolog.php index 51dfa3d..c6011c5 100644 --- a/config/packages/monolog.php +++ b/config/packages/monolog.php @@ -15,12 +15,14 @@ ->path('%kernel.logs_dir%/%kernel.environment%.log') ->level('debug') ->channels() - ->elements(['!event']); + ->elements(['!event']) + ; $monologConfig->handler('console') ->type('console') ->processPsr3Messages(false) ->channels() - ->elements(['!event', '!doctrine', '!console']); + ->elements(['!event', '!doctrine', '!console']) + ; } if ('test' === $containerConfigurator->env()) { @@ -31,11 +33,13 @@ ->excludedHttpCode(404) ->excludedHttpCode(405) ->channels() - ->elements(['!event']); + ->elements(['!event']) + ; $monologConfig->handler('nested') ->type('stream') ->path('%kernel.logs_dir%/%kernel.environment%.log') - ->level('debug'); + ->level('debug') + ; } if ('prod' === $containerConfigurator->env()) { @@ -46,22 +50,26 @@ ->excludedHttpCode(404) ->excludedHttpCode(405) // How many messages should be saved? Prevent memory leaks - ->bufferSize(50); + ->bufferSize(50) + ; $monologConfig->handler('nested') ->type('stream') ->path('php://stderr') ->level('debug') - ->formatter('monolog.formatter.json'); + ->formatter('monolog.formatter.json') + ; $monologConfig->handler('console') ->type('console') ->processPsr3Messages(false) ->channels() - ->elements(['!event', '!doctrine']); + ->elements(['!event', '!doctrine']) + ; $monologConfig->handler('deprecation') ->type('stream') ->path('php://stderr') ->formatter('monolog.formatter.json') ->channels() - ->elements(['deprecation']); + ->elements(['deprecation']) + ; } }; diff --git a/config/packages/security.php b/config/packages/security.php index 566c37b..8bf9ca2 100644 --- a/config/packages/security.php +++ b/config/packages/security.php @@ -16,36 +16,42 @@ // used to reload user from session & other features (e.g. switch_user) $securityConfig ->provider('app_user_provider') - ->entity() - ->class(User::class) - ->property('email'); + ->entity() + ->class(User::class) + ->property('email') + ; $securityConfig ->firewall('dev') - ->pattern('^/(_(profiler|wdt)|css|images|js)/') - ->security(false); + ->pattern('^/(_(profiler|wdt)|css|images|js)/') + ->security(false) + ; $mainFirewall = $securityConfig->firewall('main'); $mainFirewall ->lazy(true) - ->provider('app_user_provider'); + ->provider('app_user_provider') + ; $mainFirewall ->formLogin() - ->loginPath('app_login') - ->checkPath('app_login') - ->enableCsrf(true); + ->loginPath('app_login') + ->checkPath('app_login') + ->enableCsrf(true) + ; $mainFirewall ->logout() - ->path('app_logout') - ->target('app_home'); + ->path('app_logout') + ->target('app_home') + ; $mainFirewall ->rememberMe() - ->secret(param('kernel.secret')) - ->lifetime(604800 /* 1 week in seconds */); + ->secret(param('kernel.secret')) + ->lifetime(604800 /* 1 week in seconds */) + ; // https://symfony.com/doc/current/security/impersonating_user.html $mainFirewall->switchUser(); @@ -53,26 +59,30 @@ // Allow anonymous access to the login form. $securityConfig ->accessControl() - ->route('app_login') - ->roles('PUBLIC_ACCESS'); + ->route('app_login') + ->roles('PUBLIC_ACCESS') + ; // Allow anonymous access to the feedback form. $securityConfig ->accessControl() - ->route('app_feedback') - ->roles('PUBLIC_ACCESS'); + ->route('app_feedback') + ->roles('PUBLIC_ACCESS') + ; // Admin $securityConfig ->accessControl() - ->path('^/admin') - ->roles('ROLE_ADMIN'); + ->path('^/admin') + ->roles('ROLE_ADMIN') + ; // Others (for example, apps) $securityConfig ->accessControl() - ->path('^/') - ->roles('ROLE_USER'); + ->path('^/') + ->roles('ROLE_USER') + ; if ('test' === $containerConfigurator->env()) { $passwordHasher = $securityConfig->passwordHasher(PasswordAuthenticatedUserInterface::class); @@ -82,6 +92,7 @@ ->algorithm('auto') ->cost(4) ->timeCost(3) - ->memoryCost(10); + ->memoryCost(10) + ; } }; diff --git a/config/packages/translation.php b/config/packages/translation.php index d9ec9b0..04b3c51 100644 --- a/config/packages/translation.php +++ b/config/packages/translation.php @@ -7,10 +7,12 @@ return static function (FrameworkConfig $config): void { $config ->defaultLocale('zh_TW') - ->enabledLocales(['zh_TW']); + ->enabledLocales(['zh_TW']) + ; $config ->translator() ->defaultPath('%kernel.project_dir%/translations') - ->fallbacks(['zh_TW']); + ->fallbacks(['zh_TW']) + ; }; diff --git a/config/packages/twig.php b/config/packages/twig.php index 15f19b3..5372046 100644 --- a/config/packages/twig.php +++ b/config/packages/twig.php @@ -15,5 +15,6 @@ ->global('umami_website_id', env('UMAMI_WEBSITE_ID')) ->strictVariables(true) ->global('app_features_hint', param('app.features.hint')) - ->global('app_features_comment', param('app.features.comment')); + ->global('app_features_comment', param('app.features.comment')) + ; }; diff --git a/config/packages/twig_component.php b/config/packages/twig_component.php index 42605b9..fe0264c 100644 --- a/config/packages/twig_component.php +++ b/config/packages/twig_component.php @@ -7,5 +7,6 @@ return static function (TwigComponentConfig $twigComponentConfig): void { $twigComponentConfig ->anonymousTemplateDirectory('components/') - ->defaults('App\Twig\Components\\', 'components/'); + ->defaults('App\Twig\Components\\', 'components/') + ; }; diff --git a/config/routes/framework.php b/config/routes/framework.php index 455101b..34b3d08 100644 --- a/config/routes/framework.php +++ b/config/routes/framework.php @@ -7,6 +7,7 @@ return static function (RoutingConfigurator $routingConfigurator): void { if ('dev' === $routingConfigurator->env()) { $routingConfigurator->import('@FrameworkBundle/Resources/config/routing/errors.xml') - ->prefix('/_error'); + ->prefix('/_error') + ; } }; diff --git a/config/routes/ux_live_component.php b/config/routes/ux_live_component.php index e7cb167..6230b87 100644 --- a/config/routes/ux_live_component.php +++ b/config/routes/ux_live_component.php @@ -6,5 +6,6 @@ return static function (RoutingConfigurator $routingConfigurator): void { $routingConfigurator->import('@LiveComponentBundle/config/routes.php') - ->prefix('/_components'); + ->prefix('/_components') + ; }; diff --git a/config/routes/web_profiler.php b/config/routes/web_profiler.php index 63bbf5f..5e639a6 100644 --- a/config/routes/web_profiler.php +++ b/config/routes/web_profiler.php @@ -7,8 +7,10 @@ return static function (RoutingConfigurator $routingConfigurator): void { if ('dev' === $routingConfigurator->env()) { $routingConfigurator->import('@WebProfilerBundle/Resources/config/routing/wdt.xml') - ->prefix('/_wdt'); + ->prefix('/_wdt') + ; $routingConfigurator->import('@WebProfilerBundle/Resources/config/routing/profiler.xml') - ->prefix('/_profiler'); + ->prefix('/_profiler') + ; } }; diff --git a/config/services.php b/config/services.php index 1105c1a..0d185cf 100644 --- a/config/services.php +++ b/config/services.php @@ -18,6 +18,7 @@ ->set('app.redis_uri', env('REDIS_URI')) ->set('app.openai_api_key', env('OPENAI_API_KEY')) ->set('app.server-mail', env('SERVER_EMAIL')) + ->set('app.server-email-for-test', env('SERVER_EMAIL_FOR_TEST')) ->set('app.mail.bcc-chunk', 10) ->set('app.features.hint', true) ->set('app.features.editable-profile', true) @@ -28,7 +29,8 @@ $services->defaults() ->autowire() - ->autoconfigure(); + ->autoconfigure() + ; $services->load('App\\', __DIR__.'/../src/') ->exclude([ @@ -38,21 +40,28 @@ __DIR__.'/../src/Service/Processes/', __DIR__.'/../src/Service/Types/', __DIR__.'/../src/Twig/Components/Challenge/EventConstant.php', - ]); + ]) + ; $services->set(PromptService::class) - ->arg('$apiKey', param('app.openai_api_key')); + ->arg('$apiKey', param('app.openai_api_key')) + ; $services->set(SqlRunnerService::class) - ->arg('$baseUrl', param('app.sqlrunner_url')); + ->arg('$baseUrl', param('app.sqlrunner_url')) + ; $services->set(EmailService::class) ->arg('$serverMail', param('app.server-mail')) - ->arg('$chunkLimit', param('app.mail.bcc-chunk')); + ->arg('$serverMailForTest', param('app.server-email-for-test')) + ->arg('$chunkLimit', param('app.mail.bcc-chunk')) + ; $services->set(EmailTemplateService::class) - ->arg('$serverMail', param('app.server-mail')); + ->arg('$serverMail', param('app.server-mail')) + ; $services->set(EmailTemplateController::class) - ->arg('$projectDir', param('kernel.project_dir')); + ->arg('$projectDir', param('kernel.project_dir')) + ; }; diff --git a/devenv.lock b/devenv.lock index da14aa9..bb3497c 100644 --- a/devenv.lock +++ b/devenv.lock @@ -3,10 +3,10 @@ "devenv": { "locked": { "dir": "src/modules", - "lastModified": 1733788855, + "lastModified": 1735241861, "owner": "cachix", "repo": "devenv", - "rev": "d59fee8696cd48f69cf79f65992269df9891ba86", + "rev": "991abff153b995192bf36655394246fc97ba8627", "type": "github" }, "original": { @@ -53,10 +53,10 @@ }, "nixpkgs": { "locked": { - "lastModified": 1734126203, + "lastModified": 1735362117, "owner": "nixos", "repo": "nixpkgs", - "rev": "71a6392e367b08525ee710a93af2e80083b5b3e2", + "rev": "9e09ce2d47c7700b877becef99ce7e27f15604dc", "type": "github" }, "original": { @@ -68,10 +68,10 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1734202038, + "lastModified": 1735286948, "owner": "NixOS", "repo": "nixpkgs", - "rev": "bcba2fbf6963bf6bed3a749f9f4cf5bff4adb96d", + "rev": "31ac92f9628682b294026f0860e14587a09ffb4b", "type": "github" }, "original": { @@ -91,10 +91,10 @@ "nixpkgs-stable": "nixpkgs-stable" }, "locked": { - "lastModified": 1734279981, + "lastModified": 1734797603, "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "aa9f40c906904ebd83da78e7f328cd8aeaeae785", + "rev": "f0f0dc4920a903c3e08f5bdb9246bb572fcae498", "type": "github" }, "original": { diff --git a/devenv.nix b/devenv.nix index 769b5dd..d726bf9 100644 --- a/devenv.nix +++ b/devenv.nix @@ -7,7 +7,7 @@ env.GREET = "devenv"; # https://devenv.sh/packages/ - packages = [ pkgs.git pkgs.hadolint ]; + packages = [ pkgs.git pkgs.hadolint pkgs.phpactor ]; # https://devenv.sh/languages/ languages.php.enable = true; diff --git a/importmap.php b/importmap.php index d5e2702..1a79059 100644 --- a/importmap.php +++ b/importmap.php @@ -50,13 +50,13 @@ 'version' => '6.8.0', ], '@codemirror/view' => [ - 'version' => '6.35.3', + 'version' => '6.36.1', ], '@codemirror/state' => [ 'version' => '6.5.0', ], '@codemirror/language' => [ - 'version' => '6.10.6', + 'version' => '6.10.8', ], '@codemirror/commands' => [ 'version' => '6.7.1', @@ -65,7 +65,7 @@ 'version' => '6.5.8', ], '@codemirror/autocomplete' => [ - 'version' => '6.18.3', + 'version' => '6.18.4', ], '@codemirror/lint' => [ 'version' => '6.8.4', diff --git a/package.json b/package.json index 34546cb..d45299f 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,10 @@ }, "dependencies": { "@swc/cli": "^0.5.2", - "@swc/core": "^1.10.1", + "@swc/core": "^1.10.4", "mjml": "^4.15.3" }, - "packageManager": "pnpm@9.15.0+sha512.76e2379760a4328ec4415815bcd6628dee727af3779aaa4c914e3944156c4299921a89f976381ee107d41f12cfa4b66681ca9c718f0668fa0831ed4c6d8ba56c", + "packageManager": "pnpm@9.15.2+sha512.93e57b0126f0df74ce6bff29680394c0ba54ec47246b9cf321f0121d8d9bb03f750a705f24edc3c1180853afd7c2c3b94196d0a3d53d3e069d9e2793ef11f321", "devDependencies": { "@codemirror/lang-sql": "^6.8.0", "@codemirror/state": "^6.5.0", @@ -23,8 +23,8 @@ "codemirror": "^6.0.1", "dprint": "^0.47.6", "eslint": "^9.17.0", - "globals": "^15.13.0", + "globals": "^15.14.0", "typescript": "^5.7.2", - "typescript-eslint": "^8.18.0" + "typescript-eslint": "^8.18.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 17eb800..3278828 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,17 +9,17 @@ importers: dependencies: "@swc/cli": specifier: ^0.5.2 - version: 0.5.2(@swc/core@1.10.1)(chokidar@3.6.0) + version: 0.5.2(@swc/core@1.10.4)(chokidar@3.6.0) "@swc/core": - specifier: ^1.10.1 - version: 1.10.1 + specifier: ^1.10.4 + version: 1.10.4 mjml: specifier: ^4.15.3 version: 4.15.3 devDependencies: "@codemirror/lang-sql": specifier: ^6.8.0 - version: 6.8.0(@codemirror/view@6.35.3) + version: 6.8.0 "@codemirror/state": specifier: ^6.5.0 version: 6.5.0 @@ -40,7 +40,7 @@ importers: version: 5.3.3(@popperjs/core@2.11.8) codemirror: specifier: ^6.0.1 - version: 6.0.1(@lezer/common@1.2.3) + version: 6.0.1 dprint: specifier: ^0.47.6 version: 0.47.6 @@ -48,14 +48,14 @@ importers: specifier: ^9.17.0 version: 9.17.0 globals: - specifier: ^15.13.0 - version: 15.13.0 + specifier: ^15.14.0 + version: 15.14.0 typescript: specifier: ^5.7.2 version: 5.7.2 typescript-eslint: - specifier: ^8.18.0 - version: 8.18.0(eslint@9.17.0)(typescript@5.7.2) + specifier: ^8.18.2 + version: 8.18.2(eslint@9.17.0)(typescript@5.7.2) packages: "@babel/runtime@7.26.0": @@ -64,15 +64,10 @@ packages: } engines: { node: ">=6.9.0" } - "@codemirror/autocomplete@6.18.3": + "@codemirror/autocomplete@6.18.4": resolution: { - integrity: sha512-1dNIOmiM0z4BIBwxmxEfA1yoxh1MF/6KPBbh20a5vphGV0ictKlgQsbJs6D6SkR6iJpGbpwRsa6PFMNlg9T9pQ==, + integrity: sha512-sFAphGQIqyQZfP2ZBsSHV7xQvo9Py0rV0dW7W3IMRdS+zDuNb2l3no78CvUaWKGfzFjI4FTrLdUSj86IGb2hRA==, } - peerDependencies: - "@codemirror/language": ^6.0.0 - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - "@lezer/common": ^1.0.0 "@codemirror/commands@6.7.1": resolution: { @@ -84,9 +79,9 @@ packages: integrity: sha512-aGLmY4OwGqN3TdSx3h6QeA1NrvaYtF7kkoWR/+W7/JzB0gQtJ+VJxewlnE3+VImhA4WVlhmkJr109PefOOhjLg==, } - "@codemirror/language@6.10.6": + "@codemirror/language@6.10.8": resolution: { - integrity: sha512-KrsbdCnxEztLVbB5PycWXFxas4EOyk/fPAfruSOnDDppevQgid2XZ+KbJ9u+fDikP/e7MW7HPBTvTb8JlZK9vA==, + integrity: sha512-wcP8XPPhDH2vTqf181U8MbZnW+tDyPYy0UzVOa+oHORjyT+mhhom9vBd7dApJwoDz9Nb/a8kHjJIsuA/t8vNFw==, } "@codemirror/lint@6.8.4": @@ -104,9 +99,9 @@ packages: integrity: sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==, } - "@codemirror/view@6.35.3": + "@codemirror/view@6.36.1": resolution: { - integrity: sha512-ScY7L8+EGdPl4QtoBiOzE4FELp7JmNUsBvgBcCakXWM2uiv/K89VAzU3BMDscf0DsACLvTKePbd5+cFDTcei6g==, + integrity: sha512-miD1nyT4m4uopZaDdO2uXU/LLHliKNYL9kB1C1wJHrunHLm/rpkb5QVSokqgw9hFqEZakrdlb/VGWX8aYZTslQ==, } "@dprint/darwin-arm64@0.47.6": @@ -482,89 +477,89 @@ packages: chokidar: optional: true - "@swc/core-darwin-arm64@1.10.1": + "@swc/core-darwin-arm64@1.10.4": resolution: { - integrity: sha512-NyELPp8EsVZtxH/mEqvzSyWpfPJ1lugpTQcSlMduZLj1EASLO4sC8wt8hmL1aizRlsbjCX+r0PyL+l0xQ64/6Q==, + integrity: sha512-sV/eurLhkjn/197y48bxKP19oqcLydSel42Qsy2zepBltqUx+/zZ8+/IS0Bi7kaWVFxerbW1IPB09uq8Zuvm3g==, } engines: { node: ">=10" } cpu: [arm64] os: [darwin] - "@swc/core-darwin-x64@1.10.1": + "@swc/core-darwin-x64@1.10.4": resolution: { - integrity: sha512-L4BNt1fdQ5ZZhAk5qoDfUnXRabDOXKnXBxMDJ+PWLSxOGBbWE6aJTnu4zbGjJvtot0KM46m2LPAPY8ttknqaZA==, + integrity: sha512-gjYNU6vrAUO4+FuovEo9ofnVosTFXkF0VDuo1MKPItz6e2pxc2ale4FGzLw0Nf7JB1sX4a8h06CN16/pLJ8Q2w==, } engines: { node: ">=10" } cpu: [x64] os: [darwin] - "@swc/core-linux-arm-gnueabihf@1.10.1": + "@swc/core-linux-arm-gnueabihf@1.10.4": resolution: { - integrity: sha512-Y1u9OqCHgvVp2tYQAJ7hcU9qO5brDMIrA5R31rwWQIAKDkJKtv3IlTHF0hrbWk1wPR0ZdngkQSJZple7G+Grvw==, + integrity: sha512-zd7fXH5w8s+Sfvn2oO464KDWl+ZX1MJiVmE4Pdk46N3PEaNwE0koTfgx2vQRqRG4vBBobzVvzICC3618WcefOA==, } engines: { node: ">=10" } cpu: [arm] os: [linux] - "@swc/core-linux-arm64-gnu@1.10.1": + "@swc/core-linux-arm64-gnu@1.10.4": resolution: { - integrity: sha512-tNQHO/UKdtnqjc7o04iRXng1wTUXPgVd8Y6LI4qIbHVoVPwksZydISjMcilKNLKIwOoUQAkxyJ16SlOAeADzhQ==, + integrity: sha512-+UGfoHDxsMZgFD3tABKLeEZHqLNOkxStu+qCG7atGBhS4Slri6h6zijVvf4yI5X3kbXdvc44XV/hrP/Klnui2A==, } engines: { node: ">=10" } cpu: [arm64] os: [linux] - "@swc/core-linux-arm64-musl@1.10.1": + "@swc/core-linux-arm64-musl@1.10.4": resolution: { - integrity: sha512-x0L2Pd9weQ6n8dI1z1Isq00VHFvpBClwQJvrt3NHzmR+1wCT/gcYl1tp9P5xHh3ldM8Cn4UjWCw+7PaUgg8FcQ==, + integrity: sha512-cDDj2/uYsOH0pgAnDkovLZvKJpFmBMyXkxEG6Q4yw99HbzO6QzZ5HDGWGWVq/6dLgYKlnnmpjZCPPQIu01mXEg==, } engines: { node: ">=10" } cpu: [arm64] os: [linux] - "@swc/core-linux-x64-gnu@1.10.1": + "@swc/core-linux-x64-gnu@1.10.4": resolution: { - integrity: sha512-yyYEwQcObV3AUsC79rSzN9z6kiWxKAVJ6Ntwq2N9YoZqSPYph+4/Am5fM1xEQYf/kb99csj0FgOelomJSobxQA==, + integrity: sha512-qJXh9D6Kf5xSdGWPINpLGixAbB5JX8JcbEJpRamhlDBoOcQC79dYfOMEIxWPhTS1DGLyFakAx2FX/b2VmQmj0g==, } engines: { node: ">=10" } cpu: [x64] os: [linux] - "@swc/core-linux-x64-musl@1.10.1": + "@swc/core-linux-x64-musl@1.10.4": resolution: { - integrity: sha512-tcaS43Ydd7Fk7sW5ROpaf2Kq1zR+sI5K0RM+0qYLYYurvsJruj3GhBCaiN3gkzd8m/8wkqNqtVklWaQYSDsyqA==, + integrity: sha512-A76lIAeyQnHCVt0RL/pG+0er8Qk9+acGJqSZOZm67Ve3B0oqMd871kPtaHBM0BW3OZAhoILgfHW3Op9Q3mx3Cw==, } engines: { node: ">=10" } cpu: [x64] os: [linux] - "@swc/core-win32-arm64-msvc@1.10.1": + "@swc/core-win32-arm64-msvc@1.10.4": resolution: { - integrity: sha512-D3Qo1voA7AkbOzQ2UGuKNHfYGKL6eejN8VWOoQYtGHHQi1p5KK/Q7V1ku55oxXBsj79Ny5FRMqiRJpVGad7bjQ==, + integrity: sha512-e6j5kBu4fIY7fFxFxnZI0MlEovRvp50Lg59Fw+DVbtqHk3C85dckcy5xKP+UoXeuEmFceauQDczUcGs19SRGSQ==, } engines: { node: ">=10" } cpu: [arm64] os: [win32] - "@swc/core-win32-ia32-msvc@1.10.1": + "@swc/core-win32-ia32-msvc@1.10.4": resolution: { - integrity: sha512-WalYdFoU3454Og+sDKHM1MrjvxUGwA2oralknXkXL8S0I/8RkWZOB++p3pLaGbTvOO++T+6znFbQdR8KRaa7DA==, + integrity: sha512-RSYHfdKgNXV/amY5Tqk1EWVsyQnhlsM//jeqMLw5Fy9rfxP592W9UTumNikNRPdjI8wKKzNMXDb1U29tQjN0dg==, } engines: { node: ">=10" } cpu: [ia32] os: [win32] - "@swc/core-win32-x64-msvc@1.10.1": + "@swc/core-win32-x64-msvc@1.10.4": resolution: { - integrity: sha512-JWobfQDbTnoqaIwPKQ3DVSywihVXlQMbDuwik/dDWlj33A8oEHcjPOGs4OqcA3RHv24i+lfCQpM3Mn4FAMfacA==, + integrity: sha512-1ujYpaqfqNPYdwKBlvJnOqcl+Syn3UrQ4XE0Txz6zMYgyh6cdU6a3pxqLqIUSJ12MtXRA9ZUhEz1ekU3LfLWXw==, } engines: { node: ">=10" } cpu: [x64] os: [win32] - "@swc/core@1.10.1": + "@swc/core@1.10.4": resolution: { - integrity: sha512-rQ4dS6GAdmtzKiCRt3LFVxl37FaY1cgL9kSUTnhQ2xc3fmHOd7jdJK/V4pSZMG1ruGTd0bsi34O2R0Olg9Zo/w==, + integrity: sha512-ut3zfiTLORMxhr6y/GBxkHmzcGuVpwJYX4qyXWuBKkpw/0g0S5iO1/wW7RnLnZbAi8wS/n0atRZoaZlXWBkeJg==, } engines: { node: ">=10" } peerDependencies: @@ -627,9 +622,9 @@ packages: integrity: sha512-wz7kjjRRj8/Lty4B+Kr0LN6Ypc/3SymeCCGSbaXp2leH0ZVg/PriNiOwNj4bD4uphI7A8NXS4b6Gl373sfO5mA==, } - "@typescript-eslint/eslint-plugin@8.18.0": + "@typescript-eslint/eslint-plugin@8.18.2": resolution: { - integrity: sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==, + integrity: sha512-adig4SzPLjeQ0Tm+jvsozSGiCliI2ajeURDGHjZ2llnA+A67HihCQ+a3amtPhUakd1GlwHxSRvzOZktbEvhPPg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: @@ -637,56 +632,56 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - "@typescript-eslint/parser@8.18.0": + "@typescript-eslint/parser@8.18.2": resolution: { - integrity: sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==, + integrity: sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - "@typescript-eslint/scope-manager@8.18.0": + "@typescript-eslint/scope-manager@8.18.2": resolution: { - integrity: sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==, + integrity: sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - "@typescript-eslint/type-utils@8.18.0": + "@typescript-eslint/type-utils@8.18.2": resolution: { - integrity: sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==, + integrity: sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - "@typescript-eslint/types@8.18.0": + "@typescript-eslint/types@8.18.2": resolution: { - integrity: sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==, + integrity: sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - "@typescript-eslint/typescript-estree@8.18.0": + "@typescript-eslint/typescript-estree@8.18.2": resolution: { - integrity: sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==, + integrity: sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: ">=4.8.4 <5.8.0" - "@typescript-eslint/utils@8.18.0": + "@typescript-eslint/utils@8.18.2": resolution: { - integrity: sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==, + integrity: sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - "@typescript-eslint/visitor-keys@8.18.0": + "@typescript-eslint/visitor-keys@8.18.2": resolution: { - integrity: sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==, + integrity: sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -1121,9 +1116,9 @@ packages: integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==, } - domutils@3.1.0: + domutils@3.2.1: resolution: { - integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==, + integrity: sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==, } dprint@0.47.6: @@ -1293,9 +1288,9 @@ packages: integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, } - fastq@1.17.1: + fastq@1.18.0: resolution: { - integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, + integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==, } file-entry-cache@8.0.0: @@ -1412,9 +1407,9 @@ packages: } engines: { node: ">=18" } - globals@15.13.0: + globals@15.14.0: resolution: { - integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==, + integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==, } engines: { node: ">=18" } @@ -2363,9 +2358,9 @@ packages: } engines: { node: ">= 0.8.0" } - typescript-eslint@8.18.0: + typescript-eslint@8.18.2: resolution: { - integrity: sha512-Xq2rRjn6tzVpAyHr3+nmSg1/9k9aIHnJ2iZeOH7cfGOWqTkXTm3kwpQglEuLGdNrYvPF+2gtAs+/KF5rjVo+WQ==, + integrity: sha512-KuXezG6jHkvC3MvizeXgupZzaG5wjhU3yE8E7e6viOvAvD9xAWYp8/vy0WULTGe9DYDWcQu7aW03YIV3mSitrQ==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: @@ -2494,35 +2489,33 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - "@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3)": + "@codemirror/autocomplete@6.18.4": dependencies: - "@codemirror/language": 6.10.6 + "@codemirror/language": 6.10.8 "@codemirror/state": 6.5.0 - "@codemirror/view": 6.35.3 + "@codemirror/view": 6.36.1 "@lezer/common": 1.2.3 "@codemirror/commands@6.7.1": dependencies: - "@codemirror/language": 6.10.6 + "@codemirror/language": 6.10.8 "@codemirror/state": 6.5.0 - "@codemirror/view": 6.35.3 + "@codemirror/view": 6.36.1 "@lezer/common": 1.2.3 - "@codemirror/lang-sql@6.8.0(@codemirror/view@6.35.3)": + "@codemirror/lang-sql@6.8.0": dependencies: - "@codemirror/autocomplete": 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3) - "@codemirror/language": 6.10.6 + "@codemirror/autocomplete": 6.18.4 + "@codemirror/language": 6.10.8 "@codemirror/state": 6.5.0 "@lezer/common": 1.2.3 "@lezer/highlight": 1.2.1 "@lezer/lr": 1.4.2 - transitivePeerDependencies: - - "@codemirror/view" - "@codemirror/language@6.10.6": + "@codemirror/language@6.10.8": dependencies: "@codemirror/state": 6.5.0 - "@codemirror/view": 6.35.3 + "@codemirror/view": 6.36.1 "@lezer/common": 1.2.3 "@lezer/highlight": 1.2.1 "@lezer/lr": 1.4.2 @@ -2531,20 +2524,20 @@ snapshots: "@codemirror/lint@6.8.4": dependencies: "@codemirror/state": 6.5.0 - "@codemirror/view": 6.35.3 + "@codemirror/view": 6.36.1 crelt: 1.0.6 "@codemirror/search@6.5.8": dependencies: "@codemirror/state": 6.5.0 - "@codemirror/view": 6.35.3 + "@codemirror/view": 6.36.1 crelt: 1.0.6 "@codemirror/state@6.5.0": dependencies: "@marijn/find-cluster-break": 1.0.2 - "@codemirror/view@6.35.3": + "@codemirror/view@6.36.1": dependencies: "@codemirror/state": 6.5.0 style-mod: 4.1.2 @@ -2736,7 +2729,7 @@ snapshots: "@nodelib/fs.walk@1.2.8": dependencies: "@nodelib/fs.scandir": 2.1.5 - fastq: 1.17.1 + fastq: 1.18.0 "@one-ini/wasm@0.1.1": {} @@ -2749,9 +2742,9 @@ snapshots: "@sindresorhus/is@5.6.0": {} - "@swc/cli@0.5.2(@swc/core@1.10.1)(chokidar@3.6.0)": + "@swc/cli@0.5.2(@swc/core@1.10.4)(chokidar@3.6.0)": dependencies: - "@swc/core": 1.10.1 + "@swc/core": 1.10.4 "@swc/counter": 0.1.3 "@xhmikosr/bin-wrapper": 13.0.5 commander: 8.3.0 @@ -2764,51 +2757,51 @@ snapshots: optionalDependencies: chokidar: 3.6.0 - "@swc/core-darwin-arm64@1.10.1": + "@swc/core-darwin-arm64@1.10.4": optional: true - "@swc/core-darwin-x64@1.10.1": + "@swc/core-darwin-x64@1.10.4": optional: true - "@swc/core-linux-arm-gnueabihf@1.10.1": + "@swc/core-linux-arm-gnueabihf@1.10.4": optional: true - "@swc/core-linux-arm64-gnu@1.10.1": + "@swc/core-linux-arm64-gnu@1.10.4": optional: true - "@swc/core-linux-arm64-musl@1.10.1": + "@swc/core-linux-arm64-musl@1.10.4": optional: true - "@swc/core-linux-x64-gnu@1.10.1": + "@swc/core-linux-x64-gnu@1.10.4": optional: true - "@swc/core-linux-x64-musl@1.10.1": + "@swc/core-linux-x64-musl@1.10.4": optional: true - "@swc/core-win32-arm64-msvc@1.10.1": + "@swc/core-win32-arm64-msvc@1.10.4": optional: true - "@swc/core-win32-ia32-msvc@1.10.1": + "@swc/core-win32-ia32-msvc@1.10.4": optional: true - "@swc/core-win32-x64-msvc@1.10.1": + "@swc/core-win32-x64-msvc@1.10.4": optional: true - "@swc/core@1.10.1": + "@swc/core@1.10.4": dependencies: "@swc/counter": 0.1.3 "@swc/types": 0.1.17 optionalDependencies: - "@swc/core-darwin-arm64": 1.10.1 - "@swc/core-darwin-x64": 1.10.1 - "@swc/core-linux-arm-gnueabihf": 1.10.1 - "@swc/core-linux-arm64-gnu": 1.10.1 - "@swc/core-linux-arm64-musl": 1.10.1 - "@swc/core-linux-x64-gnu": 1.10.1 - "@swc/core-linux-x64-musl": 1.10.1 - "@swc/core-win32-arm64-msvc": 1.10.1 - "@swc/core-win32-ia32-msvc": 1.10.1 - "@swc/core-win32-x64-msvc": 1.10.1 + "@swc/core-darwin-arm64": 1.10.4 + "@swc/core-darwin-x64": 1.10.4 + "@swc/core-linux-arm-gnueabihf": 1.10.4 + "@swc/core-linux-arm64-gnu": 1.10.4 + "@swc/core-linux-arm64-musl": 1.10.4 + "@swc/core-linux-x64-gnu": 1.10.4 + "@swc/core-linux-x64-musl": 1.10.4 + "@swc/core-win32-arm64-msvc": 1.10.4 + "@swc/core-win32-ia32-msvc": 1.10.4 + "@swc/core-win32-x64-msvc": 1.10.4 "@swc/counter@0.1.3": {} @@ -2843,14 +2836,14 @@ snapshots: "@types/webpack-env@1.18.5": {} - "@typescript-eslint/eslint-plugin@8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2)": + "@typescript-eslint/eslint-plugin@8.18.2(@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2)": dependencies: "@eslint-community/regexpp": 4.12.1 - "@typescript-eslint/parser": 8.18.0(eslint@9.17.0)(typescript@5.7.2) - "@typescript-eslint/scope-manager": 8.18.0 - "@typescript-eslint/type-utils": 8.18.0(eslint@9.17.0)(typescript@5.7.2) - "@typescript-eslint/utils": 8.18.0(eslint@9.17.0)(typescript@5.7.2) - "@typescript-eslint/visitor-keys": 8.18.0 + "@typescript-eslint/parser": 8.18.2(eslint@9.17.0)(typescript@5.7.2) + "@typescript-eslint/scope-manager": 8.18.2 + "@typescript-eslint/type-utils": 8.18.2(eslint@9.17.0)(typescript@5.7.2) + "@typescript-eslint/utils": 8.18.2(eslint@9.17.0)(typescript@5.7.2) + "@typescript-eslint/visitor-keys": 8.18.2 eslint: 9.17.0 graphemer: 1.4.0 ignore: 5.3.2 @@ -2860,27 +2853,27 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/parser@8.18.0(eslint@9.17.0)(typescript@5.7.2)": + "@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.7.2)": dependencies: - "@typescript-eslint/scope-manager": 8.18.0 - "@typescript-eslint/types": 8.18.0 - "@typescript-eslint/typescript-estree": 8.18.0(typescript@5.7.2) - "@typescript-eslint/visitor-keys": 8.18.0 + "@typescript-eslint/scope-manager": 8.18.2 + "@typescript-eslint/types": 8.18.2 + "@typescript-eslint/typescript-estree": 8.18.2(typescript@5.7.2) + "@typescript-eslint/visitor-keys": 8.18.2 debug: 4.4.0 eslint: 9.17.0 typescript: 5.7.2 transitivePeerDependencies: - supports-color - "@typescript-eslint/scope-manager@8.18.0": + "@typescript-eslint/scope-manager@8.18.2": dependencies: - "@typescript-eslint/types": 8.18.0 - "@typescript-eslint/visitor-keys": 8.18.0 + "@typescript-eslint/types": 8.18.2 + "@typescript-eslint/visitor-keys": 8.18.2 - "@typescript-eslint/type-utils@8.18.0(eslint@9.17.0)(typescript@5.7.2)": + "@typescript-eslint/type-utils@8.18.2(eslint@9.17.0)(typescript@5.7.2)": dependencies: - "@typescript-eslint/typescript-estree": 8.18.0(typescript@5.7.2) - "@typescript-eslint/utils": 8.18.0(eslint@9.17.0)(typescript@5.7.2) + "@typescript-eslint/typescript-estree": 8.18.2(typescript@5.7.2) + "@typescript-eslint/utils": 8.18.2(eslint@9.17.0)(typescript@5.7.2) debug: 4.4.0 eslint: 9.17.0 ts-api-utils: 1.4.3(typescript@5.7.2) @@ -2888,12 +2881,12 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/types@8.18.0": {} + "@typescript-eslint/types@8.18.2": {} - "@typescript-eslint/typescript-estree@8.18.0(typescript@5.7.2)": + "@typescript-eslint/typescript-estree@8.18.2(typescript@5.7.2)": dependencies: - "@typescript-eslint/types": 8.18.0 - "@typescript-eslint/visitor-keys": 8.18.0 + "@typescript-eslint/types": 8.18.2 + "@typescript-eslint/visitor-keys": 8.18.2 debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -2904,20 +2897,20 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/utils@8.18.0(eslint@9.17.0)(typescript@5.7.2)": + "@typescript-eslint/utils@8.18.2(eslint@9.17.0)(typescript@5.7.2)": dependencies: "@eslint-community/eslint-utils": 4.4.1(eslint@9.17.0) - "@typescript-eslint/scope-manager": 8.18.0 - "@typescript-eslint/types": 8.18.0 - "@typescript-eslint/typescript-estree": 8.18.0(typescript@5.7.2) + "@typescript-eslint/scope-manager": 8.18.2 + "@typescript-eslint/types": 8.18.2 + "@typescript-eslint/typescript-estree": 8.18.2(typescript@5.7.2) eslint: 9.17.0 typescript: 5.7.2 transitivePeerDependencies: - supports-color - "@typescript-eslint/visitor-keys@8.18.0": + "@typescript-eslint/visitor-keys@8.18.2": dependencies: - "@typescript-eslint/types": 8.18.0 + "@typescript-eslint/types": 8.18.2 eslint-visitor-keys: 4.2.0 "@xhmikosr/archive-type@7.0.0": @@ -3109,14 +3102,14 @@ snapshots: css-what: 6.1.0 domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.1 cheerio@1.0.0-rc.12: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.1 htmlparser2: 8.0.2 parse5: 7.2.1 parse5-htmlparser2-tree-adapter: 7.1.0 @@ -3143,17 +3136,15 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - codemirror@6.0.1(@lezer/common@1.2.3): + codemirror@6.0.1: dependencies: - "@codemirror/autocomplete": 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.5.0)(@codemirror/view@6.35.3)(@lezer/common@1.2.3) + "@codemirror/autocomplete": 6.18.4 "@codemirror/commands": 6.7.1 - "@codemirror/language": 6.10.6 + "@codemirror/language": 6.10.8 "@codemirror/lint": 6.8.4 "@codemirror/search": 6.5.8 "@codemirror/state": 6.5.0 - "@codemirror/view": 6.35.3 - transitivePeerDependencies: - - "@lezer/common" + "@codemirror/view": 6.36.1 color-convert@2.0.1: dependencies: @@ -3193,7 +3184,7 @@ snapshots: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.1 nth-check: 2.1.1 css-what@6.1.0: {} @@ -3246,7 +3237,7 @@ snapshots: domelementtype: 2.3.0 domhandler: 4.3.1 - domutils@3.1.0: + domutils@3.2.1: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -3392,7 +3383,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.17.1: + fastq@1.18.0: dependencies: reusify: 1.0.4 @@ -3471,7 +3462,7 @@ snapshots: globals@14.0.0: {} - globals@15.13.0: {} + globals@15.14.0: {} got@13.0.0: dependencies: @@ -3516,14 +3507,14 @@ snapshots: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.1 entities: 4.5.0 htmlparser2@9.1.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.1 entities: 4.5.0 http-cache-semantics@4.1.1: {} @@ -4229,11 +4220,11 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.18.0(eslint@9.17.0)(typescript@5.7.2): + typescript-eslint@8.18.2(eslint@9.17.0)(typescript@5.7.2): dependencies: - "@typescript-eslint/eslint-plugin": 8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2) - "@typescript-eslint/parser": 8.18.0(eslint@9.17.0)(typescript@5.7.2) - "@typescript-eslint/utils": 8.18.0(eslint@9.17.0)(typescript@5.7.2) + "@typescript-eslint/eslint-plugin": 8.18.2(@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2) + "@typescript-eslint/parser": 8.18.2(eslint@9.17.0)(typescript@5.7.2) + "@typescript-eslint/utils": 8.18.2(eslint@9.17.0)(typescript@5.7.2) eslint: 9.17.0 typescript: 5.7.2 transitivePeerDependencies: diff --git a/src/Command/CreateUserCommand.php b/src/Command/CreateUserCommand.php index 52832c4..bdc8748 100644 --- a/src/Command/CreateUserCommand.php +++ b/src/Command/CreateUserCommand.php @@ -67,7 +67,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->entityManager->persist($user); $this->entityManager->flush(); - $io->success("Created a user $email with password: $password"); + $io->success("Created a user {$email} with password: {$password}"); return Command::SUCCESS; } diff --git a/src/Command/CreateUsersCommand.php b/src/Command/CreateUsersCommand.php index 04c36c0..3643868 100644 --- a/src/Command/CreateUsersCommand.php +++ b/src/Command/CreateUsersCommand.php @@ -47,6 +47,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int * @var string $filename */ $filename = $input->getArgument('filename'); + /** * @var bool $dryRun */ @@ -54,15 +55,15 @@ protected function execute(InputInterface $input, OutputInterface $output): int $file = fopen($filename, 'r'); if (false === $file) { - $io->error("Could not open file $filename for reading."); + $io->error("Could not open file {$filename} for reading."); return Command::FAILURE; } - $io->title("Creating users from $filename"); + $io->title("Creating users from {$filename}"); /** - * @var array{email: string, name: string, roles: list, group: string|null}[] $users + * @var array{email: string, name: string, roles: list, group: null|string}[] $users */ $users = $io->progressIterate(self::parseUsers($filename)); @@ -77,7 +78,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $password = self::generateRandomPassword(); /** - * @var Group|null $group + * @var null|Group $group */ $group = null; @@ -85,6 +86,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $group = $this->entityManager->getRepository(Group::class)->findOneBy(['name' => $user['group']]); if (null === $group) { $io->warning("Group {$user['group']} not found for user {$user['email']}. Skipping."); + continue; } } @@ -93,7 +95,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int ->setName($user['name']) ->setEmail($user['email']) ->setRoles($user['roles']) - ->setGroup($group); + ->setGroup($group) + ; $hashedPassword = $this->passwordHasher->hashPassword($user, $password); $user->setPassword($hashedPassword); @@ -114,25 +117,25 @@ protected function execute(InputInterface $input, OutputInterface $output): int } else { $this->entityManager->commit(); $this->entityManager->flush(); - $io->success("Created users from $filename"); + $io->success("Created users from {$filename}"); } return Command::SUCCESS; } /** - * @return array{email: string, name: string, roles: list, group: string|null}[] + * @return array{email: string, name: string, roles: list, group: null|string}[] */ private static function parseUsers(string $filename): array { $file = fopen($filename, 'r'); if (false === $file) { - throw new \RuntimeException("Could not open file $filename for reading."); + throw new \RuntimeException("Could not open file {$filename} for reading."); } $header = fgetcsv($file); if (false === $header) { - throw new \RuntimeException("Could not read header from $filename."); + throw new \RuntimeException("Could not read header from {$filename}."); } $emailIndex = array_search('email', $header, true); @@ -141,7 +144,7 @@ private static function parseUsers(string $filename): array $groupIndex = array_search('group', $header, true); if (!\is_int($emailIndex) || !\is_int($nameIndex) || !\is_int($rolesIndex)) { - throw new \RuntimeException("Could not find email, name, or roles in the header of $filename."); + throw new \RuntimeException("Could not find email, name, or roles in the header of {$filename}."); } $users = []; @@ -152,7 +155,7 @@ private static function parseUsers(string $filename): array $group = false !== $groupIndex ? $row[$groupIndex] : null; if (!\is_string($email) || !\is_string($name) || !\is_string($roles) || !\is_string($group)) { - throw new \RuntimeException("Invalid row in $filename."); + throw new \RuntimeException("Invalid row in {$filename}."); } $users[] = [ @@ -175,7 +178,7 @@ private static function writePasswordList(string $filename, array $userPasswordP { $file = fopen($filename, 'w'); if (false === $file) { - throw new \RuntimeException("Could not open file $filename for writing."); + throw new \RuntimeException("Could not open file {$filename} for writing."); } fputcsv($file, array_keys($userPasswordPair[0])); diff --git a/src/Command/Email/SendLoginReminderCommand.php b/src/Command/Email/SendLoginReminderCommand.php index bc00ed5..608d2dc 100644 --- a/src/Command/Email/SendLoginReminderCommand.php +++ b/src/Command/Email/SendLoginReminderCommand.php @@ -4,6 +4,8 @@ namespace App\Command\Email; +use App\Entity\EmailDto\EmailDto; +use App\Service\EmailService; use App\Service\StrategicEmailService; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; @@ -17,6 +19,7 @@ class SendLoginReminderCommand extends Command { public function __construct( private readonly StrategicEmailService $strategicEmailService, + private readonly EmailService $emailService, ) { parent::__construct(); } @@ -24,33 +27,51 @@ public function __construct( protected function configure(): void { $this->addOption('dry-run', 'd', InputOption::VALUE_NONE, 'Whether to send the email or not'); + $this->addOption('test-email', 't', InputOption::VALUE_NONE, 'Send the test email to the test email address'); } protected function execute(InputInterface $input, OutputInterface $output): int { $io = new SymfonyStyle($input, $output); $dryRun = $input->getOption('dry-run'); + $testEmail = $input->getOption('test-email'); - $result = $this->strategicEmailService->sendLoginReminderEmail($dryRun); + if (!$dryRun && $testEmail) { + $io->error('The --test-email option can only be used with the --dry-run option.'); - if (null !== $result) { - $table = $io->createTable(); - - $table->setHeaderTitle('Email to be sent'); - $table->setHeaders(['Field', 'Value']); - $table->addRow(['Subject', $result->getSubject()]); - $table->addRow(['To', $result->getToAddress()->toString()]); + return Command::FAILURE; + } - $bcc = implode(', ', array_map(fn ($address) => $address->toString(), $result->getBcc())); - $table->addRow(['Bcc', $bcc]); + $target = ($dryRun && $testEmail) + ? fn (EmailDto $emailDto) => $this->sendTestEmailDto($io, $emailDto) + : ($dryRun + ? fn (EmailDto $emailDto) => $this->printEmailDto($io, $emailDto) + : fn (EmailDto $emailDto) => $this->sendEmailDto($io, $emailDto)); - $table->addRow(['Kind', $result->getKind()->value]); - $table->addRow(['Content', $result->getText()]); - $table->render(); - } else { - $io->success('Emails have been sent successfully.'); - } + $this->strategicEmailService->sendLoginReminderEmail($target); return Command::SUCCESS; } + + private function printEmailDto(SymfonyStyle $io, EmailDto $emailDto): void + { + $io->writeln('Email to be sent:'); + $io->writeln('Subject: '.$emailDto->getSubject()); + $io->writeln('To: '.$emailDto->getToAddress()->toString()); + $io->writeln('Bcc: '.implode(', ', array_map(static fn ($address) => $address->toString(), $emailDto->getBcc()))); + $io->writeln('Kind: '.$emailDto->getKind()->value); + $io->writeln('Content: '.$emailDto->getText()); + } + + private function sendEmailDto(SymfonyStyle $io, EmailDto $emailDto): void + { + $this->emailService->send($emailDto); + $io->success('Email sent successfully.'); + } + + private function sendTestEmailDto(SymfonyStyle $io, EmailDto $emailDto): void + { + $this->emailService->sendToTest($emailDto); + $io->success('Test email sent successfully.'); + } } diff --git a/src/Command/ExportCommand.php b/src/Command/ExportCommand.php index 7e1fc38..cd4332d 100644 --- a/src/Command/ExportCommand.php +++ b/src/Command/ExportCommand.php @@ -72,16 +72,16 @@ protected function execute(InputInterface $input, OutputInterface $output): int $io->info('Exporting schema and questions…'); $serialized = $this->serializer->serialize($exportedData, 'json', [ - 'json_encode_options' => \JSON_PRETTY_PRINT | \JSON_UNESCAPED_UNICODE, + 'json_encode_options' => JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE, ]); if (false === file_put_contents($filename, $serialized)) { - $io->error("Cannot write to the file $filename."); + $io->error("Cannot write to the file {$filename}."); return Command::FAILURE; } - $io->success("Exported schema and questions to $filename."); + $io->success("Exported schema and questions to {$filename}."); return Command::SUCCESS; } diff --git a/src/Command/ImportCommand.php b/src/Command/ImportCommand.php index 00a8194..0d82282 100644 --- a/src/Command/ImportCommand.php +++ b/src/Command/ImportCommand.php @@ -45,14 +45,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int $io->info('Unmarshaling schema and questions…'); $content = file_get_contents($filename); if (false === $content) { - $io->error("Cannot read the file $filename."); + $io->error("Cannot read the file {$filename}."); return Command::FAILURE; } $exportedData = $this->serializer->deserialize($content, ExportedDataDto::class, 'json'); - $this->entityManager->wrapInTransaction(function (EntityManagerInterface $em) use ($io, $exportedData): void { + $this->entityManager->wrapInTransaction(static function (EntityManagerInterface $em) use ($io, $exportedData): void { $schemaRepository = $em->getRepository(Schema::class); $io->info('Importing schema…'); @@ -60,6 +60,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $existingSchema = $schemaRepository->find($schema->getId()); if (null !== $existingSchema) { $io->info("Schema {$schema->getId()} already exists, skipping…"); + continue; } @@ -77,7 +78,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $em->flush(); }); - $io->success("Imported schema and questions from $filename."); + $io->success("Imported schema and questions from {$filename}."); return Command::SUCCESS; } diff --git a/src/Controller/Admin/CommentLikeEventCrudController.php b/src/Controller/Admin/CommentLikeEventCrudController.php index 63b6aa9..e5b4c8e 100644 --- a/src/Controller/Admin/CommentLikeEventCrudController.php +++ b/src/Controller/Admin/CommentLikeEventCrudController.php @@ -35,13 +35,15 @@ public function configureFilters(Filters $filters): Filters { return $filters ->add('liker') - ->add('comment'); + ->add('comment') + ; } public function configureActions(Actions $actions): Actions { return $actions ->disable(Action::DELETE, Action::EDIT, Action::NEW) - ->add(Crud::PAGE_INDEX, Action::DETAIL); + ->add(Crud::PAGE_INDEX, Action::DETAIL) + ; } } diff --git a/src/Controller/Admin/DashboardController.php b/src/Controller/Admin/DashboardController.php index 9c1a8ae..07a9159 100644 --- a/src/Controller/Admin/DashboardController.php +++ b/src/Controller/Admin/DashboardController.php @@ -29,8 +29,7 @@ class DashboardController extends AbstractDashboardController { public function __construct( private readonly AdminUrlGenerator $adminUrlGenerator, - ) { - } + ) {} #[Route('/admin', name: 'admin')] public function index(): Response @@ -43,7 +42,8 @@ public function index(): Response public function configureDashboard(): Dashboard { return Dashboard::new() - ->setTitle('Database Playground application'); + ->setTitle('Database Playground application') + ; } public function configureMenuItems(): iterable @@ -51,37 +51,55 @@ public function configureMenuItems(): iterable yield MenuItem::linkToRoute('Back to App', 'fa fa-arrow-left', 'app_home'); yield MenuItem::section('Statistics'); + yield MenuItem::linkToRoute('Last login at', 'fa fa-sign-in-alt', 'admin_statistic_last_login_at'); + yield MenuItem::linkToRoute('Completed Questions', 'fa fa-trophy', 'admin_statistic_completed_questions'); + yield MenuItem::linkToRoute('Experience Points', 'fa fa-coins', 'admin_statistic_experience_points'); yield MenuItem::section('User management'); + yield MenuItem::linkToCrud('User', 'fa fa-user', User::class); + yield MenuItem::linkToCrud('Group', 'fa fa-users', Group::class); yield MenuItem::section('Question management'); + yield MenuItem::linkToCrud('Schema', 'fa fa-database', Schema::class); + yield MenuItem::linkToCrud('Questions', 'fa fa-question', Question::class); yield MenuItem::section('System Management'); + yield MenuItem::linkToCrud('Announcement', 'fa fa-bullhorn', Announcement::class); yield MenuItem::section('Comments'); + yield MenuItem::linkToCrud('Comment', 'fa fa-comment', Comment::class); + yield MenuItem::linkToCrud('CommentLikeEvent', 'fa fa-thumbs-up', CommentLikeEvent::class); yield MenuItem::section('Mails'); + yield MenuItem::linkToRoute('EmailTemplates', 'fa fa-layer-group', 'admin_emailtemplate_index'); + yield MenuItem::linkToCrud('Email', 'fa fa-envelope', Email::class); + yield MenuItem::linkToCrud('EmailDeliveryEvent', 'fa fa-paper-plane', EmailDeliveryEvent::class); yield MenuItem::section('Events'); + yield MenuItem::linkToCrud('SolutionEvent', 'fa fa-check', SolutionEvent::class); + yield MenuItem::linkToCrud('SolutionVideoEvent', 'fa fa-video', SolutionVideoEvent::class); + yield MenuItem::linkToCrud('HintOpenEvent', 'fa fa-lightbulb', HintOpenEvent::class); + yield MenuItem::linkToCrud('LoginEvent', 'fa fa-right-to-bracket', LoginEvent::class); yield MenuItem::section('Feedback'); + yield MenuItem::linkToCrud('Feedback', 'fa fa-comments', Feedback::class); } } diff --git a/src/Controller/Admin/EmailDeliveryEventCrudController.php b/src/Controller/Admin/EmailDeliveryEventCrudController.php index 452406a..e5ab16b 100644 --- a/src/Controller/Admin/EmailDeliveryEventCrudController.php +++ b/src/Controller/Admin/EmailDeliveryEventCrudController.php @@ -46,13 +46,15 @@ public function configureActions(Actions $actions): Actions ->linkToUrl(fn (EmailDeliveryEvent $event) => $this->generateUrl( 'app_email_preview', ['event' => $event->getId()] - )); + )) + ; return $actions ->disable(Action::DELETE, Action::EDIT, Action::NEW) ->add(Crud::PAGE_INDEX, Action::DETAIL) ->add(Crud::PAGE_INDEX, $previewAction) - ->add(Crud::PAGE_DETAIL, $previewAction); + ->add(Crud::PAGE_DETAIL, $previewAction) + ; } public function configureCrud(Crud $crud): Crud diff --git a/src/Controller/Admin/EmailTemplateController.php b/src/Controller/Admin/EmailTemplateController.php index 9329653..f33ec75 100644 --- a/src/Controller/Admin/EmailTemplateController.php +++ b/src/Controller/Admin/EmailTemplateController.php @@ -31,7 +31,7 @@ public function index(): Response } $templateFiles = array_map( - fn (string $file) => basename($file, '.mjml.twig'), + static fn (string $file) => basename($file, '.mjml.twig'), $templateFiles ); diff --git a/src/Controller/Admin/HintOpenEventCrudController.php b/src/Controller/Admin/HintOpenEventCrudController.php index afda5df..a9967ba 100644 --- a/src/Controller/Admin/HintOpenEventCrudController.php +++ b/src/Controller/Admin/HintOpenEventCrudController.php @@ -39,13 +39,15 @@ public function configureFilters(Filters $filters): Filters { return $filters ->add('opener') - ->add('question'); + ->add('question') + ; } public function configureActions(Actions $actions): Actions { return $actions ->disable(Action::DELETE, Action::EDIT, Action::NEW) - ->add(Crud::PAGE_INDEX, Action::DETAIL); + ->add(Crud::PAGE_INDEX, Action::DETAIL) + ; } } diff --git a/src/Controller/Admin/LoginEventCrudController.php b/src/Controller/Admin/LoginEventCrudController.php index 2d84e3e..57b30f1 100644 --- a/src/Controller/Admin/LoginEventCrudController.php +++ b/src/Controller/Admin/LoginEventCrudController.php @@ -39,6 +39,7 @@ public function configureActions(Actions $actions): Actions { return $actions ->disable(Action::DELETE, Action::EDIT, Action::NEW) - ->add(Crud::PAGE_INDEX, Action::DETAIL); + ->add(Crud::PAGE_INDEX, Action::DETAIL) + ; } } diff --git a/src/Controller/Admin/QuestionCrudController.php b/src/Controller/Admin/QuestionCrudController.php index c14106a..838f00a 100644 --- a/src/Controller/Admin/QuestionCrudController.php +++ b/src/Controller/Admin/QuestionCrudController.php @@ -48,7 +48,8 @@ public function configureActions(Actions $actions): Actions { $reindex = Action::new('reindex', 'Reindex', 'fa fa-arrows-rotate') ->linkToCrudAction('reindex') - ->createAsGlobalAction(); + ->createAsGlobalAction() + ; return $actions->add(Crud::PAGE_INDEX, $reindex); } diff --git a/src/Controller/Admin/SolutionEventCrudController.php b/src/Controller/Admin/SolutionEventCrudController.php index 594e077..8083534 100644 --- a/src/Controller/Admin/SolutionEventCrudController.php +++ b/src/Controller/Admin/SolutionEventCrudController.php @@ -48,13 +48,15 @@ public function configureFilters(Filters $filters): Filters 'Passed' => SolutionEventStatus::Passed, 'Failed' => SolutionEventStatus::Failed, ]) - ); + ) + ; } public function configureActions(Actions $actions): Actions { return $actions ->disable(Action::DELETE, Action::EDIT, Action::NEW) - ->add(Crud::PAGE_INDEX, Action::DETAIL); + ->add(Crud::PAGE_INDEX, Action::DETAIL) + ; } } diff --git a/src/Controller/Admin/SolutionVideoEventCrudController.php b/src/Controller/Admin/SolutionVideoEventCrudController.php index 1f99a65..87ed2c1 100644 --- a/src/Controller/Admin/SolutionVideoEventCrudController.php +++ b/src/Controller/Admin/SolutionVideoEventCrudController.php @@ -35,13 +35,15 @@ public function configureFilters(Filters $filters): Filters { return $filters ->add('opener') - ->add('question'); + ->add('question') + ; } public function configureActions(Actions $actions): Actions { return $actions ->disable(Action::DELETE, Action::EDIT, Action::NEW) - ->add(Crud::PAGE_INDEX, Action::DETAIL); + ->add(Crud::PAGE_INDEX, Action::DETAIL) + ; } } diff --git a/src/Controller/Admin/StatisticController.php b/src/Controller/Admin/StatisticController.php index 4ef1651..bf55112 100644 --- a/src/Controller/Admin/StatisticController.php +++ b/src/Controller/Admin/StatisticController.php @@ -17,8 +17,7 @@ class StatisticController extends AbstractController { public function __construct( private readonly StatisticsService $statisticsService, - ) { - } + ) {} #[Route('/admin/statistic/last-login-at', name: 'admin_statistic_last_login_at')] public function lastLoginAt(): Response @@ -47,7 +46,8 @@ public function completedQuestions(UserRepository $userRepository, QuestionRepos ->orderBy('solved_questions', 'DESC') ->setParameter('status', SolutionEventStatus::Passed) ->getQuery() - ->getResult(); + ->getResult() + ; return $this->render('admin/statistics/completed_questions.html.twig', [ 'totalQuestions' => $totalQuestions, @@ -75,7 +75,7 @@ public function experiencePoint(PointCalculationService $pointCalculationService ]; } - usort($usersWithPoints, fn (array $a, array $b) => $b['points'] <=> $a['points']); + usort($usersWithPoints, static fn (array $a, array $b) => $b['points'] <=> $a['points']); return $this->render('admin/statistics/experience_points.html.twig', [ 'usersWithPoints' => $usersWithPoints, diff --git a/src/Controller/Admin/UserCrudController.php b/src/Controller/Admin/UserCrudController.php index c246800..a6be619 100644 --- a/src/Controller/Admin/UserCrudController.php +++ b/src/Controller/Admin/UserCrudController.php @@ -22,8 +22,7 @@ class UserCrudController extends AbstractCrudController { public function __construct( public UserPasswordHasherInterface $userPasswordHasher, - ) { - } + ) {} public static function getEntityFqcn(): string { @@ -64,7 +63,7 @@ public function configureActions(Actions $actions): Actions return $actions->add( Crud::PAGE_INDEX, Action::new('impersonate', 'Impersonate') - ->linkToUrl(fn (User $user) => "/?_switch_user={$user->getUserIdentifier()}") + ->linkToUrl(static fn (User $user) => "/?_switch_user={$user->getUserIdentifier()}") ); } } diff --git a/src/Controller/ChallengeController.php b/src/Controller/ChallengeController.php index 9b83f2d..77c2712 100644 --- a/src/Controller/ChallengeController.php +++ b/src/Controller/ChallengeController.php @@ -18,7 +18,8 @@ class ChallengeController extends AbstractController { #[Route('/challenge/{question}', name: 'app_challenge')] public function index( - #[CurrentUser] User $user, + #[CurrentUser] + User $user, Question $question, ): Response { return $this->render('challenge/index.html.twig', [ @@ -31,8 +32,10 @@ public function index( public function solution_video( Question $question, EntityManagerInterface $entityManager, - #[CurrentUser] User $user, - #[MapQueryParameter] string $csrf, + #[CurrentUser] + User $user, + #[MapQueryParameter] + string $csrf, ): Response { if (!$this->isCsrfTokenValid('challenge-solution', $csrf)) { throw $this->createAccessDeniedException('Invalid path to open solution.'); @@ -45,7 +48,8 @@ public function solution_video( $event = (new SolutionVideoEvent()) ->setQuestion($question) - ->setOpener($user); + ->setOpener($user) + ; $entityManager->persist($event); $entityManager->flush(); diff --git a/src/Controller/CommentsController.php b/src/Controller/CommentsController.php index b7ddd9a..35adf8f 100644 --- a/src/Controller/CommentsController.php +++ b/src/Controller/CommentsController.php @@ -33,7 +33,7 @@ public function index(#[CurrentUser] User $user, CommentRepository $commentRepos } $comments = $commentRepository->findUserComments($user); - $likes = array_reduce($comments, fn (int $carry, Comment $comment) => $carry + $comment->getCommentLikeEvents()->count(), 0); + $likes = array_reduce($comments, static fn (int $carry, Comment $comment) => $carry + $comment->getCommentLikeEvents()->count(), 0); return $this->render('comments/index.html.twig', [ 'comments' => $comments, @@ -46,7 +46,8 @@ public function index(#[CurrentUser] User $user, CommentRepository $commentRepos */ #[Route('/cards/likes', name: '_likes')] public function likes( - #[CurrentUser] User $user, + #[CurrentUser] + User $user, CommentRepository $commentRepository, ChartBuilderInterface $chartBuilder, TranslatorInterface $translator, @@ -62,7 +63,8 @@ public function likes( ->groupBy('c.id') ->orderBy('c.id') ->setParameter('user', $user) - ->getQuery(); + ->getQuery() + ; /** * @var array $likesOfEachComment @@ -71,12 +73,12 @@ public function likes( $chart = $chartBuilder->createChart(Chart::TYPE_BAR); $chart->setData([ - 'labels' => array_map(fn ($comment) => "#{$comment['id']}", $likesOfEachComment), + 'labels' => array_map(static fn ($comment) => "#{$comment['id']}", $likesOfEachComment), 'datasets' => [ [ 'label' => $translator->trans('charts.likes_of_each_comment'), 'backgroundColor' => self::primaryColor, - 'data' => array_map(fn ($comment) => $comment['count'], $likesOfEachComment), + 'data' => array_map(static fn ($comment) => $comment['count'], $likesOfEachComment), ], ], ]); diff --git a/src/Controller/FeedbackController.php b/src/Controller/FeedbackController.php index 8d1f21f..783612e 100644 --- a/src/Controller/FeedbackController.php +++ b/src/Controller/FeedbackController.php @@ -21,15 +21,19 @@ class FeedbackController extends AbstractController public function index( Request $request, EntityManagerInterface $entityManager, - #[CurrentUser] ?User $user, - #[MapQueryParameter] string $url, - #[MapQueryParameter] ?string $description = null, + #[CurrentUser] + ?User $user, + #[MapQueryParameter] + string $url, + #[MapQueryParameter] + ?string $description = null, ): Response { $feedback = (new Feedback()) ->setSender($user) ->setMetadata([ 'url' => $url, - ]); + ]) + ; if (null !== $description) { $feedback->setDescription($description); diff --git a/src/Controller/OverviewCardsController.php b/src/Controller/OverviewCardsController.php index 967b963..852562d 100644 --- a/src/Controller/OverviewCardsController.php +++ b/src/Controller/OverviewCardsController.php @@ -33,7 +33,8 @@ class OverviewCardsController extends AbstractController */ #[Route('/points', name: 'points')] public function points( - #[CurrentUser] User $user, + #[CurrentUser] + User $user, PointCalculationService $pointCalculationService, LoggerInterface $logger, ): Response { @@ -57,7 +58,8 @@ public function points( */ #[Route('/level', name: 'level')] public function level( - #[CurrentUser] User $user, + #[CurrentUser] + User $user, QuestionRepository $questionRepository, SolutionEventRepository $solutionEventRepository, ): Response { @@ -78,7 +80,8 @@ public function level( */ #[Route('/questions/solved', name: 'solved_questions')] public function solvedQuestions( - #[CurrentUser] User $user, + #[CurrentUser] + User $user, SolutionEventRepository $solutionEventRepository, ): Response { $solvedQuestions = $solutionEventRepository->findSolvedQuestions($user); @@ -106,7 +109,8 @@ public function questionCount( */ #[Route('/events/count', name: 'events_count')] public function eventsCount( - #[CurrentUser] User $user, + #[CurrentUser] + User $user, SolutionEventRepository $solutionEventRepository, ): Response { $events = $solutionEventRepository->findUserEvents($user); @@ -121,7 +125,8 @@ public function eventsCount( */ #[Route('/events/history', name: 'events_history')] public function eventHistory( - #[CurrentUser] User $user, + #[CurrentUser] + User $user, SolutionEventRepository $solutionEventRepository, ): Response { $events = $solutionEventRepository->findUserEvents($user, limit: 5); @@ -138,7 +143,8 @@ public function eventHistory( */ #[Route('/events/daily-chart', name: 'events_daily_chart')] public function eventDailyChart( - #[CurrentUser] User $user, + #[CurrentUser] + User $user, SolutionEventRepository $solutionEventRepository, ChartBuilderInterface $chartBuilder, TranslatorInterface $translator, @@ -154,7 +160,8 @@ public function eventDailyChart( ->groupBy('date') ->setParameter('date', $startedAt) ->setParameter('user', $user) - ->getQuery(); + ->getQuery() + ; /** * @var array $events @@ -173,12 +180,12 @@ public function eventDailyChart( $chart = $chartBuilder->createChart(Chart::TYPE_LINE); $chart->setData([ - 'labels' => array_map(fn ($event) => $event['date'], $events), + 'labels' => array_map(static fn ($event) => $event['date'], $events), 'datasets' => [ [ 'label' => $translator->trans('charts.event_daily_chart'), 'backgroundColor' => self::primaryColor, - 'data' => array_map(fn ($event) => $event['count'], $events), + 'data' => array_map(static fn ($event) => $event['count'], $events), ], ], ]); @@ -201,7 +208,8 @@ public function eventDailyChart( */ #[Route('/leaderboard', name: 'leaderboard')] public function leaderboard( - #[CurrentUser] User $user, + #[CurrentUser] + User $user, SolutionEventRepository $solutionEventRepository, ): Response { $leaderboard = $solutionEventRepository->listLeaderboard($user->getGroup(), '7 days'); diff --git a/src/Controller/ProfileController.php b/src/Controller/ProfileController.php index a24c34f..5eb4b70 100644 --- a/src/Controller/ProfileController.php +++ b/src/Controller/ProfileController.php @@ -39,7 +39,8 @@ public function editPassword( EntityManagerInterface $entityManager, FormFactoryInterface $formFactory, Request $request, - #[CurrentUser] User $user, + #[CurrentUser] + User $user, ): Response { if (!$this->isProfileEditable()) { throw $this->createNotFoundException('Feature "Editable Profile" is disabled.'); @@ -48,7 +49,8 @@ public function editPassword( $passwordChangeModel = new PasswordChangeModel(); $passwordChangeForm = $formFactory->createBuilder(PasswordChangeFormType::class, $passwordChangeModel) ->setAction($this->generateUrl('app_profile_edit_password')) - ->getForm(); + ->getForm() + ; $passwordChangeForm->handleRequest($request); $passwordUpdated = false; @@ -74,7 +76,8 @@ public function editUsername( EntityManagerInterface $entityManager, FormFactoryInterface $formFactory, Request $request, - #[CurrentUser] User $user, + #[CurrentUser] + User $user, ): Response { if (!$this->isProfileEditable()) { throw $this->createNotFoundException('Feature "Editable Profile" is disabled.'); @@ -82,7 +85,8 @@ public function editUsername( $usernameChangeForm = $formFactory->createBuilder(NameChangeFormType::class, $user) ->setAction($this->generateUrl('app_profile_edit_username')) - ->getForm(); + ->getForm() + ; $usernameChangeForm->handleRequest($request); $usernameUpdated = false; diff --git a/src/Controller/QuestionsController.php b/src/Controller/QuestionsController.php index 54e0edc..8c074fc 100644 --- a/src/Controller/QuestionsController.php +++ b/src/Controller/QuestionsController.php @@ -14,7 +14,8 @@ class QuestionsController extends AbstractController { #[Route('/questions', name: 'app_questions')] public function index( - #[CurrentUser] User $currentUser, + #[CurrentUser] + User $currentUser, ): Response { return $this->render('questions/index.html.twig', [ 'currentUser' => $currentUser, diff --git a/src/Entity/ChallengeDto/CompareResult/RowDifferent.php b/src/Entity/ChallengeDto/CompareResult/RowDifferent.php index f9bb57f..689a279 100644 --- a/src/Entity/ChallengeDto/CompareResult/RowDifferent.php +++ b/src/Entity/ChallengeDto/CompareResult/RowDifferent.php @@ -13,9 +13,7 @@ /** * @param int $row the row number that is different */ - public function __construct(public int $row) - { - } + public function __construct(public int $row) {} public function correct(): bool { diff --git a/src/Entity/ChallengeDto/CompareResult/RowUnmatched.php b/src/Entity/ChallengeDto/CompareResult/RowUnmatched.php index 1fa0b19..1bfb0b7 100644 --- a/src/Entity/ChallengeDto/CompareResult/RowUnmatched.php +++ b/src/Entity/ChallengeDto/CompareResult/RowUnmatched.php @@ -17,8 +17,7 @@ public function __construct( public int $expected, public int $actual, - ) { - } + ) {} public function correct(): bool { diff --git a/src/Entity/ChallengeDto/FallableSqlRunnerResult.php b/src/Entity/ChallengeDto/FallableSqlRunnerResult.php index 1b4dc4a..ec55499 100644 --- a/src/Entity/ChallengeDto/FallableSqlRunnerResult.php +++ b/src/Entity/ChallengeDto/FallableSqlRunnerResult.php @@ -5,7 +5,6 @@ namespace App\Entity\ChallengeDto; use App\Entity\SqlRunnerDto\SqlRunnerResult; -use App\Service\SqlRunnerService; use Symfony\Component\Translation\TranslatableMessage; /** diff --git a/src/Entity/Email.php b/src/Entity/Email.php index 7f7243f..4f4d9ae 100644 --- a/src/Entity/Email.php +++ b/src/Entity/Email.php @@ -45,14 +45,14 @@ public function __construct() $this->emailDeliveryEvents = new ArrayCollection(); } - public function getId(): ?int + public function __toString(): string { - return $this->id; + return $this->getSubject(); } - public function __toString(): string + public function getId(): ?int { - return $this->getSubject(); + return $this->id; } public function getSubject(): string diff --git a/src/Entity/EmailDto/EmailDto.php b/src/Entity/EmailDto/EmailDto.php index 16b1ca2..e619ebe 100644 --- a/src/Entity/EmailDto/EmailDto.php +++ b/src/Entity/EmailDto/EmailDto.php @@ -12,6 +12,7 @@ class EmailDto { private Address $toAddress; + /** * @var Address[] the address to BCC (密件副本) */ @@ -28,7 +29,8 @@ public static function fromUser(User $user): self ->setToAddress(new Address( address: $user->getEmail(), name: $user->getName() ?? $user->getEmail(), - )); + )) + ; } public function getToAddress(): Address @@ -36,7 +38,7 @@ public function getToAddress(): Address return $this->toAddress; } - public function setToAddress(string|Address $toAddress): static + public function setToAddress(Address|string $toAddress): static { if (\is_string($toAddress)) { $this->toAddress = new Address($toAddress); @@ -139,7 +141,8 @@ public function toEmail(): Email ->bcc(...$this->getBcc()) ->subject($this->getSubject()) ->text($this->getText()) - ->html($this->getHtml()); + ->html($this->getHtml()) + ; if (null !== $this->getSentAt()) { $email = $email->date($this->getSentAt()); diff --git a/src/Entity/EmailKind.php b/src/Entity/EmailKind.php index de1c3c8..3387a24 100644 --- a/src/Entity/EmailKind.php +++ b/src/Entity/EmailKind.php @@ -10,11 +10,10 @@ enum EmailKind: string implements TranslatableInterface { - public const EMAIL_HEADER = 'X-Email-Kind'; - case Transactional = 'transactional'; case Marketing = 'marketing'; case Test = 'test'; + public const EMAIL_HEADER = 'X-Email-Kind'; public function trans(TranslatorInterface $translator, ?string $locale = null): string { @@ -39,7 +38,7 @@ public static function fromEmailHeader(Headers $headers): self 'transactional' => self::Transactional, 'marketing' => self::Marketing, 'test' => self::Test, - default => throw new \InvalidArgumentException("Invalid email kind: $kind"), + default => throw new \InvalidArgumentException("Invalid email kind: {$kind}"), }; } diff --git a/src/Entity/ExportDto/QuestionDto.php b/src/Entity/ExportDto/QuestionDto.php index 763e78b..c9c2203 100644 --- a/src/Entity/ExportDto/QuestionDto.php +++ b/src/Entity/ExportDto/QuestionDto.php @@ -111,14 +111,15 @@ public static function fromEntity(Question $question): self ->setTitle($question->getTitle()) ->setDescription($question->getDescription()) ->setAnswer($question->getAnswer()) - ->setSolutionVideo($question->getSolutionVideo()); + ->setSolutionVideo($question->getSolutionVideo()) + ; } public function toEntity(SchemaRepository $schemaRepository): Question { $schema = $schemaRepository->find($this->schemaId); if (null === $schema) { - throw new \RuntimeException("Schema $this->schemaId not found"); + throw new \RuntimeException("Schema {$this->schemaId} not found"); } return (new Question()) @@ -128,6 +129,7 @@ public function toEntity(SchemaRepository $schemaRepository): Question ->setTitle($this->title) ->setDescription($this->description) ->setAnswer($this->answer) - ->setSolutionVideo($this->solutionVideo); + ->setSolutionVideo($this->solutionVideo) + ; } } diff --git a/src/Entity/ExportDto/SchemaDto.php b/src/Entity/ExportDto/SchemaDto.php index 03c7781..6c61539 100644 --- a/src/Entity/ExportDto/SchemaDto.php +++ b/src/Entity/ExportDto/SchemaDto.php @@ -67,7 +67,8 @@ public static function fromEntity(Schema $schema): self ->setId($schema->getId()) ->setPicture($schema->getPicture()) ->setDescription($schema->getDescription()) - ->setSchema($schema->getSchema()); + ->setSchema($schema->getSchema()) + ; } public function toEntity(): Schema @@ -76,6 +77,7 @@ public function toEntity(): Schema ->setId($this->id) ->setPicture($this->picture) ->setDescription($this->description) - ->setSchema($this->schema); + ->setSchema($this->schema) + ; } } diff --git a/src/Entity/Feedback.php b/src/Entity/Feedback.php index aac04d1..bfea253 100644 --- a/src/Entity/Feedback.php +++ b/src/Entity/Feedback.php @@ -37,7 +37,7 @@ class Feedback private FeedbackType $type = FeedbackType::Others; /** - * @var array $metadata the metadata for the feedback + * @var array $metadata the metadata for the feedback */ #[ORM\Column(type: 'json')] private array $metadata = []; @@ -103,7 +103,7 @@ public function setType(FeedbackType $type): static } /** - * @return array + * @return array */ public function getMetadata(): array { @@ -111,7 +111,7 @@ public function getMetadata(): array } /** - * @param array $metadata + * @param array $metadata * * @return $this */ diff --git a/src/Entity/Form/MetadataDto.php b/src/Entity/Form/MetadataDto.php index 6178ee8..be90d82 100644 --- a/src/Entity/Form/MetadataDto.php +++ b/src/Entity/Form/MetadataDto.php @@ -7,12 +7,12 @@ class MetadataDto { /** - * @var array + * @var array */ public array $metadata; /** - * @return array + * @return array */ public function getMetadata(): array { @@ -20,7 +20,7 @@ public function getMetadata(): array } /** - * @param array $metadata + * @param array $metadata * * @return $this */ diff --git a/src/Entity/Group.php b/src/Entity/Group.php index ac9df46..13b3c72 100644 --- a/src/Entity/Group.php +++ b/src/Entity/Group.php @@ -34,14 +34,14 @@ class Group #[ORM\OneToMany(targetEntity: User::class, mappedBy: 'group')] private Collection $users; - public function __toString(): string + public function __construct() { - return $this->name; + $this->users = new ArrayCollection(); } - public function __construct() + public function __toString(): string { - $this->users = new ArrayCollection(); + return $this->name; } public function getId(): ?int diff --git a/src/Entity/PassRate.php b/src/Entity/PassRate.php index 3d5add8..04ca4ee 100644 --- a/src/Entity/PassRate.php +++ b/src/Entity/PassRate.php @@ -31,7 +31,7 @@ public function __construct( array $attempts, ) { $this->total = \count($attempts); - $this->passed = \count(array_filter($attempts, fn (SolutionEvent $event) => SolutionEventStatus::Passed === $event->getStatus())); + $this->passed = \count(array_filter($attempts, static fn (SolutionEvent $event) => SolutionEventStatus::Passed === $event->getStatus())); } /** diff --git a/src/Entity/Question.php b/src/Entity/Question.php index 909215e..fd4857b 100644 --- a/src/Entity/Question.php +++ b/src/Entity/Question.php @@ -79,7 +79,7 @@ public function __construct() public function __toString(): string { - return "#$this->id: $this->title"; + return "#{$this->id}: {$this->title}"; } #[Groups(['searchable'])] diff --git a/src/Entity/SqlRunnerDto/SqlRunnerResponse.php b/src/Entity/SqlRunnerDto/SqlRunnerResponse.php index 47a2d84..5b5cb4e 100644 --- a/src/Entity/SqlRunnerDto/SqlRunnerResponse.php +++ b/src/Entity/SqlRunnerDto/SqlRunnerResponse.php @@ -15,19 +15,19 @@ class SqlRunnerResponse private bool $success; /** - * @var SqlRunnerResult|null The data returned by the query. + * @var null|SqlRunnerResult The data returned by the query. * Only available if the query was successful. */ private ?SqlRunnerResult $data; /** - * @var string|null The error message returned by the query. + * @var null|string The error message returned by the query. * Only available if the query was not successful. */ private ?string $message; /** - * @var string|null The error code returned by the query. + * @var null|string The error code returned by the query. * Only available if the query was not successful. */ private ?string $code; diff --git a/src/Entity/User.php b/src/Entity/User.php index c79c19c..86ae57a 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -108,14 +108,14 @@ public function __construct() $this->emailDeliveryEvents = new ArrayCollection(); } - public function getId(): ?int + public function __toString(): string { - return $this->id; + return $this->getUserIdentifier(); } - public function __toString(): string + public function getId(): ?int { - return $this->getUserIdentifier(); + return $this->id; } /** diff --git a/src/EventSubscriber/EmailCreatedSubscriber.php b/src/EventSubscriber/EmailCreatedSubscriber.php index 6fc0624..0f34ad7 100644 --- a/src/EventSubscriber/EmailCreatedSubscriber.php +++ b/src/EventSubscriber/EmailCreatedSubscriber.php @@ -21,13 +21,12 @@ public function __construct( private LoggerInterface $logger, private UserRepository $userRepository, private EntityManagerInterface $entityManager, - ) { - } + ) {} public function onMessageEvent(MessageEvent $event): void { $message = $event->getMessage(); - if (!($message instanceof EmailMessage)) { + if (!$message instanceof EmailMessage) { $this->logger->warning('The message is not an instance of Email.', [ 'message' => $message, ]); @@ -80,7 +79,8 @@ public function onMessageEvent(MessageEvent $event): void ->setSubject($subject) ->setTextContent($textBody) ->setHtmlContent($htmlBody) - ->setKind($kind); + ->setKind($kind) + ; $this->entityManager->persist($email); /** @@ -95,7 +95,8 @@ public function onMessageEvent(MessageEvent $event): void foreach ($recipients as $recipient) { $emailDeliveryEvent = (new EmailDeliveryEvent()) ->setToAddress($recipient->getAddress()) - ->setEmail($email); + ->setEmail($email) + ; $user = $this->userRepository->findOneBy([ 'email' => $recipient->getAddress(), diff --git a/src/EventSubscriber/FeedbackCreatedListenerSubscriber.php b/src/EventSubscriber/FeedbackCreatedListenerSubscriber.php index dd60028..6c2abdc 100644 --- a/src/EventSubscriber/FeedbackCreatedListenerSubscriber.php +++ b/src/EventSubscriber/FeedbackCreatedListenerSubscriber.php @@ -19,8 +19,7 @@ public function __construct( private NotifierInterface $notifier, private TranslatorInterface $translator, private UrlGeneratorInterface $urlGenerator, - ) { - } + ) {} public function onFeedbackCreated(Feedback $feedback): void { diff --git a/src/EventSubscriber/LoginSubscriber.php b/src/EventSubscriber/LoginSubscriber.php index 04538c9..8be74da 100644 --- a/src/EventSubscriber/LoginSubscriber.php +++ b/src/EventSubscriber/LoginSubscriber.php @@ -14,8 +14,7 @@ { public function __construct( private EntityManagerInterface $entityManager, - ) { - } + ) {} public function onSecurityAuthenticationSuccess(AuthenticationSuccessEvent $event): void { @@ -23,7 +22,8 @@ public function onSecurityAuthenticationSuccess(AuthenticationSuccessEvent $even \assert($user instanceof User); $loginEvent = (new LoginEvent()) - ->setAccount($user); + ->setAccount($user) + ; $this->entityManager->persist($loginEvent); $this->entityManager->flush(); diff --git a/src/EventSubscriber/QuestionReindexSubscriber.php b/src/EventSubscriber/QuestionReindexSubscriber.php index 8e8d214..77cbafe 100644 --- a/src/EventSubscriber/QuestionReindexSubscriber.php +++ b/src/EventSubscriber/QuestionReindexSubscriber.php @@ -19,8 +19,7 @@ public function __construct( private QuestionRepository $questionRepository, private SearchService $searchService, private LoggerInterface $logger, - ) { - } + ) {} public function postUpdate(Question $question, PostUpdateEventArgs $event): void { diff --git a/src/Exception/SqlRunnerException.php b/src/Exception/SqlRunnerException.php index 49a3ee2..292715d 100644 --- a/src/Exception/SqlRunnerException.php +++ b/src/Exception/SqlRunnerException.php @@ -10,6 +10,6 @@ class SqlRunnerException extends HttpException { public function __construct(string $code, string $message, ?\Throwable $previous = null) { - parent::__construct(500, "$code: $message", previous: $previous); + parent::__construct(500, "{$code}: {$message}", previous: $previous); } } diff --git a/src/Form/CommentCreateFormType.php b/src/Form/CommentCreateFormType.php index 1aea9eb..98009cb 100644 --- a/src/Form/CommentCreateFormType.php +++ b/src/Form/CommentCreateFormType.php @@ -35,7 +35,8 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'class' => 'btn btn-primary', 'aria-label' => '送出留言', ], - ]); + ]) + ; } public function configureOptions(OptionsResolver $resolver): void diff --git a/src/Form/FeedbackFormType.php b/src/Form/FeedbackFormType.php index 3282572..65aa9e6 100644 --- a/src/Form/FeedbackFormType.php +++ b/src/Form/FeedbackFormType.php @@ -24,8 +24,7 @@ class FeedbackFormType extends AbstractType { public function __construct( private readonly FeedbackMetadataModelTransformer $metadataModelTransformer, - ) { - } + ) {} public function buildForm(FormBuilderInterface $builder, array $options): void { @@ -58,7 +57,8 @@ public function buildForm(FormBuilderInterface $builder, array $options): void ; $builder->get('metadata') - ->addModelTransformer($this->metadataModelTransformer); + ->addModelTransformer($this->metadataModelTransformer) + ; } public function configureOptions(OptionsResolver $resolver): void diff --git a/src/Form/FeedbackMetadataModelTransformer.php b/src/Form/FeedbackMetadataModelTransformer.php index 0523b35..f240e83 100644 --- a/src/Form/FeedbackMetadataModelTransformer.php +++ b/src/Form/FeedbackMetadataModelTransformer.php @@ -15,8 +15,7 @@ { public function __construct( private SerializerInterface $serializer, - ) { - } + ) {} public function transform(mixed $value): string { @@ -29,7 +28,7 @@ public function transform(mixed $value): string } /** - * @return array + * @return array */ public function reverseTransform(mixed $value): array { diff --git a/src/Form/NameChangeFormType.php b/src/Form/NameChangeFormType.php index cf37891..f527c41 100644 --- a/src/Form/NameChangeFormType.php +++ b/src/Form/NameChangeFormType.php @@ -19,8 +19,7 @@ class NameChangeFormType extends AbstractType { public function __construct( private readonly TranslatorInterface $translator, - ) { - } + ) {} public function buildForm(FormBuilderInterface $builder, array $options): void { @@ -39,7 +38,8 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'row_attr' => [ 'class' => 'mt-3', ], - ]); + ]) + ; } public function configureOptions(OptionsResolver $resolver): void diff --git a/src/Form/PasswordChangeFormType.php b/src/Form/PasswordChangeFormType.php index 9d3743e..251c855 100644 --- a/src/Form/PasswordChangeFormType.php +++ b/src/Form/PasswordChangeFormType.php @@ -19,8 +19,7 @@ class PasswordChangeFormType extends AbstractType { public function __construct( private readonly TranslatorInterface $translator, - ) { - } + ) {} public function buildForm(FormBuilderInterface $builder, array $options): void { diff --git a/src/Repository/CommentLikeEventRepository.php b/src/Repository/CommentLikeEventRepository.php index b76fd83..c201254 100644 --- a/src/Repository/CommentLikeEventRepository.php +++ b/src/Repository/CommentLikeEventRepository.php @@ -69,7 +69,8 @@ public function like(User $user, Comment $comment): void $likeEvent = (new CommentLikeEvent()) ->setLiker($user) - ->setComment($comment); + ->setComment($comment) + ; $this->getEntityManager()->persist($likeEvent); $this->getEntityManager()->flush(); diff --git a/src/Repository/CommentRepository.php b/src/Repository/CommentRepository.php index 979d4f4..1ebba0f 100644 --- a/src/Repository/CommentRepository.php +++ b/src/Repository/CommentRepository.php @@ -24,8 +24,8 @@ public function __construct(ManagerRegistry $registry) * Get the comments of a question. * * @param Question $question the question to get the comments for - * @param int|null $limit The maximum number of comments to return. Used for pagination. - * @param int|null $offset The number of comments to skip. Used for pagination. + * @param null|int $limit The maximum number of comments to return. Used for pagination. + * @param null|int $offset The number of comments to skip. Used for pagination. * * @return Comment[] the comments of the question */ @@ -43,8 +43,8 @@ public function findQuestionComments(Question $question, ?int $limit = null, ?in * Get all the comments created by a user. * * @param User $user the user to get the comments for - * @param int|null $limit The maximum number of comments to return. Used for pagination. - * @param int|null $offset The number of comments to skip. Used for pagination. + * @param null|int $limit The maximum number of comments to return. Used for pagination. + * @param null|int $offset The number of comments to skip. Used for pagination. * * @return Comment[] the comments created by the user */ diff --git a/src/Repository/PasswordSettableUserInterface.php b/src/Repository/PasswordSettableUserInterface.php new file mode 100644 index 0000000..4245c00 --- /dev/null +++ b/src/Repository/PasswordSettableUserInterface.php @@ -0,0 +1,10 @@ +createQueryBuilder('q') + $result = $this->createQueryBuilder('q') ->select('q.id') ->where('q.id > :page') ->orderBy('q.id', 'ASC') ->setParameter('page', $page) ->setMaxResults(1) ->getQuery() - ->getSingleResult(AbstractQuery::HYDRATE_SINGLE_SCALAR); + ->getSingleScalarResult() + ; - return $id; + \assert(\is_int($result), 'result should be an integer'); + + return $result; } catch (NoResultException) { return null; } @@ -49,19 +48,19 @@ public function getNextPage(int $page): ?int public function getPreviousPage(int $page): ?int { try { - /** - * @var int $id - */ - $id = $this->createQueryBuilder('q') + $result = $this->createQueryBuilder('q') ->select('q.id') ->where('q.id < :page') ->orderBy('q.id', 'DESC') ->setParameter('page', $page) ->setMaxResults(1) ->getQuery() - ->getSingleScalarResult(); + ->getSingleScalarResult() + ; + + \assert(\is_int($result), 'result should be an integer'); - return $id; + return $result; } catch (NoResultException) { return null; } @@ -70,10 +69,10 @@ public function getPreviousPage(int $page): ?int /** * Search for questions based on a query and page number. * - * @param string|null $query The search query - * @param string|null $type The question type + * @param null|string $query The search query + * @param null|string $type The question type * @param int $page The page number - * @param int|null $pageSize The number of items per page + * @param null|int $pageSize The number of items per page * * @return Question[] The list of questions for the given page */ @@ -82,7 +81,7 @@ public function search(?string $query, ?string $type, int $page, ?int $pageSize $filters = []; if (null !== $type && '' !== $type) { $escapedType = addslashes($type); - $filters[] = "type = \"$escapedType\""; + $filters[] = "type = \"{$escapedType}\""; } return $this->searchService->search($this->getEntityManager(), Question::class, $query ?? '', [ @@ -105,8 +104,8 @@ public function reindex(SearchService $searchService): void /** * Count the total search results based on a query and type. * - * @param string|null $query The search query - * @param string|null $type The question type + * @param null|string $query The search query + * @param null|string $type The question type * * @return int The total result count */ @@ -115,7 +114,7 @@ public function countSearchResults(?string $query, ?string $type): int $filters = []; if (null !== $type && '' !== $type) { $escapedType = addslashes($type); - $filters[] = "type = \"$escapedType\""; + $filters[] = "type = \"{$escapedType}\""; } $result = $this->searchService->rawSearch(Question::class, $query ?? '', [ @@ -135,15 +134,17 @@ public function countSearchResults(?string $query, ?string $type): int */ public function listTypes(): array { - $qb = $this->createQueryBuilder('q'); - $qb = $qb->select('q.type') - ->distinct(); - - /** - * @var string[] $result - */ - $result = $qb->getQuery()->getSingleColumnResult(); - - return $result; + $result = $this->createQueryBuilder('q') + ->select('q.type') + ->distinct() + ->getQuery() + ->getSingleColumnResult() + ; + + return array_map(static function (mixed $s) { + \assert(\is_string($s), 'types should be a string'); + + return $s; + }, $result); } } diff --git a/src/Repository/SolutionEventRepository.php b/src/Repository/SolutionEventRepository.php index 350ed28..7d3f8d0 100644 --- a/src/Repository/SolutionEventRepository.php +++ b/src/Repository/SolutionEventRepository.php @@ -54,8 +54,8 @@ public function findSolvedQuestions(User $user): array * * @param User $user The user to query * @param array $criteria Additional criteria to filter the events - * @param int|null $limit The maximum number of events to return - * @param int|null $offset The offset of the events + * @param null|int $limit The maximum number of events to return + * @param null|int $offset The offset of the events * * @return SolutionEvent[] */ @@ -78,8 +78,8 @@ public function findUserEvents(User $user, array $criteria = [], ?int $limit = n * * @param Question $question The question to query * @param User $user The user to query - * @param int|null $limit The maximum number of events to return - * @param int|null $offset The offset of the events + * @param null|int $limit The maximum number of events to return + * @param null|int $offset The offset of the events * * @return SolutionEvent[] */ @@ -108,7 +108,7 @@ public function findUserQuestionEvents(Question $question, User $user, ?int $lim * @param Question $question The question to check * @param User $user The user to check * - * @return SolutionEventStatus|null The solve state, or `null` if the user has not solved the question + * @return null|SolutionEventStatus The solve state, or `null` if the user has not solved the question */ public function getSolveState(Question $question, User $user): ?SolutionEventStatus { @@ -138,14 +138,14 @@ public function getSolveState(Question $question, User $user): ?SolutionEventSta /** * List the users leaderboard by the number of questions they have solved. * - * @param Group|null $group the group to filter the attempts by (null = no group) + * @param null|Group $group the group to filter the attempts by (null = no group) * @param string $interval The interval to count the leaderboard * * @return list The leaderboard */ public function listLeaderboard(?Group $group, string $interval): array { - $startedFrom = new \DateTimeImmutable("-$interval"); + $startedFrom = new \DateTimeImmutable("-{$interval}"); $qb = $this->createQueryBuilder('e') ->from(User::class, 'u') @@ -156,29 +156,26 @@ public function listLeaderboard(?Group $group, string $interval): array ->groupBy('u.id') ->orderBy('count', 'DESC') ->setParameter('status', SolutionEventStatus::Passed) - ->setParameter('startedFrom', $startedFrom); + ->setParameter('startedFrom', $startedFrom) + ; // filter by group if (null !== $group) { $qb = $qb->andWhere('u.group = :group') - ->setParameter('group', $group); + ->setParameter('group', $group) + ; } else { $qb = $qb->andWhere('u.group IS NULL'); } - /** - * @var list}> $result - */ - $result = $qb->getQuery()->getResult(); - - return $result; + return $qb->getQuery()->getResult(); } /** * Get the total attempts made on the question. * * @param Question $question the question to query - * @param Group|null $group the group to filter the attempts by (null = no group) + * @param null|Group $group the group to filter the attempts by (null = no group) * * @return SolutionEvent[] the total attempts made on the question */ @@ -187,21 +184,18 @@ public function getTotalAttempts(Question $question, ?Group $group): array $qb = $this->createQueryBuilder('se') ->join('se.submitter', 'submitter') ->where('se.question = :question') - ->setParameter('question', $question); + ->setParameter('question', $question) + ; if (null !== $group) { $qb->andWhere('submitter.group = :group') - ->setParameter('group', $group); + ->setParameter('group', $group) + ; } else { $qb->andWhere('submitter.group IS NULL'); } - /** - * @var list $result - */ - $result = $qb->getQuery()->getResult(); - - return $result; + return $qb->getQuery()->getResult(); } /** @@ -210,7 +204,7 @@ public function getTotalAttempts(Question $question, ?Group $group): array * @param Question $question The question to query * @param User $submitter The user to query * - * @return SolutionEvent|null The latest query of the user for the question + * @return null|SolutionEvent The latest query of the user for the question */ public function getLatestQuery(Question $question, User $submitter): ?SolutionEvent { diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php index cd36500..53795e8 100644 --- a/src/Repository/UserRepository.php +++ b/src/Repository/UserRepository.php @@ -27,6 +27,10 @@ public function __construct(ManagerRegistry $registry) */ public function upgradePassword(PasswordAuthenticatedUserInterface $user, string $newHashedPassword): void { + if (!$user instanceof PasswordSettableUserInterface) { + throw new \InvalidArgumentException(\sprintf('User must implement %s in order to be upgraded.', PasswordSettableUserInterface::class)); + } + $user->setPassword($newHashedPassword); $this->getEntityManager()->persist($user); $this->getEntityManager()->flush(); diff --git a/src/Service/EmailService.php b/src/Service/EmailService.php index c4c6586..1205c0f 100644 --- a/src/Service/EmailService.php +++ b/src/Service/EmailService.php @@ -12,6 +12,7 @@ final readonly class EmailService { private Address $fromAddress; + private Address $testAddress; /** * @param int<1, max> $chunkLimit @@ -19,12 +20,18 @@ public function __construct( private MailerInterface $mailer, private string $serverMail, + private string $serverMailForTest, private int $chunkLimit, ) { $this->fromAddress = new Address( address: $this->serverMail, name: '資料庫練功房' ); + + $this->testAddress = new Address( + address: $this->serverMailForTest, + name: '資料庫練功房 - 測試信箱' + ); } /** @@ -47,7 +54,8 @@ public function send(EmailDto $emailDto): void ->toEmail() ->from($this->fromAddress) ->bcc(...$chunk) - ->date($sendAt); + ->date($sendAt) + ; $this->mailer->send($email); $sendAt = $sendAt->modify('+3 seconds'); @@ -57,4 +65,15 @@ public function send(EmailDto $emailDto): void $this->mailer->send($email); } } + + /** + * Send an email with the given {@link EmailDto} to the test email address. + */ + public function sendToTest(EmailDto $emailDto): void + { + $emailDtoCloned = clone $emailDto; + $emailDtoCloned->setToAddress($this->testAddress); + $email = $emailDtoCloned->toEmail()->from($this->fromAddress); + $this->mailer->send($email); + } } diff --git a/src/Service/EmailTemplateService.php b/src/Service/EmailTemplateService.php index b07754a..bf634a3 100644 --- a/src/Service/EmailTemplateService.php +++ b/src/Service/EmailTemplateService.php @@ -8,14 +8,14 @@ use App\Entity\EmailKind; use App\Entity\User; use Symfony\Component\Mime\Address; +use Twig\Environment; final readonly class EmailTemplateService { public function __construct( - private \Twig\Environment $twigEnvironment, + private Environment $twigEnvironment, private string $serverMail, - ) { - } + ) {} /** * Send a "you have not logged in for a long time" email to the user. @@ -26,7 +26,7 @@ public function __construct( */ public function createLoginReminderDto(array $bccUsers): EmailDto { - $textContent = << new Address( + static fn (User $user) => new Address( address: $user->getEmail(), name: $user->getName() ?? '', ), @@ -64,6 +64,7 @@ public function createLoginReminderDto(array $bccUsers): EmailDto ->setSubject('[資料庫練功房] 登入次數警告') ->setText($textContent) ->setHtml($htmlContent) - ->setKind(EmailKind::Transactional); + ->setKind(EmailKind::Transactional) + ; } } diff --git a/src/Service/PassRateService.php b/src/Service/PassRateService.php index 07453c6..72ab1b8 100644 --- a/src/Service/PassRateService.php +++ b/src/Service/PassRateService.php @@ -16,14 +16,13 @@ { public function __construct( private SolutionEventRepository $solutionEventRepository, - ) { - } + ) {} /** * Get the pass rate in this group of a question. * * @param Question $question the question to calculate the pass rate - * @param Group|null $group the group to calculate the pass rate, null for no group + * @param null|Group $group the group to calculate the pass rate, null for no group * * @return PassRate the pass rate, see {@link PassRate} for details */ diff --git a/src/Service/PointCalculationService.php b/src/Service/PointCalculationService.php index 9b94731..c8b00b8 100644 --- a/src/Service/PointCalculationService.php +++ b/src/Service/PointCalculationService.php @@ -46,8 +46,7 @@ public function __construct( private readonly SolutionVideoEventRepository $solutionVideoEventRepository, private readonly HintOpenEventRepository $hintOpenEventRepository, private readonly TagAwareCacheInterface $cache, - ) { - } + ) {} /** * @throws InvalidArgumentException @@ -59,8 +58,7 @@ public function calculate(User $user): int + $this->calculateFirstSolutionPoints($user) + $this->calculateSolutionVideoPoints($user) + $this->calculateHintOpenPoints($user) - + $this->calculateWeeklySolvedPunishPoints($user) - ; + + $this->calculateWeeklySolvedPunishPoints($user); } /** @@ -73,11 +71,11 @@ public function calculate(User $user): int * * @return int The total points of the user */ - protected function calculateSolutionQuestionPoints(User $user): int + private function calculateSolutionQuestionPoints(User $user): int { $questions = $this->solutionEventRepository->findSolvedQuestions($user); - return array_reduce($questions, fn (int $carry, Question $question) => $carry + match ($question->getDifficulty()) { + return array_reduce($questions, static fn (int $carry, Question $question) => $carry + match ($question->getDifficulty()) { QuestionDifficulty::Easy => self::solutionEventEasyPoint, QuestionDifficulty::Medium => self::solutionEventMediumPoint, QuestionDifficulty::Hard => self::solutionEventHardPoint, @@ -92,7 +90,7 @@ protected function calculateSolutionQuestionPoints(User $user): int * * @throws InvalidArgumentException */ - protected function calculateFirstSolutionPoints(User $user): int + private function calculateFirstSolutionPoints(User $user): int { // select the question this user has ever solved $qb = $this->solutionEventRepository->createQueryBuilder('e') @@ -102,7 +100,8 @@ protected function calculateFirstSolutionPoints(User $user): int ->andWhere('e.status = :status') ->andWhere('e.submitter = :submitter') ->setParameter('status', SolutionEventStatus::Passed) - ->setParameter('submitter', $user); + ->setParameter('submitter', $user) + ; /** * @var Question[] $questions @@ -126,25 +125,26 @@ protected function calculateFirstSolutionPoints(User $user): int * List and cache the first solvers of each question. * * @param Question $question the question to get the first solver - * @param Group|null $group the solver group (null = no group) + * @param null|Group $group the solver group (null = no group) * * @returns int|null the first solver ID of the question * * @throws InvalidArgumentException */ - protected function listFirstSolversOfQuestion(Question $question, ?Group $group): ?int + private function listFirstSolversOfQuestion(Question $question, ?Group $group): ?int { $groupId = null !== $group ? "{$group->getId()}" : '-none'; return $this->cache->get( - "question.q{$question->getId()}.g$groupId.first-solver", - function (ItemInterface $item) use ($group, $question) { + "question.q{$question->getId()}.g{$groupId}.first-solver", + static function (ItemInterface $item) use ($group, $question) { $item->tag(['question', 'first-solver', 'group']); $solutionEvent = $question ->getSolutionEvents() - ->filter(fn (SolutionEvent $event) => $group === $event->getSubmitter()->getGroup()) - ->findFirst(fn ($_, SolutionEvent $event) => SolutionEventStatus::Passed === $event->getStatus()); + ->filter(static fn (SolutionEvent $event) => $group === $event->getSubmitter()->getGroup()) + ->findFirst(static fn ($_, SolutionEvent $event) => SolutionEventStatus::Passed === $event->getStatus()) + ; return $solutionEvent?->getSubmitter()?->getId(); } @@ -157,7 +157,7 @@ function (ItemInterface $item) use ($group, $question) { * Each student will lose experience points for watching a solution video. * Easy: 6 points, Medium: 12 points, Hard: 18 points. */ - protected function calculateSolutionVideoPoints(User $user): int + private function calculateSolutionVideoPoints(User $user): int { /** * @var Question[] $questions @@ -170,7 +170,8 @@ protected function calculateSolutionVideoPoints(User $user): int ->groupBy('q.id') ->setParameter('user', $user) ->getQuery() - ->getResult(); + ->getResult() + ; $questionPointsPair = []; @@ -186,7 +187,7 @@ protected function calculateSolutionVideoPoints(User $user): int return -array_sum($questionPointsPair); } - protected function calculateHintOpenPoints(User $user): int + private function calculateHintOpenPoints(User $user): int { $hintOpenEvents = $this->hintOpenEventRepository->findByUser($user); @@ -203,7 +204,7 @@ protected function calculateHintOpenPoints(User $user): int * * @return int The punish points, negative value */ - protected function calculateWeeklySolvedPunishPoints(User $user): int + private function calculateWeeklySolvedPunishPoints(User $user): int { $weeklyMinSolvedQuestion = self::weeklyMinSolvedQuestionPoint; $weeklyPerQuestionXP = self::weeklyPerQuestionXpPoint; @@ -213,14 +214,15 @@ protected function calculateWeeklySolvedPunishPoints(User $user): int // Fetch the first attempt /** - * @var array{firstAttemptDate: string|null} $firstAttempt + * @var array{firstAttemptDate: null|string} $firstAttempt */ $firstAttempt = $this->solutionEventRepository->createQueryBuilder('e') ->select('MIN(e.createdAt) AS firstAttemptDate') ->where('e.submitter = :submitter') ->setParameter('submitter', $user) ->getQuery() - ->getOneOrNullResult(); + ->getOneOrNullResult() + ; if (null === $firstAttempt['firstAttemptDate']) { return 0; @@ -229,7 +231,8 @@ protected function calculateWeeklySolvedPunishPoints(User $user): int // Ensure startDate is set to the start of the ISO week $startDate = (new \DateTime($firstAttempt['firstAttemptDate'])) ->setTime(0, 0) - ->modify('Monday this week'); + ->modify('Monday this week') + ; // Prepare the query to fetch counts per week $qb = $this->solutionEventRepository->createQueryBuilder('e') diff --git a/src/Service/PromptService.php b/src/Service/PromptService.php index c643119..946526e 100644 --- a/src/Service/PromptService.php +++ b/src/Service/PromptService.php @@ -5,11 +5,12 @@ namespace App\Service; use App\Exception\HintException; +use OpenAI\Client; use Psr\Log\LoggerInterface; final readonly class PromptService { - protected \OpenAI\Client $client; + private Client $client; public function __construct( private string $apiKey, @@ -31,7 +32,7 @@ public function __construct( */ public function hint(string $query, string $error, string $answer): string { - $systemPrompt = <<$queryXml - $answerXml - $messageXml + {$queryXml} + {$answerXml} + {$messageXml} INPUT; try { diff --git a/src/Service/QuestionSqlRunnerService.php b/src/Service/QuestionSqlRunnerService.php index 1af8e82..ed401ef 100644 --- a/src/Service/QuestionSqlRunnerService.php +++ b/src/Service/QuestionSqlRunnerService.php @@ -19,14 +19,12 @@ final class QuestionSqlRunnerService { public function __construct( protected SqlRunnerService $sqlRunnerService, - ) { - } + ) {} /** * Get the result of the query from the question. * * @param Question $question the question to get the result from - * @param string $query the query to execute * * @return SqlRunnerResult the result of the query * @@ -34,21 +32,16 @@ public function __construct( * @throws SchemaExecuteException when the schema execution fails * @throws SqlRunnerException when the runner fails (internal error or client error) */ - protected function getResult(Question $question, string $query): SqlRunnerResult + public function getAnswerResult(Question $question): SqlRunnerResult { - $schema = $question->getSchema(); - - return $this->sqlRunnerService->runQuery( - (new SqlRunnerRequest()) - ->setQuery($query) - ->setSchema($schema->getSchema()) - ); + return $this->getResult($question, $question->getAnswer()); } /** * Get the result of the query from the question. * * @param Question $question the question to get the result from + * @param string $query the query to execute * * @return SqlRunnerResult the result of the query * @@ -56,9 +49,9 @@ protected function getResult(Question $question, string $query): SqlRunnerResult * @throws SchemaExecuteException when the schema execution fails * @throws SqlRunnerException when the runner fails (internal error or client error) */ - public function getAnswerResult(Question $question): SqlRunnerResult + public function getQueryResult(Question $question, string $query): SqlRunnerResult { - return $this->getResult($question, $question->getAnswer()); + return $this->getResult($question, $query); } /** @@ -73,8 +66,14 @@ public function getAnswerResult(Question $question): SqlRunnerResult * @throws SchemaExecuteException when the schema execution fails * @throws SqlRunnerException when the runner fails (internal error or client error) */ - public function getQueryResult(Question $question, string $query): SqlRunnerResult + private function getResult(Question $question, string $query): SqlRunnerResult { - return $this->getResult($question, $query); + $schema = $question->getSchema(); + + return $this->sqlRunnerService->runQuery( + (new SqlRunnerRequest()) + ->setQuery($query) + ->setSchema($schema->getSchema()) + ); } } diff --git a/src/Service/SqlRunnerService.php b/src/Service/SqlRunnerService.php index 801396b..720dc74 100644 --- a/src/Service/SqlRunnerService.php +++ b/src/Service/SqlRunnerService.php @@ -29,7 +29,8 @@ public function __construct( $this->context = (new ObjectNormalizerContextBuilder()) ->withAllowExtraAttributes(false) ->withRequireAllProperties() - ->toArray(); + ->toArray() + ; } /** @@ -77,8 +78,10 @@ public function runQuery(SqlRunnerRequest $request): SqlRunnerResult switch ($response->getCode()) { case 'QUERY_ERROR': throw new QueryExecuteException($response->getMessage()); + case 'SCHEMA_ERROR': throw new SchemaExecuteException($response->getMessage()); + default: throw new SqlRunnerException($response->getCode(), $response->getMessage()); } diff --git a/src/Service/StatisticsService.php b/src/Service/StatisticsService.php index c7acab2..e65da16 100644 --- a/src/Service/StatisticsService.php +++ b/src/Service/StatisticsService.php @@ -12,8 +12,7 @@ { public function __construct( private UserRepository $userRepository, - ) { - } + ) {} /** * Get the last login time of all users in descending order. @@ -25,7 +24,7 @@ public function __construct( public function lastLoginAt(): array { /** - * @var list $results + * @var list $results */ $results = $this->userRepository->createQueryBuilder('user') ->leftJoin('user.loginEvents', 'loginEvent') @@ -36,7 +35,8 @@ public function lastLoginAt(): array ->groupBy('user.id') ->orderBy('last_login_at', 'DESC') ->getQuery() - ->getResult(); + ->getResult() + ; /** * @var list $resultsWithRecency @@ -54,7 +54,8 @@ public function lastLoginAt(): array : null; $lastLoginDto = (new LastLoginDto()) ->setUser($result['u']) - ->setLastLoginAt($lastLoginAt); + ->setLastLoginAt($lastLoginAt) + ; if (null !== $lastLoginAt) { $resultsWithRecency[] = $lastLoginDto; diff --git a/src/Service/StrategicEmailService.php b/src/Service/StrategicEmailService.php index 968014b..4c4ccf4 100644 --- a/src/Service/StrategicEmailService.php +++ b/src/Service/StrategicEmailService.php @@ -12,27 +12,22 @@ public function __construct( private StatisticsService $statisticsService, private EmailTemplateService $emailTemplateService, - private EmailService $emailService, - ) { - } + ) {} /** * Send login reminder emails to users who have not logged in for a long time. * - * @template T of bool - * - * @param T $dryRun whether to send the email or not - * - * @return ($dryRun is true ? EmailDto : null) + * @param callable(EmailDto): void $target the function that sends the email + * according to the given EmailDto * * @throws \Throwable if the email content cannot be rendered */ - public function sendLoginReminderEmail(bool $dryRun = false): ?EmailDto + public function sendLoginReminderEmail(callable $target): void { $lastLoginAt = array_filter( // Filter out users who have logged in within the last 7 days $this->statisticsService->lastLoginAt(), - function (LastLoginDto $lastLoginDto): bool { + static function (LastLoginDto $lastLoginDto): bool { $lastLoginAt = $lastLoginDto->getLastLoginAt(); if (null === $lastLoginAt) { return true; @@ -43,17 +38,12 @@ function (LastLoginDto $lastLoginDto): bool { ); $bccUsers = array_map( - fn (LastLoginDto $lastLoginDto) => $lastLoginDto->getUser(), + static fn (LastLoginDto $lastLoginDto) => $lastLoginDto->getUser(), $lastLoginAt, ); $emailDto = $this->emailTemplateService->createLoginReminderDto($bccUsers); - if ($dryRun) { - return $emailDto; - } - - $this->emailService->send($emailDto); - return null; + $target($emailDto); } } diff --git a/src/Twig/Components/Challenge/ColumnsOfAnswer.php b/src/Twig/Components/Challenge/ColumnsOfAnswer.php index 1cd24e5..4014b3d 100644 --- a/src/Twig/Components/Challenge/ColumnsOfAnswer.php +++ b/src/Twig/Components/Challenge/ColumnsOfAnswer.php @@ -15,14 +15,13 @@ final class ColumnsOfAnswer { use DefaultActionTrait; - public function __construct( - private readonly QuestionSqlRunnerService $questionSqlRunnerService, - ) { - } - #[LiveProp] public Question $question; + public function __construct( + private readonly QuestionSqlRunnerService $questionSqlRunnerService, + ) {} + /** * Get the columns of the answer. * diff --git a/src/Twig/Components/Challenge/Comments.php b/src/Twig/Components/Challenge/Comments.php index 0c9947f..6cc8ca0 100644 --- a/src/Twig/Components/Challenge/Comments.php +++ b/src/Twig/Components/Challenge/Comments.php @@ -26,8 +26,7 @@ final class Comments public function __construct( private readonly CommentRepository $commentRepository, - ) { - } + ) {} /** * Get the comments of the question. @@ -40,7 +39,5 @@ public function getComments(): array } #[LiveListener('app:comment-refresh')] - public function refresh(): void - { - } + public function refresh(): void {} } diff --git a/src/Twig/Components/Challenge/Comments/Comment.php b/src/Twig/Components/Challenge/Comments/Comment.php index 340f57a..438c866 100644 --- a/src/Twig/Components/Challenge/Comments/Comment.php +++ b/src/Twig/Components/Challenge/Comments/Comment.php @@ -31,8 +31,7 @@ final class Comment public function __construct( private readonly EntityManagerInterface $entityManager, private readonly CommentLikeEventRepository $commentLikeEventRepository, - ) { - } + ) {} public function getLikes(): int { diff --git a/src/Twig/Components/Challenge/Comments/CommentForm.php b/src/Twig/Components/Challenge/Comments/CommentForm.php index 3e98188..cdb2ad1 100644 --- a/src/Twig/Components/Challenge/Comments/CommentForm.php +++ b/src/Twig/Components/Challenge/Comments/CommentForm.php @@ -38,20 +38,7 @@ final class CommentForm public function __construct( private readonly FormFactoryInterface $formFactory, - ) { - } - - /** - * @return FormInterface - */ - protected function instantiateForm(): FormInterface - { - $this->initialComment = (new CommentEntity()) - ->setQuestion($this->question) - ->setCommenter($this->commenter); - - return $this->formFactory->create(CommentCreateFormType::class, $this->initialComment); - } + ) {} #[LiveAction] public function save(EntityManagerInterface $entityManager, ParameterBagInterface $parameterBag): void @@ -72,4 +59,17 @@ public function save(EntityManagerInterface $entityManager, ParameterBagInterfac $this->resetForm(); $this->emitUp('app:comment-refresh'); } + + /** + * @return FormInterface + */ + protected function instantiateForm(): FormInterface + { + $this->initialComment = (new CommentEntity()) + ->setQuestion($this->question) + ->setCommenter($this->commenter) + ; + + return $this->formFactory->create(CommentCreateFormType::class, $this->initialComment); + } } diff --git a/src/Twig/Components/Challenge/Executor.php b/src/Twig/Components/Challenge/Executor.php index a49b933..bc362d6 100644 --- a/src/Twig/Components/Challenge/Executor.php +++ b/src/Twig/Components/Challenge/Executor.php @@ -25,30 +25,31 @@ final class Executor use ComponentToolsTrait; use DefaultActionTrait; - public function __construct( - private readonly QuestionSqlRunnerService $questionSqlRunnerService, - private readonly SolutionEventRepository $solutionEventRepository, - private readonly EntityManagerInterface $entityManager, - ) { - } - #[LiveProp] public Question $question; #[LiveProp] public User $user; + public function __construct( + private readonly QuestionSqlRunnerService $questionSqlRunnerService, + private readonly SolutionEventRepository $solutionEventRepository, + private readonly EntityManagerInterface $entityManager, + ) {} + public function getPreviousQuery(): string { $latestQuery = $this->solutionEventRepository - ->getLatestQuery($this->question, $this->user); + ->getLatestQuery($this->question, $this->user) + ; return $latestQuery?->getQuery() ?? ''; } #[LiveAction] public function createNewQuery( - #[LiveArg] string $query, + #[LiveArg] + string $query, ): void { if ('' === $query) { return; @@ -57,7 +58,8 @@ public function createNewQuery( $solutionEvent = (new SolutionEvent()) ->setQuestion($this->question) ->setSubmitter($this->user) - ->setQuery($query); + ->setQuery($query) + ; try { $answer = $this->questionSqlRunnerService->getAnswerResult($this->question); diff --git a/src/Twig/Components/Challenge/Header.php b/src/Twig/Components/Challenge/Header.php index dc68da4..d406861 100644 --- a/src/Twig/Components/Challenge/Header.php +++ b/src/Twig/Components/Challenge/Header.php @@ -31,8 +31,7 @@ public function __construct( private readonly SolutionEventRepository $solutionEventRepository, private readonly QuestionRepository $questionRepository, private readonly PassRateService $passRateService, - ) { - } + ) {} public function getSolveState(): SolveState { diff --git a/src/Twig/Components/Challenge/Instruction/Modal.php b/src/Twig/Components/Challenge/Instruction/Modal.php index 10d2cb6..319c989 100644 --- a/src/Twig/Components/Challenge/Instruction/Modal.php +++ b/src/Twig/Components/Challenge/Instruction/Modal.php @@ -35,18 +35,17 @@ final class Modal use ComponentToolsTrait; use DefaultActionTrait; - public function __construct( - private readonly TranslatorInterface $translator, - private readonly LoggerInterface $logger, - ) { - } - #[LiveProp] public User $currentUser; #[LiveProp] public Question $question; + public function __construct( + private readonly TranslatorInterface $translator, + private readonly LoggerInterface $logger, + ) {} + public function getCost(): int { return PointCalculationService::hintOpenEventPoint; @@ -103,7 +102,8 @@ public function instruct( $hintOpenEvent = (new HintOpenEvent()) ->setOpener($this->currentUser) ->setQuestion($this->question) - ->setQuery($query->getQuery()); + ->setQuery($query->getQuery()) + ; try { try { diff --git a/src/Twig/Components/Challenge/SolutionVideoModal.php b/src/Twig/Components/Challenge/SolutionVideoModal.php index e7f0937..4eec3da 100644 --- a/src/Twig/Components/Challenge/SolutionVideoModal.php +++ b/src/Twig/Components/Challenge/SolutionVideoModal.php @@ -28,8 +28,7 @@ final class SolutionVideoModal public function __construct( private readonly SolutionVideoEventRepository $solutionVideoEventRepository, - ) { - } + ) {} public function getCost(): int { diff --git a/src/Twig/Components/Challenge/SolveState.php b/src/Twig/Components/Challenge/SolveState.php index 76fc616..0d33a3d 100644 --- a/src/Twig/Components/Challenge/SolveState.php +++ b/src/Twig/Components/Challenge/SolveState.php @@ -15,6 +15,6 @@ enum SolveState: string implements TranslatableInterface public function trans(TranslatorInterface $translator, ?string $locale = null): string { - return $translator->trans("challenge.solve-state.$this->value", locale: $locale); + return $translator->trans("challenge.solve-state.{$this->value}", locale: $locale); } } diff --git a/src/Twig/Components/Challenge/Tabs/AnswerQueryResult.php b/src/Twig/Components/Challenge/Tabs/AnswerQueryResult.php index e29004f..cf8a115 100644 --- a/src/Twig/Components/Challenge/Tabs/AnswerQueryResult.php +++ b/src/Twig/Components/Challenge/Tabs/AnswerQueryResult.php @@ -17,17 +17,16 @@ #[AsTwigComponent] final class AnswerQueryResult { - public function __construct( - private readonly QuestionSqlRunnerService $questionSqlRunnerService, - private readonly LoggerInterface $logger, - ) { - } - /** * @var Question the question to present the answer */ public Question $question; + public function __construct( + private readonly QuestionSqlRunnerService $questionSqlRunnerService, + private readonly LoggerInterface $logger, + ) {} + public function getAnswer(): FallableSqlRunnerResult { try { diff --git a/src/Twig/Components/Challenge/Tabs/DiffPresenter.php b/src/Twig/Components/Challenge/Tabs/DiffPresenter.php index 4605519..f3206be 100644 --- a/src/Twig/Components/Challenge/Tabs/DiffPresenter.php +++ b/src/Twig/Components/Challenge/Tabs/DiffPresenter.php @@ -25,15 +25,6 @@ final class DiffPresenter { use DefaultActionTrait; - public function __construct( - private readonly QuestionSqlRunnerService $questionSqlRunnerService, - private readonly SolutionEventRepository $solutionEventRepository, - private readonly TranslatorInterface $translator, - private readonly SerializerInterface $serializer, - private readonly LoggerInterface $logger, - ) { - } - #[LiveProp] public Question $question; @@ -43,6 +34,14 @@ public function __construct( #[LiveProp(writable: true)] public ?string $query = null; + public function __construct( + private readonly QuestionSqlRunnerService $questionSqlRunnerService, + private readonly SolutionEventRepository $solutionEventRepository, + private readonly TranslatorInterface $translator, + private readonly SerializerInterface $serializer, + private readonly LoggerInterface $logger, + ) {} + #[PostMount] public function postMount(): void { diff --git a/src/Twig/Components/Challenge/Tabs/Events.php b/src/Twig/Components/Challenge/Tabs/Events.php index 8c0d084..7472040 100644 --- a/src/Twig/Components/Challenge/Tabs/Events.php +++ b/src/Twig/Components/Challenge/Tabs/Events.php @@ -17,6 +17,10 @@ final class Events { use DefaultActionTrait; + + /** + * @phpstan-use Pagination + */ use Pagination; #[LiveProp] @@ -27,8 +31,7 @@ final class Events public function __construct( private readonly SolutionEventRepository $solutionEventRepository, - ) { - } + ) {} /** * @return SolutionEvent[] @@ -38,6 +41,9 @@ public function getEvents(): array return \array_slice($this->getData(), 0, self::limit); } + #[LiveListener('app:challenge-executor:query-created')] + public function onQueryUpdated(): void {} + /** * Get the data that can be paginated. * @@ -55,9 +61,4 @@ protected function getData(): array offset: ($this->page - 1) * self::limit, ); } - - #[LiveListener('app:challenge-executor:query-created')] - public function onQueryUpdated(): void - { - } } diff --git a/src/Twig/Components/Challenge/Tabs/Pagination.php b/src/Twig/Components/Challenge/Tabs/Pagination.php index 094c737..9e8d990 100644 --- a/src/Twig/Components/Challenge/Tabs/Pagination.php +++ b/src/Twig/Components/Challenge/Tabs/Pagination.php @@ -20,6 +20,8 @@ * * `hasNext` property to check if there is a next page. * * `goPrevious` action to go to the previous page. * * `goNext` action to go to the next page. + * + * @template T */ trait Pagination { @@ -30,6 +32,8 @@ trait Pagination /** * Get the data for the current page. + * + * @return T[] */ abstract public function getData(): array; diff --git a/src/Twig/Components/Challenge/Tabs/SqlRunnerResultTable.php b/src/Twig/Components/Challenge/Tabs/SqlRunnerResultTable.php index 355452c..f383add 100644 --- a/src/Twig/Components/Challenge/Tabs/SqlRunnerResultTable.php +++ b/src/Twig/Components/Challenge/Tabs/SqlRunnerResultTable.php @@ -13,6 +13,10 @@ final class SqlRunnerResultTable { use DefaultActionTrait; + + /** + * @phpstan-use Pagination> + */ use Pagination; /** @@ -22,22 +26,22 @@ final class SqlRunnerResultTable public SqlRunnerResult $result; /** - * Get the paginated rows and another row to determine if there are more pages. + * Get the paginated rows. * * @return array> */ - protected function getData(): array + public function getPaginatedRows(): array { - return \array_slice($this->result->getRows(), ($this->page - 1) * self::limit, self::limit + 1); + return \array_slice($this->getData(), 0, self::limit); } /** - * Get the paginated rows. + * Get the paginated rows and another row to determine if there are more pages. * * @return array> */ - public function getPaginatedRows(): array + protected function getData(): array { - return \array_slice($this->getData(), 0, self::limit); + return \array_slice($this->result->getRows(), ($this->page - 1) * self::limit, self::limit + 1); } } diff --git a/src/Twig/Components/Challenge/Tabs/UserQueryResult.php b/src/Twig/Components/Challenge/Tabs/UserQueryResult.php index 38f5957..58a52c6 100644 --- a/src/Twig/Components/Challenge/Tabs/UserQueryResult.php +++ b/src/Twig/Components/Challenge/Tabs/UserQueryResult.php @@ -27,13 +27,6 @@ final class UserQueryResult { use DefaultActionTrait; - public function __construct( - private readonly QuestionSqlRunnerService $questionSqlRunnerService, - private readonly SolutionEventRepository $solutionEventRepository, - private readonly LoggerInterface $logger, - ) { - } - /** * @var Question $question the question to present the answer */ @@ -49,6 +42,12 @@ public function __construct( #[LiveProp(writable: true)] public ?string $query = null; + public function __construct( + private readonly QuestionSqlRunnerService $questionSqlRunnerService, + private readonly SolutionEventRepository $solutionEventRepository, + private readonly LoggerInterface $logger, + ) {} + #[PostMount] public function postMount(): void { diff --git a/src/Twig/Components/MetricCard.php b/src/Twig/Components/MetricCard.php index cadc3f0..c33eac9 100644 --- a/src/Twig/Components/MetricCard.php +++ b/src/Twig/Components/MetricCard.php @@ -21,7 +21,7 @@ final class MetricCard public string $property = 'neutral'; /** - * @var string|null The value of the growth. + * @var null|string The value of the growth. * If null, the growth will not be displayed. */ public ?string $growth = null; diff --git a/src/Twig/Components/Questions/Card.php b/src/Twig/Components/Questions/Card.php index d509723..5bc2a87 100644 --- a/src/Twig/Components/Questions/Card.php +++ b/src/Twig/Components/Questions/Card.php @@ -18,8 +18,7 @@ final class Card public function __construct( private readonly PassRateService $passRateService, - ) { - } + ) {} /** * Get the pass rate of the question. diff --git a/src/Twig/Components/Questions/FilterableSection.php b/src/Twig/Components/Questions/FilterableSection.php index 6c6e7ee..247450e 100644 --- a/src/Twig/Components/Questions/FilterableSection.php +++ b/src/Twig/Components/Questions/FilterableSection.php @@ -27,16 +27,15 @@ final class FilterableSection #[LiveProp(writable: true, url: new UrlMapping(as: 'q'))] public string $query = ''; - #[LiveProp(writable: true, url: new UrlMapping(as: 'p'))] - private int $currentPage = 1; - #[LiveProp(writable: true, url: new UrlMapping(as: 'type'))] public string $type = ''; + #[LiveProp(writable: true, url: new UrlMapping(as: 'p'))] + private int $currentPage = 1; + public function __construct( private readonly QuestionRepository $questionRepository, - ) { - } + ) {} /** * List the questions based on the current query and type. @@ -126,7 +125,7 @@ public function previousPage(): void /** * Filter the returning questions by type. * - * @param string|null $type The type to filter + * @param null|string $type The type to filter */ #[LiveAction] public function setTypeFilter(#[LiveArg] ?string $type): void diff --git a/src/Twig/Runtime/QuotedListExtensionRuntime.php b/src/Twig/Runtime/QuotedListExtensionRuntime.php index f3a680d..02070b9 100644 --- a/src/Twig/Runtime/QuotedListExtensionRuntime.php +++ b/src/Twig/Runtime/QuotedListExtensionRuntime.php @@ -8,15 +8,13 @@ class QuotedListExtensionRuntime implements RuntimeExtensionInterface { - public function __construct() - { - } + public function __construct() {} /** * @param array $value */ public function joinToQuoted(array $value, string $separator = ', '): string { - return ''.implode("$separator", $value).''; + return ''.implode("{$separator}", $value).''; } } diff --git a/symfony.lock b/symfony.lock index c6473aa..918727e 100644 --- a/symfony.lock +++ b/symfony.lock @@ -41,6 +41,18 @@ "notfloran/mjml-bundle": { "version": "dev-main" }, + "php-cs-fixer/shim": { + "version": "3.65", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "3.0", + "ref": "16422bf8eac6c3be42afe07d37e2abc89d2bdf6b" + }, + "files": [ + ".php-cs-fixer.dist.php" + ] + }, "php-http/discovery": { "version": "1.9999999", "recipe": { diff --git a/templates/email/mjml/_partials/footer.mjml.twig b/templates/email/mjml/_partials/footer.mjml.twig deleted file mode 100644 index e80e816..0000000 --- a/templates/email/mjml/_partials/footer.mjml.twig +++ /dev/null @@ -1,9 +0,0 @@ - - - - 你會收到這封郵件,是因為你是資料庫練功房的練習學生。
- 回報信件問題 -
-
-
diff --git a/templates/email/mjml/_partials/header-situation.mjml.twig b/templates/email/mjml/_partials/header-situation.mjml.twig deleted file mode 100644 index 55d47f3..0000000 --- a/templates/email/mjml/_partials/header-situation.mjml.twig +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/templates/email/mjml/remember-to-login.mjml b/templates/email/mjml/remember-to-login.mjml new file mode 100644 index 0000000..eb0fd5d --- /dev/null +++ b/templates/email/mjml/remember-to-login.mjml @@ -0,0 +1,52 @@ + + + 資料庫練功房 | 情況報告 + + .highlight { color: #E74C3C; font-weight: bold; } + .button { background-color: #3498DB; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px; } + + + + + + + + 資料庫練功房|情況報告 + + + + + + + + 📉 登入天數 減少 ⬇ + + + + + + ⚠️ 我注意到這週你沒有登入,記得持續學習和練習對進步非常重要! + 提醒你一下,如果這週做題數量未達 5 題,每少做一題將會扣 4 分, + 希望你能儘快投入學習,保持進度,這樣才能持續提升自己的 SQL 能力。 + 加油! + + + + 立刻登入 + + + + 如果對信件有任何問題,請與我們回報。 + + + + + + + + © 2024 資料庫練功房 + + + + + diff --git a/templates/email/mjml/remember-to-login.mjml.twig b/templates/email/mjml/remember-to-login.mjml.twig index 4b52781..071140d 100644 --- a/templates/email/mjml/remember-to-login.mjml.twig +++ b/templates/email/mjml/remember-to-login.mjml.twig @@ -1,43 +1,5 @@ {% block email_content %} {% mjml %} - - - - ⚠️ 我注意到這週你沒有登入,記得持續學習和練習對進步非常重要!提醒你一下,如果這週做題數量未達 5 - 題,每少做一題將會扣 4 分,希望你能儘快投入學習,保持進度,這樣才能持續提升自己的 SQL 能力。加油! - - - - - {{ include('email/mjml/_partials/header-situation.mjml.twig') }} - - - - - - - - - - ⚠️ 我注意到這週你沒有登入,記得持續學習和練習對進步非常重要!提醒你一下,如果這週做題數量未達 - 5 - 題,每少做一題將會扣 4 分,希望你能儘快投入學習,保持進度,這樣才能持續提升自己的 SQL 能力。加油! - - - 立即登入 - - - - - - - - - {{ include('email/mjml/_partials/footer.mjml.twig') }} - - - + {{ include('email/mjml/remember-to-login.mjml') }} {% endmjml %} {% endblock %} diff --git a/tests/Entity/EmailDtoTest.php b/tests/Entity/EmailDtoTest.php index 30d73ff..240aff4 100644 --- a/tests/Entity/EmailDtoTest.php +++ b/tests/Entity/EmailDtoTest.php @@ -10,7 +10,12 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Mime\Address; -class EmailDtoTest extends TestCase +/** + * @internal + * + * @coversNothing + */ +final class EmailDtoTest extends TestCase { public function testEmailDtoToEmail(): void { @@ -19,39 +24,42 @@ public function testEmailDtoToEmail(): void ->setToAddress(new Address('test@dbplay.pan93.com')) ->setKind(EmailKind::Test) ->setText('Test text') - ->setHtml('

Test text

'); + ->setHtml('

Test text

') + ; $email = $emailDto->toEmail(); - self::assertEquals('Test subject', $email->getSubject()); - self::assertEquals('test@dbplay.pan93.com', $email->getTo()[0]->getAddress()); - self::assertEquals('Test text', $email->getTextBody()); - self::assertEquals('

Test text

', $email->getHtmlBody()); + self::assertSame('Test subject', $email->getSubject()); + self::assertSame('test@dbplay.pan93.com', $email->getTo()[0]->getAddress()); + self::assertSame('Test text', $email->getTextBody()); + self::assertSame('

Test text

', $email->getHtmlBody()); $extractedKind = EmailKind::fromEmailHeader($email->getHeaders()); - self::assertEquals(EmailKind::Test, $extractedKind); + self::assertSame(EmailKind::Test, $extractedKind); } public function testEmailDtoToUser(): void { $user = (new User()) ->setName('Test name') - ->setEmail('test@dbplay.pan93.com'); + ->setEmail('test@dbplay.pan93.com') + ; $emailDto = EmailDto::fromUser($user) ->setSubject('Test subject') ->setKind(EmailKind::Test) ->setText('Test text') - ->setHtml('

Test text

'); + ->setHtml('

Test text

') + ; $email = $emailDto->toEmail(); - self::assertEquals('Test subject', $email->getSubject()); - self::assertEquals('"Test name" ', $email->getTo()[0]->toString()); - self::assertEquals('Test text', $email->getTextBody()); - self::assertEquals('

Test text

', $email->getHtmlBody()); + self::assertSame('Test subject', $email->getSubject()); + self::assertSame('"Test name" ', $email->getTo()[0]->toString()); + self::assertSame('Test text', $email->getTextBody()); + self::assertSame('

Test text

', $email->getHtmlBody()); $extractedKind = EmailKind::fromEmailHeader($email->getHeaders()); - self::assertEquals(EmailKind::Test, $extractedKind); + self::assertSame(EmailKind::Test, $extractedKind); } } diff --git a/tests/Entity/EmailKindTest.php b/tests/Entity/EmailKindTest.php index a993b45..aa040bb 100644 --- a/tests/Entity/EmailKindTest.php +++ b/tests/Entity/EmailKindTest.php @@ -8,7 +8,12 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Mime\Header\Headers; -class EmailKindTest extends TestCase +/** + * @internal + * + * @coversNothing + */ +final class EmailKindTest extends TestCase { public function testEmailKindAddHeader(): void { @@ -17,7 +22,7 @@ public function testEmailKindAddHeader(): void $header = $kind->addToEmailHeader($header); - self::assertEquals($kind->value, $header->get(EmailKind::EMAIL_HEADER)?->getBodyAsString()); + self::assertSame($kind->value, $header->get(EmailKind::EMAIL_HEADER)?->getBodyAsString()); } public function testEmailKindExtractHeader(): void @@ -28,7 +33,7 @@ public function testEmailKindExtractHeader(): void $extractedKind = EmailKind::fromEmailHeader($header); - self::assertEquals($kind, $extractedKind); + self::assertSame($kind, $extractedKind); } public function testEmailKindNoHeader(): void diff --git a/tests/Entity/LevelTest.php b/tests/Entity/LevelTest.php index 6bf06f0..7293daa 100644 --- a/tests/Entity/LevelTest.php +++ b/tests/Entity/LevelTest.php @@ -8,7 +8,12 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; -class LevelTest extends TestCase +/** + * @internal + * + * @coversNothing + */ +final class LevelTest extends TestCase { #[DataProvider('fromPercentDataProvider')] public function testFromPercent(float $percent, Level $expected): void @@ -23,16 +28,27 @@ public function testFromPercent(float $percent, Level $expected): void public static function fromPercentDataProvider(): iterable { yield [0, Level::Starter]; + yield [4.9, Level::Starter]; + yield [5, Level::Beginner]; + yield [19.9, Level::Beginner]; + yield [20, Level::Intermediate]; + yield [39.9, Level::Intermediate]; + yield [40, Level::Advanced]; + yield [64.9, Level::Advanced]; + yield [65, Level::Expert]; + yield [89.9, Level::Expert]; + yield [90, Level::Master]; + yield [100, Level::Master]; } } diff --git a/tests/Entity/QuestionDifficultyTest.php b/tests/Entity/QuestionDifficultyTest.php index 8d375bb..bb782c4 100644 --- a/tests/Entity/QuestionDifficultyTest.php +++ b/tests/Entity/QuestionDifficultyTest.php @@ -7,7 +7,12 @@ use App\Entity\QuestionDifficulty; use Monolog\Test\TestCase; -class QuestionDifficultyTest extends TestCase +/** + * @internal + * + * @coversNothing + */ +final class QuestionDifficultyTest extends TestCase { public function testJsonSerialize(): void { diff --git a/tests/Entity/QuestionDtoTest.php b/tests/Entity/QuestionDtoTest.php index 66cb6e3..589c2d5 100644 --- a/tests/Entity/QuestionDtoTest.php +++ b/tests/Entity/QuestionDtoTest.php @@ -12,7 +12,12 @@ use PHPUnit\Framework\MockObject\Exception; use PHPUnit\Framework\TestCase; -class QuestionDtoTest extends TestCase +/** + * @internal + * + * @coversNothing + */ +final class QuestionDtoTest extends TestCase { public function testEntityToDto(): void { @@ -23,21 +28,18 @@ public function testEntityToDto(): void ->setTitle('QuestionTest') ->setDescription('DescriptionTest') ->setAnswer('AnswerTest') - ->setSolutionVideo('SolutionVideoTest'); + ->setSolutionVideo('SolutionVideoTest') + ; $questionDto = QuestionDto::fromEntity($entity); - self::assertEquals( - (new QuestionDto()) - ->setSchemaId('1') - ->setType('type') - ->setDifficulty(QuestionDifficulty::Easy) - ->setTitle('QuestionTest') - ->setDescription('DescriptionTest') - ->setAnswer('AnswerTest') - ->setSolutionVideo('SolutionVideoTest'), - $questionDto, - ); + self::assertSame('1', $questionDto->getSchemaId()); + self::assertSame('type', $questionDto->getType()); + self::assertSame(QuestionDifficulty::Easy, $questionDto->getDifficulty()); + self::assertSame('QuestionTest', $questionDto->getTitle()); + self::assertSame('DescriptionTest', $questionDto->getDescription()); + self::assertSame('AnswerTest', $questionDto->getAnswer()); + self::assertSame('SolutionVideoTest', $questionDto->getSolutionVideo()); } /** @@ -48,7 +50,8 @@ public function testToEntity(): void $schemaRepository = $this->createMock(SchemaRepository::class); $schemaRepository ->method('find') - ->willReturn((new Schema())->setId('1')); + ->willReturn((new Schema())->setId('1')) + ; $questionDto = (new QuestionDto()) ->setSchemaId('1') @@ -57,20 +60,17 @@ public function testToEntity(): void ->setTitle('QuestionTest') ->setDescription('DescriptionTest') ->setAnswer('AnswerTest') - ->setSolutionVideo('SolutionVideoTest'); + ->setSolutionVideo('SolutionVideoTest') + ; $entity = $questionDto->toEntity($schemaRepository); - self::assertEquals( - (new Question()) - ->setSchema((new Schema())->setId('1')) - ->setType('type') - ->setDifficulty(QuestionDifficulty::Easy) - ->setTitle('QuestionTest') - ->setDescription('DescriptionTest') - ->setAnswer('AnswerTest') - ->setSolutionVideo('SolutionVideoTest'), - $entity, - ); + self::assertSame('1', $entity->getSchema()->getId()); + self::assertSame('type', $entity->getType()); + self::assertSame(QuestionDifficulty::Easy, $entity->getDifficulty()); + self::assertSame('QuestionTest', $entity->getTitle()); + self::assertSame('DescriptionTest', $entity->getDescription()); + self::assertSame('AnswerTest', $entity->getAnswer()); + self::assertSame('SolutionVideoTest', $entity->getSolutionVideo()); } } diff --git a/tests/Entity/SchemaDtoTest.php b/tests/Entity/SchemaDtoTest.php index e7b5293..bbc921c 100644 --- a/tests/Entity/SchemaDtoTest.php +++ b/tests/Entity/SchemaDtoTest.php @@ -8,7 +8,12 @@ use App\Entity\Schema; use PHPUnit\Framework\TestCase; -class SchemaDtoTest extends TestCase +/** + * @internal + * + * @coversNothing + */ +final class SchemaDtoTest extends TestCase { public function testEntityToDto(): void { @@ -16,18 +21,15 @@ public function testEntityToDto(): void ->setId('SchemaId') ->setPicture('PictureTest') ->setDescription('DescriptionTest') - ->setSchema('SchemaTest'); + ->setSchema('SchemaTest') + ; $schemaDto = SchemaDto::fromEntity($entity); - self::assertEquals( - (new SchemaDto()) - ->setId('SchemaId') - ->setPicture('PictureTest') - ->setDescription('DescriptionTest') - ->setSchema('SchemaTest'), - $schemaDto, - ); + self::assertSame('SchemaId', $schemaDto->getId()); + self::assertSame('PictureTest', $schemaDto->getPicture()); + self::assertSame('DescriptionTest', $schemaDto->getDescription()); + self::assertSame('SchemaTest', $schemaDto->getSchema()); } public function testEntityToDtoWithoutPicture(): void @@ -35,18 +37,15 @@ public function testEntityToDtoWithoutPicture(): void $entity = (new Schema()) ->setId('SchemaId') ->setDescription('DescriptionTest') - ->setSchema('SchemaTest'); + ->setSchema('SchemaTest') + ; $schemaDto = SchemaDto::fromEntity($entity); - self::assertEquals( - (new SchemaDto()) - ->setId('SchemaId') - ->setPicture(null) - ->setDescription('DescriptionTest') - ->setSchema('SchemaTest'), - $schemaDto, - ); + self::assertSame('SchemaId', $schemaDto->getId()); + self::assertNull($schemaDto->getPicture()); + self::assertSame('DescriptionTest', $schemaDto->getDescription()); + self::assertSame('SchemaTest', $schemaDto->getSchema()); } public function testToEntity(): void @@ -55,13 +54,14 @@ public function testToEntity(): void ->setId('SchemaId') ->setPicture('PictureTest') ->setDescription('DescriptionTest') - ->setSchema('SchemaTest'); + ->setSchema('SchemaTest') + ; $schema = $schemaDto->toEntity(); - self::assertEquals('SchemaId', $schema->getId()); - self::assertEquals('PictureTest', $schema->getPicture()); - self::assertEquals('DescriptionTest', $schema->getDescription()); - self::assertEquals('SchemaTest', $schema->getSchema()); + self::assertSame('SchemaId', $schema->getId()); + self::assertSame('PictureTest', $schema->getPicture()); + self::assertSame('DescriptionTest', $schema->getDescription()); + self::assertSame('SchemaTest', $schema->getSchema()); } } diff --git a/tests/EventListener/EmailCreatedSubscriberTest.php b/tests/EventListener/EmailCreatedSubscriberTest.php index 45f8bac..f6ff1b2 100644 --- a/tests/EventListener/EmailCreatedSubscriberTest.php +++ b/tests/EventListener/EmailCreatedSubscriberTest.php @@ -18,7 +18,12 @@ use Symfony\Component\Mailer\Event\MessageEvent; use Symfony\Component\Mime\Email; -class EmailCreatedSubscriberTest extends TestCase +/** + * @internal + * + * @coversNothing + */ +final class EmailCreatedSubscriberTest extends TestCase { public function testTransactionalEmail(): void { @@ -29,7 +34,8 @@ public function testTransactionalEmail(): void ->text('body') ->html('
bodyfrom('demo-dbplay@example.com') - ->to('test@example.com'); + ->to('test@example.com') + ; $headers = $message->getHeaders(); $headers = EmailKind::Test->addToEmailHeader($headers); @@ -42,39 +48,45 @@ public function testTransactionalEmail(): void ->expects(self::once()) ->method('findOneBy') ->with(['email' => 'test@example.com']) - ->willReturn(new UserEntity()); + ->willReturn(new UserEntity()) + ; $invokedCount = self::exactly(2); + /** - * @var Email|null $emailInstance + * @var null|Email $emailInstance */ $emailInstance = null; $entityManager = self::createMock(EntityManagerInterface::class); $entityManager ->expects(self::exactly(2)) ->method('persist') - ->willReturnCallback(function (mixed ...$parameters) use ($invokedCount, &$emailInstance): void { + ->willReturnCallback(static function (mixed ...$parameters) use ($invokedCount, &$emailInstance): void { switch ($invokedCount->numberOfInvocations()) { case 1: $email = $parameters[0]; \assert($email instanceof EmailEntity); - self::assertEquals('subject', $email->getSubject()); - self::assertEquals('body', $email->getTextContent()); - self::assertEquals('
body
', $email->getHtmlContent()); - self::assertEquals(EmailKind::Test, $email->getKind()); + self::assertSame('subject', $email->getSubject()); + self::assertSame('body', $email->getTextContent()); + self::assertSame('
body
', $email->getHtmlContent()); + self::assertSame(EmailKind::Test, $email->getKind()); $emailInstance = $email; + break; + case 2: $event = $parameters[0]; \assert($event instanceof EmailDeliveryEventEntity); - self::assertEquals('test@example.com', $event->getToAddress()); - self::assertEquals($emailInstance, $event->getEmail()); + self::assertSame('test@example.com', $event->getToAddress()); + self::assertSame($emailInstance, $event->getEmail()); + break; } - }); + }) + ; $subscriber = new EmailCreatedSubscriber($logger, $userRepository, $entityManager); $dispatcher = new EventDispatcher(); diff --git a/tests/Service/EmailServiceTest.php b/tests/Service/EmailServiceTest.php index 1615799..087ded5 100644 --- a/tests/Service/EmailServiceTest.php +++ b/tests/Service/EmailServiceTest.php @@ -12,22 +12,28 @@ use Symfony\Component\Mime\Address; use Symfony\Component\Mime\Email; -class EmailServiceTest extends TestCase +/** + * @internal + * + * @coversNothing + */ +final class EmailServiceTest extends TestCase { public function testSendWithoutBcc(): void { $mailer = $this->createMock(MailerInterface::class); $mailer->expects(self::once()) ->method('send') - ->willReturnCallback(function (Email $email): void { + ->willReturnCallback(static function (Email $email): void { self::assertSame('Test', $email->getSubject()); self::assertSame('test@example.com', $email->getFrom()[0]->getAddress()); self::assertSame('test2@gmail.com', $email->getTo()[0]->getAddress()); self::assertSame('Test TEXT', $email->getTextBody()); self::assertSame('Test HTML', $email->getHtmlBody()); - }); + }) + ; - $emailService = new EmailService($mailer, 'test@example.com', 10); + $emailService = new EmailService($mailer, 'test@example.com', 'test+example@example.com', 10); $emailDto = (new EmailDto()) ->setSubject('Test') ->setToAddress('test2@gmail.com') @@ -44,16 +50,17 @@ public function testSendWithBcc(): void $mailer = $this->createMock(MailerInterface::class); $mailer->expects(self::once()) ->method('send') - ->willReturnCallback(function (Email $email): void { + ->willReturnCallback(static function (Email $email): void { self::assertSame('Test', $email->getSubject()); self::assertSame('test@example.com', $email->getFrom()[0]->getAddress()); self::assertSame('test2@gmail.com', $email->getTo()[0]->getAddress()); self::assertSame('me@pan93.com', $email->getBcc()[0]->getAddress()); self::assertSame('Test TEXT', $email->getTextBody()); self::assertSame('Test HTML', $email->getHtmlBody()); - }); + }) + ; - $emailService = new EmailService($mailer, 'test@example.com', 10); + $emailService = new EmailService($mailer, 'test@example.com', 'test+example@example.com', 10); $emailDto = (new EmailDto()) ->setSubject('Test') ->setToAddress('test2@gmail.com') @@ -76,7 +83,7 @@ public function testSendWithChunkedBcc(): void $mailer = $this->createMock(MailerInterface::class); $mailer->expects($invokedCount) ->method('send') - ->willReturnCallback(function (Email $email) use (&$invokedCount, &$lastSendAt): void { + ->willReturnCallback(static function (Email $email) use (&$invokedCount, &$lastSendAt): void { self::assertSame('Test', $email->getSubject()); self::assertSame('test@example.com', $email->getFrom()[0]->getAddress()); self::assertSame('test@example.com', $email->getTo()[0]->getAddress()); @@ -89,26 +96,56 @@ public function testSendWithChunkedBcc(): void self::assertSame('bcc1@example.com', $email->getBcc()[0]->getAddress()); self::assertSame('bcc10@example.com', $email->getBcc()[9]->getAddress()); $lastSendAt = $email->getDate(); + break; + case 2: self::assertCount(1, $email->getBcc()); self::assertSame('bcc11@example.com', $email->getBcc()[0]->getAddress()); self::assertGreaterThan($lastSendAt, $email->getDate()); } - }); + }) + ; - $emailService = new EmailService($mailer, 'test@example.com', 10); + $emailService = new EmailService($mailer, 'test@example.com', 'test+example@example.com', 10); $emailDto = (new EmailDto()) ->setSubject('Test') ->setToAddress('test@example.com') ->setBcc(array_map( - fn (int $i) => new Address("bcc$i@example.com"), + static fn (int $i) => new Address("bcc{$i}@example.com"), range(1, 11) )) ->setKind(EmailKind::Test) ->setText('Test TEXT') - ->setHtml('Test HTML'); + ->setHtml('Test HTML') + ; $emailService->send($emailDto); } + + public function testSendToTestEmail(): void + { + $mailer = $this->createMock(MailerInterface::class); + $mailer->expects(self::once()) + ->method('send') + ->willReturnCallback(static function (Email $email): void { + self::assertSame('Test', $email->getSubject()); + self::assertSame('test@example.com', $email->getFrom()[0]->getAddress()); + self::assertSame('test+target@example.com', $email->getTo()[0]->getAddress()); + self::assertSame('Test TEXT', $email->getTextBody()); + self::assertSame('Test HTML', $email->getHtmlBody()); + }) + ; + + $emailService = new EmailService($mailer, 'test@example.com', 'test+target@example.com', 10); + + $emailDto = (new EmailDto()) + ->setSubject('Test') + ->setKind(EmailKind::Test) + ->setText('Test TEXT') + ->setHtml('Test HTML') + ; + + $emailService->sendToTest($emailDto); + } } diff --git a/tests/SqlRunner/SqlRunnerServiceTest.php b/tests/SqlRunner/SqlRunnerServiceTest.php index 6792f5c..a756e7c 100644 --- a/tests/SqlRunner/SqlRunnerServiceTest.php +++ b/tests/SqlRunner/SqlRunnerServiceTest.php @@ -4,14 +4,25 @@ namespace App\Tests\SqlRunner; +use App\Entity\SqlRunnerDto\SqlRunnerRequest; use App\Entity\SqlRunnerDto\SqlRunnerResponse; +use App\Entity\SqlRunnerDto\SqlRunnerResult; +use App\Exception\QueryExecuteException; +use App\Exception\SchemaExecuteException; use App\Exception\SqlRunnerException; +use App\Service\SqlRunnerService; use Monolog\Test\TestCase; use Symfony\Component\HttpClient\Exception\TransportException; +use Symfony\Component\Serializer\Exception\NotNormalizableValueException; use Symfony\Component\Serializer\SerializerInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; +/** + * @internal + * + * @coversNothing + */ final class SqlRunnerServiceTest extends TestCase { public function testRunQueryClientError(): void @@ -32,8 +43,8 @@ public function testRunQueryClientError(): void ->method('deserialize') ; - $sqlRunnerService = new \App\Service\SqlRunnerService($httpClient, $serializer, ''); - $sqlRunnerService->runQuery(new \App\Entity\SqlRunnerDto\SqlRunnerRequest()); + $sqlRunnerService = new SqlRunnerService($httpClient, $serializer, ''); + $sqlRunnerService->runQuery(new SqlRunnerRequest()); } public function testRunQueryProtocolError(): void @@ -52,11 +63,11 @@ public function testRunQueryProtocolError(): void $serializer ->expects(self::once()) ->method('deserialize') - ->willThrowException(new \Symfony\Component\Serializer\Exception\NotNormalizableValueException()) + ->willThrowException(new NotNormalizableValueException()) ; - $sqlRunnerService = new \App\Service\SqlRunnerService($httpClient, $serializer, ''); - $sqlRunnerService->runQuery(new \App\Entity\SqlRunnerDto\SqlRunnerRequest()); + $sqlRunnerService = new SqlRunnerService($httpClient, $serializer, ''); + $sqlRunnerService->runQuery(new SqlRunnerRequest()); } public function testRunQueryRunnerException(): void @@ -83,13 +94,13 @@ public function testRunQueryRunnerException(): void ) ; - $sqlRunnerService = new \App\Service\SqlRunnerService($httpClient, $serializer, ''); - $sqlRunnerService->runQuery(new \App\Entity\SqlRunnerDto\SqlRunnerRequest()); + $sqlRunnerService = new SqlRunnerService($httpClient, $serializer, ''); + $sqlRunnerService->runQuery(new SqlRunnerRequest()); } public function testRunQueryQueryException(): void { - $this->expectException(\App\Exception\QueryExecuteException::class); + $this->expectException(QueryExecuteException::class); $this->expectExceptionMessage('Query error'); $httpClient = self::createMock(HttpClientInterface::class); @@ -111,13 +122,13 @@ public function testRunQueryQueryException(): void ) ; - $sqlRunnerService = new \App\Service\SqlRunnerService($httpClient, $serializer, ''); - $sqlRunnerService->runQuery(new \App\Entity\SqlRunnerDto\SqlRunnerRequest()); + $sqlRunnerService = new SqlRunnerService($httpClient, $serializer, ''); + $sqlRunnerService->runQuery(new SqlRunnerRequest()); } public function testRunQuerySchemaException(): void { - $this->expectException(\App\Exception\SchemaExecuteException::class); + $this->expectException(SchemaExecuteException::class); $this->expectExceptionMessage('Schema error'); $httpClient = self::createMock(HttpClientInterface::class); @@ -139,8 +150,8 @@ public function testRunQuerySchemaException(): void ) ; - $sqlRunnerService = new \App\Service\SqlRunnerService($httpClient, $serializer, ''); - $sqlRunnerService->runQuery(new \App\Entity\SqlRunnerDto\SqlRunnerRequest()); + $sqlRunnerService = new SqlRunnerService($httpClient, $serializer, ''); + $sqlRunnerService->runQuery(new SqlRunnerRequest()); } public function testRunQueryBadPayload(): void @@ -167,8 +178,8 @@ public function testRunQueryBadPayload(): void ) ; - $sqlRunnerService = new \App\Service\SqlRunnerService($httpClient, $serializer, ''); - $sqlRunnerService->runQuery(new \App\Entity\SqlRunnerDto\SqlRunnerRequest()); + $sqlRunnerService = new SqlRunnerService($httpClient, $serializer, ''); + $sqlRunnerService->runQuery(new SqlRunnerRequest()); } public function testRunQuerySuccess(): void @@ -180,9 +191,10 @@ public function testRunQuerySuccess(): void ->willReturn(self::createMock(ResponseInterface::class)) ; - $result = (new \App\Entity\SqlRunnerDto\SqlRunnerResult()) + $result = (new SqlRunnerResult()) ->setColumns(['column1', 'column2']) - ->setRows([['row1', 'row2']]); + ->setRows([['row1', 'row2']]) + ; $serializer = self::createMock(SerializerInterface::class); $serializer @@ -195,8 +207,8 @@ public function testRunQuerySuccess(): void ) ; - $sqlRunnerService = new \App\Service\SqlRunnerService($httpClient, $serializer, ''); - $result = $sqlRunnerService->runQuery(new \App\Entity\SqlRunnerDto\SqlRunnerRequest()); - self::assertEquals(['column1', 'column2'], $result->getColumns()); + $sqlRunnerService = new SqlRunnerService($httpClient, $serializer, ''); + $result = $sqlRunnerService->runQuery(new SqlRunnerRequest()); + self::assertSame(['column1', 'column2'], $result->getColumns()); } } diff --git a/tools/.gitignore b/tools/.gitignore new file mode 100644 index 0000000..48b8bf9 --- /dev/null +++ b/tools/.gitignore @@ -0,0 +1 @@ +vendor/ diff --git a/tools/php-cs-fixer/composer.json b/tools/php-cs-fixer/composer.json new file mode 100644 index 0000000..5888e95 --- /dev/null +++ b/tools/php-cs-fixer/composer.json @@ -0,0 +1,7 @@ +{ + "minimum-stability": "dev", + "prefer-stable": false, + "require": { + "friendsofphp/php-cs-fixer": "dev-master" + } +} diff --git a/tools/php-cs-fixer/composer.lock b/tools/php-cs-fixer/composer.lock new file mode 100644 index 0000000..feb5f29 --- /dev/null +++ b/tools/php-cs-fixer/composer.lock @@ -0,0 +1,2573 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "b1d1c0be11917b660872974a65d4cd4a", + "packages": [ + { + "name": "clue/ndjson-react", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "8fc557eaa902e4f1de171b5b4eaa6246fbe4118e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/8fc557eaa902e4f1de171b5b4eaa6246fbe4118e", + "reference": "8fc557eaa902e4f1de171b5b4eaa6246fbe4118e", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/event-loop": "^1.2" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\NDJson\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "homepage": "https://github.com/clue/reactphp-ndjson", + "keywords": [ + "NDJSON", + "json", + "jsonlines", + "newline", + "reactphp", + "streaming" + ], + "support": { + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/1.x" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2023-11-24T09:04:50+00:00" + }, + { + "name": "composer/pcre", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "deb3871d20d5012eb5faa5a9caa71c44f151db49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/deb3871d20d5012eb5faa5a9caa71c44f151db49", + "reference": "deb3871d20d5012eb5faa5a9caa71c44f151db49", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "default-branch": true, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/main" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-20T09:10:58+00:00" + }, + { + "name": "composer/semver", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-09-19T14:15:21+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "ad0cc3078a93a8438edbc58e7e2094a8b38d7389" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/ad0cc3078a93a8438edbc58e7e2094a8b38d7389", + "reference": "ad0cc3078a93a8438edbc58e7e2094a8b38d7389", + "shasum": "" + }, + "require": { + "clue/ndjson-react": "^1.0", + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.3", + "ext-filter": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "fidry/cpu-core-counter": "^1.2", + "php": "^7.4 || ^8.0", + "react/child-process": "^0.6.5", + "react/event-loop": "^1.0", + "react/promise": "^2.0 || ^3.0", + "react/socket": "^1.0", + "react/stream": "^1.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-mbstring": "^1.28", + "symfony/polyfill-php80": "^1.28", + "symfony/polyfill-php81": "^1.28", + "symfony/process": "^5.4 || ^6.0 || ^7.0 <7.2", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3.1 || ^2.4", + "infection/infection": "^0.29.8", + "justinrainbow/json-schema": "^5.3 || ^6.0", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.12", + "php-coveralls/php-coveralls": "^2.7", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", + "phpunit/phpunit": "^9.6.21 || ^10.5.38 || ^11.4.3", + "symfony/var-dumper": "^5.4.47 || ^6.4.15 || ^7.1.8", + "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.1.6" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "default-branch": true, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + }, + "exclude-from-classmap": [ + "src/Fixer/Internal/*" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/master" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2024-12-29T13:46:41+00:00" + }, + { + "name": "psr/container", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "707984727bd5b2b670e59559d3ed2500240cf875" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/707984727bd5b2b670e59559d3ed2500240cf875", + "reference": "707984727bd5b2b670e59559d3ed2500240cf875", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container" + }, + "time": "2023-09-22T11:11:30+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "bbd9eacc080d33861e5b5c75b3b8c4d7e6d01874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/bbd9eacc080d33861e5b5c75b3b8c4d7e6d01874", + "reference": "bbd9eacc080d33861e5b5c75b3b8c4d7e6d01874", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "suggest": { + "fig/event-dispatcher-util": "Provides some useful PSR-14 utilities" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "source": "https://github.com/php-fig/event-dispatcher" + }, + "time": "2024-03-17T21:29:03+00:00" + }, + { + "name": "psr/log", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "react/cache", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "36c51f36d5f3c23cfcc2b5dc5e443bb5ff085605" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/36c51f36d5f3c23cfcc2b5dc5e443bb5ff085605", + "reference": "36c51f36d5f3c23cfcc2b5dc5e443bb5ff085605", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/1.x" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-01-04T09:16:03+00:00" + }, + { + "name": "react/child-process", + "version": "0.6.x-dev", + "source": { + "type": "git", + "url": "https://github.com/reactphp/child-process.git", + "reference": "7ee5a339402114a1e4d7c8351626d9493f1e6d76" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/7ee5a339402114a1e4d7c8351626d9493f1e6d76", + "reference": "7ee5a339402114a1e4d7c8351626d9493f1e6d76", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/socket": "^1.8", + "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\ChildProcess\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven library for executing child processes with ReactPHP.", + "keywords": [ + "event-driven", + "process", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/0.6.x" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-12-24T21:26:57+00:00" + }, + { + "name": "react/dns", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.13.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-13T14:18:03+00:00" + }, + { + "name": "react/event-loop", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-13T13:48:05+00:00" + }, + { + "name": "react/promise", + "version": "3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "5f80055cc21ba7bcd3989e4902061fc12e2bcc1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/5f80055cc21ba7bcd3989e4902061fc12e2bcc1d", + "reference": "5f80055cc21ba7bcd3989e4902061fc12e2bcc1d", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "default-branch": true, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/3.x" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-11-19T18:32:50+00:00" + }, + { + "name": "react/socket", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.13", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3.3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.16.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-07-26T10:38:09+00:00" + }, + { + "name": "react/stream", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-11T12:45:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "293ac5e3a438213af82723953094ebe7bfafeb95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/293ac5e3a438213af82723953094ebe7bfafeb95", + "reference": "293ac5e3a438213af82723953094ebe7bfafeb95", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3", + "symfony/process": "^4.2 || ^5" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/main" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-12-13T08:26:44+00:00" + }, + { + "name": "symfony/console", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "28d6a7c0d8389c1d1b8b6ade38c79a50754313b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/28d6a7c0d8389c1d1b8b6ade38c79a50754313b9", + "reference": "28d6a7c0d8389c1d1b8b6ade38c79a50754313b9", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/7.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-14T16:08:18+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/filesystem", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-25T15:15:23+00:00" + }, + { + "name": "symfony/finder", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "86dd50b11455bdeee991048f19efe26a18d6081b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/86dd50b11455bdeee991048f19efe26a18d6081b", + "reference": "86dd50b11455bdeee991048f19efe26a18d6081b", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/7.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-12T06:45:37+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-20T11:17:29+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/1.x" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "7.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/42783370fda6e538771f7c7a36e9fa2ee3a84892", + "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.1.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-06T14:23:19+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "5ad38698559cf88b6296629e19b15ef3239c9d7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/5ad38698559cf88b6296629e19b15ef3239c9d7a", + "reference": "5ad38698559cf88b6296629e19b15ef3239c9d7a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "696f418b0d722a4225e1c3d95489d262971ca924" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/696f418b0d722a4225e1c3d95489d262971ca924", + "reference": "696f418b0d722a4225e1c3d95489d262971ca924", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/string", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-13T13:31:26+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "friendsofphp/php-cs-fixer": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/tools/twig-cs-fixer/composer.json b/tools/twig-cs-fixer/composer.json new file mode 100644 index 0000000..1132f1b --- /dev/null +++ b/tools/twig-cs-fixer/composer.json @@ -0,0 +1,7 @@ +{ + "minimum-stability": "dev", + "prefer-stable": false, + "require": { + "vincentlanglet/twig-cs-fixer": "dev-main" + } +} diff --git a/tools/twig-cs-fixer/composer.lock b/tools/twig-cs-fixer/composer.lock new file mode 100644 index 0000000..99f73a0 --- /dev/null +++ b/tools/twig-cs-fixer/composer.lock @@ -0,0 +1,1157 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "0bd699256cc3c731ddc615bf612159ca", + "packages": [ + { + "name": "psr/container", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "707984727bd5b2b670e59559d3ed2500240cf875" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/707984727bd5b2b670e59559d3ed2500240cf875", + "reference": "707984727bd5b2b670e59559d3ed2500240cf875", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container" + }, + "time": "2023-09-22T11:11:30+00:00" + }, + { + "name": "symfony/console", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "28d6a7c0d8389c1d1b8b6ade38c79a50754313b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/28d6a7c0d8389c1d1b8b6ade38c79a50754313b9", + "reference": "28d6a7c0d8389c1d1b8b6ade38c79a50754313b9", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/7.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-14T16:08:18+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/filesystem", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-25T15:15:23+00:00" + }, + { + "name": "symfony/finder", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "86dd50b11455bdeee991048f19efe26a18d6081b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/86dd50b11455bdeee991048f19efe26a18d6081b", + "reference": "86dd50b11455bdeee991048f19efe26a18d6081b", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/7.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-12T06:45:37+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/1.x" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "5ad38698559cf88b6296629e19b15ef3239c9d7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/5ad38698559cf88b6296629e19b15ef3239c9d7a", + "reference": "5ad38698559cf88b6296629e19b15ef3239c9d7a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/string", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-13T13:31:26+00:00" + }, + { + "name": "twig/twig", + "version": "3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "d184e9fe12e1a8d219a95638ee78ad577a59e299" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/d184e9fe12e1a8d219a95638ee78ad577a59e299", + "reference": "d184e9fe12e1a8d219a95638ee78ad577a59e299", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php81": "^1.29" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" + }, + "default-branch": true, + "type": "library", + "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/3.x" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2024-12-29T10:52:41+00:00" + }, + { + "name": "vincentlanglet/twig-cs-fixer", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/VincentLanglet/Twig-CS-Fixer.git", + "reference": "63c500016f7eb34a0f2aa2cfe8e1ac834fd857ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/63c500016f7eb34a0f2aa2cfe8e1ac834fd857ba", + "reference": "63c500016f7eb34a0f2aa2cfe8e1ac834fd857ba", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0.0", + "ext-ctype": "*", + "ext-json": "*", + "php": ">=8.0", + "symfony/console": "^5.4.9 || ^6.4 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", + "symfony/finder": "^5.4 || ^6.4 || ^7.0", + "symfony/string": "^5.4.42 || ^6.4.10 || ~7.0.10 || ^7.1.3", + "twig/twig": "^3.4", + "webmozart/assert": "^1.10" + }, + "require-dev": { + "composer/semver": "^3.2.0", + "dereuromark/composer-prefer-lowest": "^0.1.10", + "ergebnis/composer-normalize": "^2.29", + "friendsofphp/php-cs-fixer": "^3.13.0", + "infection/infection": "^0.26.16 || ^0.27.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpstan/phpstan-symfony": "^2.0", + "phpstan/phpstan-webmozart-assert": "^2.0", + "phpunit/phpunit": "^9.5.26 || ^10.0.9", + "psalm/plugin-phpunit": "^0.19.0", + "psalm/plugin-symfony": "^5.0.0", + "rector/rector": "^2.0.0", + "shipmonk/composer-dependency-analyser": "^1.6", + "symfony/process": "^5.4 || ^6.4 || ^7.0", + "symfony/twig-bridge": "^5.4 || ^6.4 || ^7.0", + "symfony/ux-twig-component": "^2.2.0", + "twig/cache-extra": "^3.2", + "vimeo/psalm": "^5.2.0" + }, + "default-branch": true, + "bin": [ + "bin/twig-cs-fixer" + ], + "type": "coding-standard", + "autoload": { + "psr-4": { + "TwigCsFixer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Vincent Langlet" + } + ], + "description": "A tool to automatically fix Twig code style", + "homepage": "https://github.com/VincentLanglet/Twig-CS-Fixer", + "support": { + "issues": "https://github.com/VincentLanglet/Twig-CS-Fixer/issues", + "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/main" + }, + "funding": [ + { + "url": "https://github.com/VincentLanglet", + "type": "github" + } + ], + "time": "2024-12-22T01:22:57+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "vincentlanglet/twig-cs-fixer": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/zeabur/app.yaml b/zeabur/app.yaml index 53ea662..311b56f 100644 --- a/zeabur/app.yaml +++ b/zeabur/app.yaml @@ -254,6 +254,10 @@ spec: MESSENGER_CONSUMER_NAME: default: app-sf-worker-1 expose: false + SERVER_EMAIL: + default: + MAILER_DSN: + default: ses+api://:@default?region= configs: [] - name: worker-2 icon: https://s3.dbplay.pan93.com/icon.svg @@ -265,6 +269,10 @@ spec: MESSENGER_CONSUMER_NAME: default: app-sf-worker-2 expose: false + SERVER_EMAIL: + default: + MAILER_DSN: + default: ses+api://:@default?region= configs: [] - name: worker-3 icon: https://s3.dbplay.pan93.com/icon.svg @@ -276,4 +284,8 @@ spec: MESSENGER_CONSUMER_NAME: default: app-sf-worker-3 expose: false + SERVER_EMAIL: + default: + MAILER_DSN: + default: ses+api://:@default?region= configs: []