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('body
from('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: []