From 30b1b8e522e608805d29c1ea5a49cbf288f39218 Mon Sep 17 00:00:00 2001 From: Tijs Verkoyen Date: Mon, 13 Jul 2026 14:31:02 +0200 Subject: [PATCH 1/8] chore: changes from latest (mago) framework version --- .crontab | 2 +- .env | 1 + .env.test | 2 +- .gitlab-ci.yml | 81 +- assets/controllers.json | 5 +- composer.json | 7 +- composer.lock | 2116 ++++++++++++++++------------- config/packages/asset_mapper.yaml | 2 +- config/packages/doctrine.yaml | 4 +- config/packages/web_profiler.yaml | 3 +- config/reference.php | 234 ++-- importmap.php | 248 +--- mago.dist.toml | 101 ++ phpstan.dist.neon | 1 + public/index.php | 2 +- symfony.lock | 96 +- 16 files changed, 1655 insertions(+), 1250 deletions(-) create mode 100644 mago.dist.toml diff --git a/.crontab b/.crontab index c5ced36..9ce83b9 100644 --- a/.crontab +++ b/.crontab @@ -13,4 +13,4 @@ # | |_______ hour (0-23) # |_________ minute (0-59) MAILTO=bugs@sumocoders.be -*/2 * * * * php8.5 ~/wwwroot/current/bin/console messenger:consume async --time-limit=110 --quiet +*/2 * * * * php8.5 ~/wwwroot/current/bin/console messenger:consume async --time-limit=110 --env=prod --quiet diff --git a/.env b/.env index ca27cc6..b339353 100644 --- a/.env +++ b/.env @@ -58,4 +58,5 @@ MAILER_DEFAULT_TO_EMAIL="mailer_default_to_email_is_misconfigured@tesuta.be" ###> sumocoders/framework-core-bundle ### SITE_TITLE="Your application" ENCRYPTION_KEY="8ea13de9680e2a1441774ec26642fa65a56d8099f44a301f219864b51bbaa925" +DEFAULT_URI="/" ###< sumocoders/framework-core-bundle ### diff --git a/.env.test b/.env.test index 1462ee1..9608cb4 100644 --- a/.env.test +++ b/.env.test @@ -2,5 +2,5 @@ KERNEL_CLASS='App\Kernel' APP_SECRET='$ecretf0rt3st' SYMFONY_DEPRECATIONS_HELPER=999999 -DATABASE_URL="mysql://root:root@127.0.0.1:3306/ci?serverVersion=5.7" +DATABASE_URL="mysql://root:root@127.0.0.1:3306/ci?serverVersion=8.0" MAILER_DSN=null://default diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 724232e..932401d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,12 +7,17 @@ stages: - test - deploy +workflow: + auto_cancel: + on_new_commit: interruptible + # Cache default configuration cache: &global_cache key: "$CI_PIPELINE_ID" paths: - node_modules - public/build + - var/sass - vendor policy: pull @@ -29,20 +34,77 @@ Install dependencies and build assets: <<: *global_cache policy: pull-push stage: build + interruptible: true tags: - docker # Code Quality section +Mago - check code styling: + image: + name: ghcr.io/carthage-software/mago:1 + entrypoint: [ '' ] + script: + - mago --config=./mago.dist.toml --colors=always fmt --check + after_script: + - > + if [ "$CI_JOB_STATUS" != 'success' ]; then + mago --config=./mago.dist.toml --colors=always fmt --dry-run + fi + stage: code quality + interruptible: true + needs: [ "Install dependencies and build assets" ] + tags: + - docker + +Mago - lint: + image: + name: ghcr.io/carthage-software/mago:1 + entrypoint: [ '' ] + script: + - mago --config=./mago.dist.toml --colors=always lint --reporting-format=rich --minimum-fail-level=warning + stage: code quality + interruptible: true + needs: [ "Install dependencies and build assets" ] + tags: + - docker + allow_failure: true + +Mago - analyse: + image: + name: ghcr.io/carthage-software/mago:1 + entrypoint: [ '' ] + script: + - mago --config=./mago.dist.toml --colors=always analyse --reporting-format=rich --minimum-fail-level=warning + stage: code quality + interruptible: true + needs: [ "Install dependencies and build assets" ] + tags: + - docker + +Mago - guard: + image: + name: ghcr.io/carthage-software/mago:1 + entrypoint: [ '' ] + script: + - mago --config=./mago.dist.toml --colors=always guard --reporting-format=rich --minimum-fail-level=warning + stage: code quality + interruptible: true + needs: [ "Install dependencies and build assets" ] + tags: + - docker + allow_failure: true + PHP_CodeSniffer - check code styling: image: sumocoders/cli-tools-php85:latest script: - - php vendor/bin/phpcs --colors --report-full --report-\\Micheh\\PhpCodeSniffer\\Report\\Gitlab=phpcs-report.json + - php vendor/bin/phpcs --colors --report-full -s --report-\\Micheh\\PhpCodeSniffer\\Report\\Gitlab=phpcs-report.json artifacts: expire_in: 1 week reports: codequality: phpcs-report.json stage: code quality + interruptible: true needs: [ "Install dependencies and build assets" ] tags: - docker @@ -56,7 +118,7 @@ PHPStan - check for bugs: after_script: # Run it again so the output is visible in the job - > - if [ $CI_JOB_STATUS != 'success' ]; then + if [ "$CI_JOB_STATUS" != 'success' ]; then php vendor/bin/phpstan analyse --memory-limit=-1 --no-progress fi artifacts: @@ -64,6 +126,7 @@ PHPStan - check for bugs: reports: codequality: phpstan-report.json stage: code quality + interruptible: true needs: [ "Install dependencies and build assets" ] tags: - docker @@ -75,7 +138,7 @@ Twig-CS-Fixer - check code styling: after_script: # Run it again so the output is visible in the job - > - if [ $CI_JOB_STATUS != 'success' ]; then + if [ "$CI_JOB_STATUS" != 'success' ]; then php vendor/bin/twig-cs-fixer --no-interaction lint templates/ fi artifacts: @@ -83,6 +146,7 @@ Twig-CS-Fixer - check code styling: reports: junit: twigcs-report.xml stage: code quality + interruptible: true needs: [ "Install dependencies and build assets" ] tags: - docker @@ -94,7 +158,7 @@ Stylelint - check code styling: - stylelint --output-file=stylelint-report.json --custom-formatter=stylelint-formatter-gitlab-code-quality-report . after_script: - > - if [ $CI_JOB_STATUS != 'success' ]; then + if [ "$CI_JOB_STATUS" != 'success' ]; then stylelint --color . fi artifacts: @@ -102,6 +166,7 @@ Stylelint - check code styling: reports: codequality: stylelint-report.json stage: code quality + interruptible: true needs: [ "Install dependencies and build assets" ] tags: - docker @@ -116,6 +181,7 @@ StandardJS - check code styling: reports: codequality: standardjs-report.json stage: code quality + interruptible: true needs: [ "Install dependencies and build assets" ] tags: - docker @@ -128,6 +194,7 @@ NPM packages - check for vulnerabilities: script: - php bin/console importmap:audit --no-interaction --ansi stage: dependency scanning + interruptible: true needs: [ "Install dependencies and build assets" ] tags: - docker @@ -138,6 +205,7 @@ PHP packages - composer audit: script: - composer audit --ansi --no-interaction stage: dependency scanning + interruptible: true needs: [ "Install dependencies and build assets" ] tags: - docker @@ -150,6 +218,7 @@ NPM packages - check for outdated packages: script: - php bin/console importmap:outdated --no-interaction --ansi stage: outdated packages + interruptible: true needs: [ "Install dependencies and build assets" ] tags: - docker @@ -160,6 +229,7 @@ PHP packages - composer outdated: script: - composer outdated --ansi --no-interaction --strict stage: outdated packages + interruptible: true needs: [ "Install dependencies and build assets" ] tags: - docker @@ -190,6 +260,7 @@ PHPUnit - Run tests: reports: junit: phpunit-report.xml stage: test + interruptible: true needs: [ "Install dependencies and build assets" ] tags: - docker @@ -236,6 +307,7 @@ Deploy - to staging: name: staging url: https://$project.$client.php85.sumocoders.eu stage: deploy + interruptible: false rules: - if: '$CI_PIPELINE_SOURCE == "schedule"' when: never @@ -262,6 +334,7 @@ Deploy - to production: name: production url: https://$productionUrl stage: deploy + interruptible: false rules: - if: '$CI_PIPELINE_SOURCE == "schedule"' when: never diff --git a/assets/controllers.json b/assets/controllers.json index c59f1ab..4c681b6 100644 --- a/assets/controllers.json +++ b/assets/controllers.json @@ -14,7 +14,10 @@ "@symfony/ux-turbo": { "turbo-core": { "enabled": true, - "fetch": "eager" + "fetch": "eager", + "autoimport": { + "@symfony/ux-turbo/dist/mercure_stream_source_element.js": true + } }, "mercure-turbo-stream": { "enabled": false, diff --git a/composer.json b/composer.json index 69363e4..c226b14 100644 --- a/composer.json +++ b/composer.json @@ -30,15 +30,16 @@ "symfony/runtime": "^8.0", "symfony/security-bundle": "^8.0", "symfony/stimulus-bundle": "^2.22", - "symfony/ux-turbo": "^2.22", + "symfony/ux-turbo": "^3.0", "symfony/validator": "^8.0", "symfony/web-profiler-bundle": "^8.0", "symfony/yaml": "^8.0", - "symfonycasts/sass-bundle": "^0.9", + "symfonycasts/sass-bundle": "^0.10", "twbs/bootstrap": "^5.3", "twbs/bootstrap-icons": "^1.13" }, "require-dev": { + "carthage-software/mago": "^1.27", "dama/doctrine-test-bundle": "^8.3", "doctrine/doctrine-fixtures-bundle": "^4.3", "micheh/phpcs-gitlab": "^2.0", @@ -48,7 +49,7 @@ "squizlabs/php_codesniffer": "^4.0", "symfony/maker-bundle": "*", "symfony/stopwatch": "^8.0", - "tijsverkoyen/deployer-sumo": "^4.3", + "tijsverkoyen/deployer-sumo": "^5.0", "vincentlanglet/twig-cs-fixer": "*" }, "config": { diff --git a/composer.lock b/composer.lock index 46772df..0815f46 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "df4449e123eaf3c8f121d4d8eeedf427", + "content-hash": "fe3ff28afd315fc45c684d88d9ae1405", "packages": [ { "name": "bacon/bacon-qr-code", - "version": "v3.0.3", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/Bacon/BaconQrCode.git", - "reference": "36a1cb2b81493fa5b82e50bf8068bf84d1542563" + "reference": "4da2233e72eeecd9be3b62e0dc2cc9ed8e2e31c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/36a1cb2b81493fa5b82e50bf8068bf84d1542563", - "reference": "36a1cb2b81493fa5b82e50bf8068bf84d1542563", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/4da2233e72eeecd9be3b62e0dc2cc9ed8e2e31c2", + "reference": "4da2233e72eeecd9be3b62e0dc2cc9ed8e2e31c2", "shasum": "" }, "require": { @@ -57,9 +57,9 @@ "homepage": "https://github.com/Bacon/BaconQrCode", "support": { "issues": "https://github.com/Bacon/BaconQrCode/issues", - "source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.3" + "source": "https://github.com/Bacon/BaconQrCode/tree/v3.1.1" }, - "time": "2025-11-19T17:15:36+00:00" + "time": "2026-04-05T21:06:35+00:00" }, { "name": "beberlei/doctrineextensions", @@ -125,16 +125,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.10", + "version": "1.5.12", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63" + "reference": "00a2f4201641d5c53f7fc0195e6c8d9fcc321a78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/961a5e4056dd2e4a2eedcac7576075947c28bf63", - "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/00a2f4201641d5c53f7fc0195e6c8d9fcc321a78", + "reference": "00a2f4201641d5c53f7fc0195e6c8d9fcc321a78", "shasum": "" }, "require": { @@ -181,7 +181,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.10" + "source": "https://github.com/composer/ca-bundle/tree/1.5.12" }, "funding": [ { @@ -193,7 +193,7 @@ "type": "github" } ], - "time": "2025-12-08T15:06:51+00:00" + "time": "2026-05-19T11:26:22+00:00" }, { "name": "composer/semver", @@ -410,16 +410,16 @@ }, { "name": "doctrine/dbal", - "version": "4.4.1", + "version": "4.4.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c" + "reference": "61e730f1658814821a85f2402c945f3883407dec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", - "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/61e730f1658814821a85f2402c945f3883407dec", + "reference": "61e730f1658814821a85f2402c945f3883407dec", "shasum": "" }, "require": { @@ -435,9 +435,9 @@ "phpstan/phpstan": "2.1.30", "phpstan/phpstan-phpunit": "2.0.7", "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "11.5.23", - "slevomat/coding-standard": "8.24.0", - "squizlabs/php_codesniffer": "4.0.0", + "phpunit/phpunit": "11.5.50", + "slevomat/coding-standard": "8.27.1", + "squizlabs/php_codesniffer": "4.0.1", "symfony/cache": "^6.3.8|^7.0|^8.0", "symfony/console": "^5.4|^6.3|^7.0|^8.0" }, @@ -496,7 +496,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.4.1" + "source": "https://github.com/doctrine/dbal/tree/4.4.3" }, "funding": [ { @@ -512,33 +512,33 @@ "type": "tidelift" } ], - "time": "2025-12-04T10:11:03+00:00" + "time": "2026-03-20T08:52:12+00:00" }, { "name": "doctrine/deprecations", - "version": "1.1.5", + "version": "1.1.6", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" + "phpunit/phpunit": "<=7.5 || >=14" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^13", - "phpstan/phpstan": "1.4.10 || 2.1.11", + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", "psr/log": "^1 || ^2 || ^3" }, "suggest": { @@ -558,22 +558,22 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" }, - "time": "2025-04-07T20:06:18+00:00" + "time": "2026-02-07T07:09:04+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "3.2.2", + "version": "3.2.4", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "af84173db6978c3d2688ea3bcf3a91720b0704ce" + "reference": "75f1bf75d0ba099f23e7d43ebd804df5bec58c29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/af84173db6978c3d2688ea3bcf3a91720b0704ce", - "reference": "af84173db6978c3d2688ea3bcf3a91720b0704ce", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/75f1bf75d0ba099f23e7d43ebd804df5bec58c29", + "reference": "75f1bf75d0ba099f23e7d43ebd804df5bec58c29", "shasum": "" }, "require": { @@ -597,14 +597,15 @@ "require-dev": { "doctrine/coding-standard": "^14", "doctrine/orm": "^3.4.4", - "phpstan/phpstan": "2.1.1", + "phpstan/phpstan": "^2.1.13", "phpstan/phpstan-phpunit": "2.0.3", "phpstan/phpstan-strict-rules": "^2", - "phpstan/phpstan-symfony": "^2.0", + "phpstan/phpstan-symfony": "^2.0.9", "phpunit/phpunit": "^12.3.10", "psr/log": "^3.0", "symfony/doctrine-messenger": "^6.4 || ^7.0 || ^8.0", "symfony/expression-language": "^6.4 || ^7.0 || ^8.0", + "symfony/http-kernel": "^6.4 || ^7.0 || ^8.0", "symfony/messenger": "^6.4 || ^7.0 || ^8.0", "symfony/property-info": "^6.4 || ^7.0 || ^8.0", "symfony/security-bundle": "^6.4 || ^7.0 || ^8.0", @@ -659,7 +660,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/3.2.2" + "source": "https://github.com/doctrine/DoctrineBundle/tree/3.2.4" }, "funding": [ { @@ -675,7 +676,7 @@ "type": "tidelift" } ], - "time": "2025-12-24T12:24:29+00:00" + "time": "2026-06-09T19:11:55+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -1098,16 +1099,16 @@ }, { "name": "doctrine/migrations", - "version": "3.9.5", + "version": "3.9.7", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "1b823afbc40f932dae8272574faee53f2755eac5" + "reference": "96cb2a89b56c9efb0bac38e606dc0b0f13e650ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/1b823afbc40f932dae8272574faee53f2755eac5", - "reference": "1b823afbc40f932dae8272574faee53f2755eac5", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/96cb2a89b56c9efb0bac38e606dc0b0f13e650ec", + "reference": "96cb2a89b56c9efb0bac38e606dc0b0f13e650ec", "shasum": "" }, "require": { @@ -1181,7 +1182,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.9.5" + "source": "https://github.com/doctrine/migrations/tree/3.9.7" }, "funding": [ { @@ -1197,20 +1198,20 @@ "type": "tidelift" } ], - "time": "2025-11-20T11:15:36+00:00" + "time": "2026-04-23T19:33:20+00:00" }, { "name": "doctrine/orm", - "version": "3.6.2", + "version": "3.6.7", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "4262eb495b4d2a53b45de1ac58881e0091f2970f" + "reference": "bc217c0e19c3a9eadfa67697143b87c9ba01272c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/4262eb495b4d2a53b45de1ac58881e0091f2970f", - "reference": "4262eb495b4d2a53b45de1ac58881e0091f2970f", + "url": "https://api.github.com/repos/doctrine/orm/zipball/bc217c0e19c3a9eadfa67697143b87c9ba01272c", + "reference": "bc217c0e19c3a9eadfa67697143b87c9ba01272c", "shasum": "" }, "require": { @@ -1283,25 +1284,26 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.6.2" + "source": "https://github.com/doctrine/orm/tree/3.6.7" }, - "time": "2026-01-30T21:41:41+00:00" + "time": "2026-05-25T16:45:47+00:00" }, { "name": "doctrine/persistence", - "version": "4.1.1", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09" + "reference": "49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", - "reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b", + "reference": "49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b", "shasum": "" }, "require": { + "doctrine/deprecations": "^1", "doctrine/event-manager": "^1 || ^2", "php": "^8.1", "psr/cache": "^1.0 || ^2.0 || ^3.0" @@ -1312,13 +1314,13 @@ "phpstan/phpstan-phpunit": "^2", "phpstan/phpstan-strict-rules": "^2", "phpunit/phpunit": "^10.5.58 || ^12", - "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0", - "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0" + "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0 || ^8.0" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Persistence\\": "src/Persistence" + "Doctrine\\Persistence\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1362,7 +1364,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/4.1.1" + "source": "https://github.com/doctrine/persistence/tree/4.2.0" }, "funding": [ { @@ -1378,20 +1380,20 @@ "type": "tidelift" } ], - "time": "2025-10-16T20:13:18+00:00" + "time": "2026-04-26T12:12:52+00:00" }, { "name": "doctrine/sql-formatter", - "version": "1.5.3", + "version": "1.5.4", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "a8af23a8e9d622505baa2997465782cbe8bb7fc7" + "reference": "9563949f5cd3bd12a17d12fb980528bc141c5806" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/a8af23a8e9d622505baa2997465782cbe8bb7fc7", - "reference": "a8af23a8e9d622505baa2997465782cbe8bb7fc7", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/9563949f5cd3bd12a17d12fb980528bc141c5806", + "reference": "9563949f5cd3bd12a17d12fb980528bc141c5806", "shasum": "" }, "require": { @@ -1431,9 +1433,9 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.5.3" + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.4" }, - "time": "2025-10-26T09:35:14+00:00" + "time": "2026-02-08T16:21:46+00:00" }, { "name": "egulias/email-validator", @@ -1708,23 +1710,25 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.8.0", + "version": "2.12.5", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "21dc724a0583619cd1652f673303492272778051" + "reference": "9365d578a9fd1552ad6ca9c3cb530708526feb09" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", - "reference": "21dc724a0583619cd1652f673303492272778051", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/9365d578a9fd1552ad6ca9c3cb530708526feb09", + "reference": "9365d578a9fd1552ad6ca9c3cb530708526feb09", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" + "ralouphie/getallheaders": "^3.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/polyfill-php80": "^1.25" }, "provide": { "psr/http-factory-implementation": "1.0", @@ -1732,8 +1736,9 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.44 || ^9.6.25" + "http-interop/http-factory-tests": "1.1.0", + "jshttp/mime-db": "1.54.0.1", + "phpunit/phpunit": "^8.5.52 || ^9.6.34" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -1804,7 +1809,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.8.0" + "source": "https://github.com/guzzle/psr7/tree/2.12.5" }, "funding": [ { @@ -1820,7 +1825,7 @@ "type": "tidelift" } ], - "time": "2025-08-23T21:21:41+00:00" + "time": "2026-07-13T01:27:20+00:00" }, { "name": "jean85/pretty-package-versions", @@ -2025,34 +2030,34 @@ }, { "name": "lcobucci/clock", - "version": "3.5.0", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/lcobucci/clock.git", - "reference": "a3139d9e97d47826f27e6a17bb63f13621f86058" + "reference": "4cdd88f761e9be9095ccbedf3e08d61ae216c643" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/clock/zipball/a3139d9e97d47826f27e6a17bb63f13621f86058", - "reference": "a3139d9e97d47826f27e6a17bb63f13621f86058", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/4cdd88f761e9be9095ccbedf3e08d61ae216c643", + "reference": "4cdd88f761e9be9095ccbedf3e08d61ae216c643", "shasum": "" }, "require": { - "php": "~8.3.0 || ~8.4.0 || ~8.5.0", + "php": "~8.4.0 || ~8.5.0", "psr/clock": "^1.0" }, "provide": { "psr/clock-implementation": "1.0" }, "require-dev": { - "infection/infection": "^0.31", - "lcobucci/coding-standard": "^11.2.0", + "infection/infection": "^0.32", + "lcobucci/coding-standard": "^12.0", "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^2.0.0", - "phpstan/phpstan-deprecation-rules": "^2.0.0", - "phpstan/phpstan-phpunit": "^2.0.0", - "phpstan/phpstan-strict-rules": "^2.0.0", - "phpunit/phpunit": "^12.0.0" + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^13.0" }, "type": "library", "autoload": { @@ -2073,7 +2078,7 @@ "description": "Yet another clock abstraction", "support": { "issues": "https://github.com/lcobucci/clock/issues", - "source": "https://github.com/lcobucci/clock/tree/3.5.0" + "source": "https://github.com/lcobucci/clock/tree/3.6.0" }, "funding": [ { @@ -2085,7 +2090,7 @@ "type": "patreon" } ], - "time": "2025-10-27T09:03:17+00:00" + "time": "2026-04-13T21:30:16+00:00" }, { "name": "lcobucci/jwt", @@ -2318,16 +2323,16 @@ }, { "name": "nelmio/security-bundle", - "version": "v3.8.0", + "version": "v3.9.0", "source": { "type": "git", "url": "https://github.com/nelmio/NelmioSecurityBundle.git", - "reference": "2fafee1cdda1d5952554c44eef4c3c8566d56f40" + "reference": "86dd4d12bc729498cd6f52b95ab6b36a66c72fd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nelmio/NelmioSecurityBundle/zipball/2fafee1cdda1d5952554c44eef4c3c8566d56f40", - "reference": "2fafee1cdda1d5952554c44eef4c3c8566d56f40", + "url": "https://api.github.com/repos/nelmio/NelmioSecurityBundle/zipball/86dd4d12bc729498cd6f52b95ab6b36a66c72fd2", + "reference": "86dd4d12bc729498cd6f52b95ab6b36a66c72fd2", "shasum": "" }, "require": { @@ -2386,9 +2391,9 @@ ], "support": { "issues": "https://github.com/nelmio/NelmioSecurityBundle/issues", - "source": "https://github.com/nelmio/NelmioSecurityBundle/tree/v3.8.0" + "source": "https://github.com/nelmio/NelmioSecurityBundle/tree/v3.9.0" }, - "time": "2026-01-14T19:38:55+00:00" + "time": "2026-02-23T10:58:33+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -2863,7 +2868,7 @@ }, { "name": "scheb/2fa-backup-code", - "version": "v8.3.0", + "version": "v8.6.1", "source": { "type": "git", "url": "https://github.com/scheb/2fa-backup-code.git", @@ -2906,26 +2911,25 @@ "two-step" ], "support": { - "source": "https://github.com/scheb/2fa-backup-code/tree/v8.3.0" + "source": "https://github.com/scheb/2fa-backup-code/tree/v8.6.1" }, "time": "2026-01-24T13:26:10+00:00" }, { "name": "scheb/2fa-bundle", - "version": "v8.3.0", + "version": "v8.6.1", "source": { "type": "git", "url": "https://github.com/scheb/2fa-bundle.git", - "reference": "5d3349ed7fbaf9225896caf280ed4e69c9d69add" + "reference": "5427e46c4e3236af31ad25ba7deae63de197637f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scheb/2fa-bundle/zipball/5d3349ed7fbaf9225896caf280ed4e69c9d69add", - "reference": "5d3349ed7fbaf9225896caf280ed4e69c9d69add", + "url": "https://api.github.com/repos/scheb/2fa-bundle/zipball/5427e46c4e3236af31ad25ba7deae63de197637f", + "reference": "5427e46c4e3236af31ad25ba7deae63de197637f", "shasum": "" }, "require": { - "ext-json": "*", "php": "~8.4.0 || ~8.5.0", "symfony/config": "^7.4 || ^8.0", "symfony/dependency-injection": "^7.4 || ^8.0", @@ -2974,13 +2978,13 @@ "two-step" ], "support": { - "source": "https://github.com/scheb/2fa-bundle/tree/v8.3.0" + "source": "https://github.com/scheb/2fa-bundle/tree/v8.6.1" }, - "time": "2026-01-24T13:26:10+00:00" + "time": "2026-07-10T18:29:30+00:00" }, { "name": "scheb/2fa-totp", - "version": "v8.3.0", + "version": "v8.6.1", "source": { "type": "git", "url": "https://github.com/scheb/2fa-totp.git", @@ -3027,13 +3031,13 @@ "two-step" ], "support": { - "source": "https://github.com/scheb/2fa-totp/tree/v8.3.0" + "source": "https://github.com/scheb/2fa-totp/tree/v8.6.1" }, "time": "2026-01-24T13:27:55+00:00" }, { "name": "scheb/2fa-trusted-device", - "version": "v8.3.0", + "version": "v8.6.1", "source": { "type": "git", "url": "https://github.com/scheb/2fa-trusted-device.git", @@ -3078,22 +3082,22 @@ "two-step" ], "support": { - "source": "https://github.com/scheb/2fa-trusted-device/tree/v8.3.0" + "source": "https://github.com/scheb/2fa-trusted-device/tree/v8.6.1" }, "time": "2026-01-24T13:26:10+00:00" }, { "name": "sentry/sentry", - "version": "4.19.1", + "version": "4.29.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "1c21d60bebe67c0122335bd3fe977990435af0a3" + "reference": "d732a4da195f231cedb2a2a78ae16dd73082afa3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/1c21d60bebe67c0122335bd3fe977990435af0a3", - "reference": "1c21d60bebe67c0122335bd3fe977990435af0a3", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/d732a4da195f231cedb2a2a78ae16dd73082afa3", + "reference": "d732a4da195f231cedb2a2a78ae16dd73082afa3", "shasum": "" }, "require": { @@ -3110,16 +3114,22 @@ "raven/raven": "*" }, "require-dev": { + "carthage-software/mago": "1.30.0", "friendsofphp/php-cs-fixer": "^3.4", "guzzlehttp/promises": "^2.0.3", - "guzzlehttp/psr7": "^1.8.4|^2.1.1", "monolog/monolog": "^1.6|^2.0|^3.0", - "phpbench/phpbench": "^1.0", + "nyholm/psr7": "^1.8", + "open-telemetry/api": "^1.0", + "open-telemetry/exporter-otlp": "^1.0", + "open-telemetry/sdk": "^1.0", + "open-telemetry/sem-conv": "^1.27", "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^8.5|^9.6", - "vimeo/psalm": "^4.17" + "phpunit/phpunit": "^8.5.52|^9.6.34", + "spiral/roadrunner-http": "^3.6", + "spiral/roadrunner-worker": "^3.6" }, "suggest": { + "ext-excimer": "Enable Sentry profiling with the Excimer PHP extension.", "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." }, "type": "library", @@ -3156,7 +3166,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/4.19.1" + "source": "https://github.com/getsentry/sentry-php/tree/4.29.0" }, "funding": [ { @@ -3168,27 +3178,27 @@ "type": "custom" } ], - "time": "2025-12-02T15:57:41+00:00" + "time": "2026-06-29T14:47:44+00:00" }, { "name": "sentry/sentry-symfony", - "version": "5.8.3", + "version": "5.11.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-symfony.git", - "reference": "e82559a078b26c8f8592289e98a25b203527a9c6" + "reference": "7d72a006c2099ef932f41233df9d1e8effe480d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/e82559a078b26c8f8592289e98a25b203527a9c6", - "reference": "e82559a078b26c8f8592289e98a25b203527a9c6", + "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/7d72a006c2099ef932f41233df9d1e8effe480d7", + "reference": "7d72a006c2099ef932f41233df9d1e8effe480d7", "shasum": "" }, "require": { "guzzlehttp/psr7": "^2.1.1", "jean85/pretty-package-versions": "^1.5||^2.0", "php": "^7.2||^8.0", - "sentry/sentry": "^4.19.1", + "sentry/sentry": "^4.23.0", "symfony/cache-contracts": "^1.1||^2.4||^3.0", "symfony/config": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/console": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", @@ -3208,7 +3218,7 @@ "phpstan/phpstan": "1.12.5", "phpstan/phpstan-phpunit": "1.4.0", "phpstan/phpstan-symfony": "1.4.10", - "phpunit/phpunit": "^8.5.40||^9.6.21", + "phpunit/phpunit": "^8.5.52||^9.6.34", "symfony/browser-kit": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/cache": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/dom-crawler": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", @@ -3258,7 +3268,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-symfony/issues", - "source": "https://github.com/getsentry/sentry-symfony/tree/5.8.3" + "source": "https://github.com/getsentry/sentry-symfony/tree/5.11.0" }, "funding": [ { @@ -3270,20 +3280,20 @@ "type": "custom" } ], - "time": "2025-12-18T09:26:49+00:00" + "time": "2026-07-13T11:32:54+00:00" }, { "name": "spomky-labs/otphp", - "version": "11.4.2", + "version": "11.5.0", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/otphp.git", - "reference": "2a1b503fd1c1a5c751ab3c5cd37f2d2d26ab74ad" + "reference": "877683d6352b80cdc7020fd43a725629c2524435" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/2a1b503fd1c1a5c751ab3c5cd37f2d2d26ab74ad", - "reference": "2a1b503fd1c1a5c751ab3c5cd37f2d2d26ab74ad", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/877683d6352b80cdc7020fd43a725629c2524435", + "reference": "877683d6352b80cdc7020fd43a725629c2524435", "shasum": "" }, "require": { @@ -3328,7 +3338,7 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/otphp/issues", - "source": "https://github.com/Spomky-Labs/otphp/tree/11.4.2" + "source": "https://github.com/Spomky-Labs/otphp/tree/11.5.0" }, "funding": [ { @@ -3340,20 +3350,20 @@ "type": "patreon" } ], - "time": "2026-01-23T10:53:01+00:00" + "time": "2026-06-06T23:41:24+00:00" }, { "name": "sumocoders/framework-core-bundle", - "version": "v17.1.0", + "version": "v17.2.1", "source": { "type": "git", "url": "https://github.com/sumocoders/FrameworkCoreBundle.git", - "reference": "74e0d9c67a7f6a3c14b90876da61783f1470ad46" + "reference": "2baea647fa02674087424b2e8508318d35a79643" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sumocoders/FrameworkCoreBundle/zipball/74e0d9c67a7f6a3c14b90876da61783f1470ad46", - "reference": "74e0d9c67a7f6a3c14b90876da61783f1470ad46", + "url": "https://api.github.com/repos/sumocoders/FrameworkCoreBundle/zipball/2baea647fa02674087424b2e8508318d35a79643", + "reference": "2baea647fa02674087424b2e8508318d35a79643", "shasum": "" }, "require": { @@ -3371,7 +3381,7 @@ "symfony/security-bundle": "^8.0", "symfony/translation": "^8.0", "symfony/twig-bundle": "^8.0", - "symfony/ux-autocomplete": "^2.22", + "symfony/ux-autocomplete": "^3.0", "twig/cssinliner-extra": "^3.16", "twig/extra-bundle": "^3.16", "twig/inky-extra": "^3.16" @@ -3412,9 +3422,9 @@ ], "support": { "issues": "https://github.com/sumocoders/FrameworkCoreBundle/issues", - "source": "https://github.com/sumocoders/FrameworkCoreBundle/tree/v17.1.0" + "source": "https://github.com/sumocoders/FrameworkCoreBundle/tree/v17.2.1" }, - "time": "2026-02-03T12:36:44+00:00" + "time": "2026-05-27T12:59:00+00:00" }, { "name": "symfony/apache-pack", @@ -3444,20 +3454,20 @@ }, { "name": "symfony/asset", - "version": "v8.0.4", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "2401c7e9f223969f0979eeb884a09fa6f8d7e49b" + "reference": "4bd4d143b7e53f40d45877df52eb2b18282bdac4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/2401c7e9f223969f0979eeb884a09fa6f8d7e49b", - "reference": "2401c7e9f223969f0979eeb884a09fa6f8d7e49b", + "url": "https://api.github.com/repos/symfony/asset/zipball/4bd4d143b7e53f40d45877df52eb2b18282bdac4", + "reference": "4bd4d143b7e53f40d45877df52eb2b18282bdac4", "shasum": "" }, "require": { - "php": ">=8.4" + "php": ">=8.4.1" }, "require-dev": { "symfony/http-client": "^7.4|^8.0", @@ -3490,7 +3500,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v8.0.4" + "source": "https://github.com/symfony/asset/tree/v8.1.0" }, "funding": [ { @@ -3510,25 +3520,25 @@ "type": "tidelift" } ], - "time": "2026-01-13T13:06:50+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/asset-mapper", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/asset-mapper.git", - "reference": "14184221c21c2622e62f2c009a6cc25c5570e4ba" + "reference": "e98d2d03a7f6885b2a98c344178900c92b483f73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/14184221c21c2622e62f2c009a6cc25c5570e4ba", - "reference": "14184221c21c2622e62f2c009a6cc25c5570e4ba", + "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/e98d2d03a7f6885b2a98c344178900c92b483f73", + "reference": "e98d2d03a7f6885b2a98c344178900c92b483f73", "shasum": "" }, "require": { "composer/semver": "^3.0", - "php": ">=8.4", + "php": ">=8.4.1", "symfony/filesystem": "^7.4|^8.0", "symfony/http-client": "^7.4|^8.0" }, @@ -3571,7 +3581,7 @@ "description": "Maps directories of assets & makes them available in a public directory with versioned filenames.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset-mapper/tree/v8.0.4" + "source": "https://github.com/symfony/asset-mapper/tree/v8.1.1" }, "funding": [ { @@ -3591,32 +3601,31 @@ "type": "tidelift" } ], - "time": "2026-01-13T13:06:50+00:00" + "time": "2026-06-17T15:04:37+00:00" }, { "name": "symfony/cache", - "version": "v8.0.5", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "92e9960386c7e01f58198038c199d522959a843c" + "reference": "c14decc1b0755b1e8ab6babeef56e1880348e817" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/92e9960386c7e01f58198038c199d522959a843c", - "reference": "92e9960386c7e01f58198038c199d522959a843c", + "url": "https://api.github.com/repos/symfony/cache/zipball/c14decc1b0755b1e8ab6babeef56e1880348e817", + "reference": "c14decc1b0755b1e8ab6babeef56e1880348e817", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", "symfony/cache-contracts": "^3.6", "symfony/service-contracts": "^2.5|^3", - "symfony/var-exporter": "^7.4|^8.0" + "symfony/var-exporter": "^8.1" }, "conflict": { - "doctrine/dbal": "<4.3", "ext-redis": "<6.1", "ext-relay": "<0.12.1" }, @@ -3671,7 +3680,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v8.0.5" + "source": "https://github.com/symfony/cache/tree/v8.1.1" }, "funding": [ { @@ -3691,20 +3700,20 @@ "type": "tidelift" } ], - "time": "2026-01-27T16:18:07+00:00" + "time": "2026-06-17T15:04:37+00:00" }, { "name": "symfony/cache-contracts", - "version": "v3.6.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868" + "reference": "9789738bc19af1106dc54d6afba9a0b467516cf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/5d68a57d66910405e5c0b63d6f0af941e66fc868", - "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/9789738bc19af1106dc54d6afba9a0b467516cf2", + "reference": "9789738bc19af1106dc54d6afba9a0b467516cf2", "shasum": "" }, "require": { @@ -3718,7 +3727,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -3751,7 +3760,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/cache-contracts/tree/v3.7.1" }, "funding": [ { @@ -3762,29 +3771,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-03-13T15:25:07+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/clock", - "version": "v8.0.0", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f" + "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/832119f9b8dbc6c8e6f65f30c5969eca1e88764f", - "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f", + "url": "https://api.github.com/repos/symfony/clock/zipball/701ef4de9705d6c32292ebee5e8044094a09fbf6", + "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "psr/clock": "^1.0" }, "provide": { @@ -3824,7 +3837,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v8.0.0" + "source": "https://github.com/symfony/clock/tree/v8.1.0" }, "funding": [ { @@ -3844,24 +3857,24 @@ "type": "tidelift" } ], - "time": "2025-11-12T15:46:48+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/config", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "8f45af92f08f82902827a8b6f403aaf49d893539" + "reference": "c18ae45733f9a5006ba81a13047d08a93e0dea1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/8f45af92f08f82902827a8b6f403aaf49d893539", - "reference": "8f45af92f08f82902827a8b6f403aaf49d893539", + "url": "https://api.github.com/repos/symfony/config/zipball/c18ae45733f9a5006ba81a13047d08a93e0dea1c", + "reference": "c18ae45733f9a5006ba81a13047d08a93e0dea1c", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/deprecation-contracts": "^2.5|^3", "symfony/filesystem": "^7.4|^8.0", "symfony/polyfill-ctype": "^1.8" @@ -3902,7 +3915,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v8.0.4" + "source": "https://github.com/symfony/config/tree/v8.1.1" }, "funding": [ { @@ -3922,27 +3935,33 @@ "type": "tidelift" } ], - "time": "2026-01-13T13:06:50+00:00" + "time": "2026-06-09T10:54:51+00:00" }, { "name": "symfony/console", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "ace03c4cf9805080ff40cbeec69fca180c339a3b" + "reference": "b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/ace03c4cf9805080ff40cbeec69fca180c339a3b", - "reference": "ace03c4cf9805080ff40cbeec69fca180c339a3b", + "url": "https://api.github.com/repos/symfony/console/zipball/b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d", + "reference": "b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php85": "^1.32", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^7.4|^8.0" + "symfony/string": "^7.4.6|^8.0.6" + }, + "conflict": { + "symfony/dependency-injection": "<8.1", + "symfony/event-dispatcher": "<8.1" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" @@ -3950,14 +3969,18 @@ "require-dev": { "psr/log": "^1|^2|^3", "symfony/config": "^7.4|^8.0", - "symfony/dependency-injection": "^7.4|^8.0", - "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/dependency-injection": "^8.1", + "symfony/event-dispatcher": "^8.1", + "symfony/filesystem": "^7.4|^8.0", "symfony/http-foundation": "^7.4|^8.0", "symfony/http-kernel": "^7.4|^8.0", "symfony/lock": "^7.4|^8.0", "symfony/messenger": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", "symfony/process": "^7.4|^8.0", "symfony/stopwatch": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", "symfony/var-dumper": "^7.4|^8.0" }, "type": "library", @@ -3992,7 +4015,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v8.0.4" + "source": "https://github.com/symfony/console/tree/v8.1.1" }, "funding": [ { @@ -4012,24 +4035,24 @@ "type": "tidelift" } ], - "time": "2026-01-13T13:06:50+00:00" + "time": "2026-06-16T12:55:20+00:00" }, { "name": "symfony/css-selector", - "version": "v8.0.0", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "6225bd458c53ecdee056214cb4a2ffaf58bd592b" + "reference": "dc0e2be45c9b5588c82414f02ac574b4b986abcd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/6225bd458c53ecdee056214cb4a2ffaf58bd592b", - "reference": "6225bd458c53ecdee056214cb4a2ffaf58bd592b", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/dc0e2be45c9b5588c82414f02ac574b4b986abcd", + "reference": "dc0e2be45c9b5588c82414f02ac574b4b986abcd", "shasum": "" }, "require": { - "php": ">=8.4" + "php": ">=8.4.1" }, "type": "library", "autoload": { @@ -4061,7 +4084,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v8.0.0" + "source": "https://github.com/symfony/css-selector/tree/v8.1.0" }, "funding": [ { @@ -4081,26 +4104,26 @@ "type": "tidelift" } ], - "time": "2025-10-30T14:17:19+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/debug-bundle", - "version": "v8.0.0", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "02665efd40733372a4b4bdd78722426a6f95849b" + "reference": "2da1f202b38f646dbee032529cfd8e727cd12cd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/02665efd40733372a4b4bdd78722426a6f95849b", - "reference": "02665efd40733372a4b4bdd78722426a6f95849b", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/2da1f202b38f646dbee032529cfd8e727cd12cd1", + "reference": "2da1f202b38f646dbee032529cfd8e727cd12cd1", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=8.4", + "php": ">=8.4.1", "symfony/config": "^7.4|^8.0", "symfony/dependency-injection": "^7.4|^8.0", "symfony/http-kernel": "^7.4|^8.0", @@ -4136,7 +4159,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v8.0.0" + "source": "https://github.com/symfony/debug-bundle/tree/v8.1.0" }, "funding": [ { @@ -4156,28 +4179,28 @@ "type": "tidelift" } ], - "time": "2025-10-24T14:30:40+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/dependency-injection", - "version": "v8.0.5", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "40a6c455ade7e3bf25900d6b746d40cfa2573e26" + "reference": "99ced9d6305c43b25a7d48fe6a7d169df275a597" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/40a6c455ade7e3bf25900d6b746d40cfa2573e26", - "reference": "40a6c455ade7e3bf25900d6b746d40cfa2573e26", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/99ced9d6305c43b25a7d48fe6a7d169df275a597", + "reference": "99ced9d6305c43b25a7d48fe6a7d169df275a597", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^3.6", - "symfony/var-exporter": "^7.4|^8.0" + "symfony/var-exporter": "^8.1" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -4217,7 +4240,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v8.0.5" + "source": "https://github.com/symfony/dependency-injection/tree/v8.1.1" }, "funding": [ { @@ -4237,20 +4260,20 @@ "type": "tidelift" } ], - "time": "2026-01-27T16:18:07+00:00" + "time": "2026-06-27T06:18:14+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.6.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", "shasum": "" }, "require": { @@ -4263,7 +4286,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -4288,7 +4311,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" }, "funding": [ { @@ -4299,31 +4322,36 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "0d07589d03ed7db1833bfe943635872a2e8aebb2" + "reference": "883547207ff3b77c5cec9f4f16dd330ccd7b2849" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/0d07589d03ed7db1833bfe943635872a2e8aebb2", - "reference": "0d07589d03ed7db1833bfe943635872a2e8aebb2", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/883547207ff3b77c5cec9f4f16dd330ccd7b2849", + "reference": "883547207ff3b77c5cec9f4f16dd330ccd7b2849", "shasum": "" }, "require": { "doctrine/event-manager": "^2", "doctrine/persistence": "^3.1|^4", - "php": ">=8.4", + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.0", "symfony/service-contracts": "^2.5|^3" @@ -4343,6 +4371,7 @@ "psr/log": "^1|^2|^3", "symfony/cache": "^7.4|^8.0", "symfony/config": "^7.4|^8.0", + "symfony/console": "^8.1", "symfony/dependency-injection": "^7.4|^8.0", "symfony/doctrine-messenger": "^7.4|^8.0", "symfony/expression-language": "^7.4|^8.0", @@ -4386,7 +4415,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v8.0.4" + "source": "https://github.com/symfony/doctrine-bridge/tree/v8.1.1" }, "funding": [ { @@ -4406,26 +4435,28 @@ "type": "tidelift" } ], - "time": "2026-01-23T11:07:10+00:00" + "time": "2026-06-12T08:43:41+00:00" }, { "name": "symfony/doctrine-messenger", - "version": "v8.0.5", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "81d0b288e90d462896d1dffcff99571dd9d1618c" + "reference": "e2549bac9acd36eaab06299c297e4ef5f4933eb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/81d0b288e90d462896d1dffcff99571dd9d1618c", - "reference": "81d0b288e90d462896d1dffcff99571dd9d1618c", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/e2549bac9acd36eaab06299c297e4ef5f4933eb3", + "reference": "e2549bac9acd36eaab06299c297e4ef5f4933eb3", "shasum": "" }, "require": { "doctrine/dbal": "^4.3", - "php": ">=8.4", - "symfony/messenger": "^7.4|^8.0", + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/messenger": "^8.1", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -4462,7 +4493,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v8.0.5" + "source": "https://github.com/symfony/doctrine-messenger/tree/v8.1.1" }, "funding": [ { @@ -4482,24 +4513,24 @@ "type": "tidelift" } ], - "time": "2026-01-27T16:18:07+00:00" + "time": "2026-06-12T08:43:41+00:00" }, { "name": "symfony/dotenv", - "version": "v8.0.0", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "460b4067a85288c59a59ce8c1bfb3942e71fd85c" + "reference": "7ed4e3a11e3c98235c70ded047d7ddf9e6ae854c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/460b4067a85288c59a59ce8c1bfb3942e71fd85c", - "reference": "460b4067a85288c59a59ce8c1bfb3942e71fd85c", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/7ed4e3a11e3c98235c70ded047d7ddf9e6ae854c", + "reference": "7ed4e3a11e3c98235c70ded047d7ddf9e6ae854c", "shasum": "" }, "require": { - "php": ">=8.4" + "php": ">=8.4.1" }, "require-dev": { "symfony/console": "^7.4|^8.0", @@ -4536,7 +4567,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v8.0.0" + "source": "https://github.com/symfony/dotenv/tree/v8.1.0" }, "funding": [ { @@ -4556,24 +4587,24 @@ "type": "tidelift" } ], - "time": "2025-11-16T10:17:21+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/error-handler", - "version": "v8.0.4", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "7620b97ec0ab1d2d6c7fb737aa55da411bea776a" + "reference": "d8aeb1abd3fef84795567850d3a567bdb5945ee5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/7620b97ec0ab1d2d6c7fb737aa55da411bea776a", - "reference": "7620b97ec0ab1d2d6c7fb737aa55da411bea776a", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/d8aeb1abd3fef84795567850d3a567bdb5945ee5", + "reference": "d8aeb1abd3fef84795567850d3a567bdb5945ee5", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "psr/log": "^1|^2|^3", "symfony/polyfill-php85": "^1.32", "symfony/var-dumper": "^7.4|^8.0" @@ -4617,7 +4648,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v8.0.4" + "source": "https://github.com/symfony/error-handler/tree/v8.1.0" }, "funding": [ { @@ -4637,24 +4668,25 @@ "type": "tidelift" } ], - "time": "2026-01-23T11:07:10+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "99301401da182b6cfaa4700dbe9987bb75474b47" + "reference": "abd6c11dc468725d1627302ad10f6cd486e9e3d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/99301401da182b6cfaa4700dbe9987bb75474b47", - "reference": "99301401da182b6cfaa4700dbe9987bb75474b47", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/abd6c11dc468725d1627302ad10f6cd486e9e3d0", + "reference": "abd6c11dc468725d1627302ad10f6cd486e9e3d0", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { @@ -4702,7 +4734,7 @@ "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/v8.0.4" + "source": "https://github.com/symfony/event-dispatcher/tree/v8.1.1" }, "funding": [ { @@ -4722,20 +4754,20 @@ "type": "tidelift" } ], - "time": "2026-01-05T11:45:55+00:00" + "time": "2026-06-09T12:28:30+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.6.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c7de7a00ffb67842132da02ea92988a39ccd9f4e", + "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e", "shasum": "" }, "require": { @@ -4749,7 +4781,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -4782,7 +4814,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.1" }, "funding": [ { @@ -4793,29 +4825,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/expression-language", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "83989cfbcf2ba08a400be339a88468b05ddc21c9" + "reference": "13b74638d9c7c6854fcbb7e89a42a90fdca51f57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/83989cfbcf2ba08a400be339a88468b05ddc21c9", - "reference": "83989cfbcf2ba08a400be339a88468b05ddc21c9", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/13b74638d9c7c6854fcbb7e89a42a90fdca51f57", + "reference": "13b74638d9c7c6854fcbb7e89a42a90fdca51f57", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/cache": "^7.4|^8.0", "symfony/service-contracts": "^2.5|^3" }, @@ -4845,7 +4881,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v8.0.4" + "source": "https://github.com/symfony/expression-language/tree/v8.1.1" }, "funding": [ { @@ -4865,24 +4901,25 @@ "type": "tidelift" } ], - "time": "2026-01-05T09:27:50+00:00" + "time": "2026-06-09T10:54:51+00:00" }, { "name": "symfony/filesystem", - "version": "v8.0.1", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "d937d400b980523dc9ee946bb69972b5e619058d" + "reference": "99aec13b82b4967ec5088222c4a3ecca955949c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/d937d400b980523dc9ee946bb69972b5e619058d", - "reference": "d937d400b980523dc9ee946bb69972b5e619058d", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/99aec13b82b4967ec5088222c4a3ecca955949c2", + "reference": "99aec13b82b4967ec5088222c4a3ecca955949c2", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, @@ -4915,7 +4952,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v8.0.1" + "source": "https://github.com/symfony/filesystem/tree/v8.1.0" }, "funding": [ { @@ -4935,24 +4972,24 @@ "type": "tidelift" } ], - "time": "2025-12-01T09:13:36+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/finder", - "version": "v8.0.5", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "8bd576e97c67d45941365bf824e18dc8538e6eb0" + "reference": "e2989e762c70f9490fa3a00a0ac0fae5aa97a531" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/8bd576e97c67d45941365bf824e18dc8538e6eb0", - "reference": "8bd576e97c67d45941365bf824e18dc8538e6eb0", + "url": "https://api.github.com/repos/symfony/finder/zipball/e2989e762c70f9490fa3a00a0ac0fae5aa97a531", + "reference": "e2989e762c70f9490fa3a00a0ac0fae5aa97a531", "shasum": "" }, "require": { - "php": ">=8.4" + "php": ">=8.4.1" }, "require-dev": { "symfony/filesystem": "^7.4|^8.0" @@ -4983,7 +5020,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v8.0.5" + "source": "https://github.com/symfony/finder/tree/v8.1.1" }, "funding": [ { @@ -5003,20 +5040,20 @@ "type": "tidelift" } ], - "time": "2026-01-26T15:08:38+00:00" + "time": "2026-06-27T09:05:56+00:00" }, { "name": "symfony/flex", - "version": "v2.10.0", + "version": "v2.11.0", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "9cd384775973eabbf6e8b05784dda279fc67c28d" + "reference": "4a6d98eea3ebc7f68d82810cb682eedca2649e99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/9cd384775973eabbf6e8b05784dda279fc67c28d", - "reference": "9cd384775973eabbf6e8b05784dda279fc67c28d", + "url": "https://api.github.com/repos/symfony/flex/zipball/4a6d98eea3ebc7f68d82810cb682eedca2649e99", + "reference": "4a6d98eea3ebc7f68d82810cb682eedca2649e99", "shasum": "" }, "require": { @@ -5029,9 +5066,9 @@ }, "require-dev": { "composer/composer": "^2.1", - "symfony/dotenv": "^6.4|^7.4|^8.0", + "phpunit/phpunit": "^12.4", + "symfony/dotenv": "^6.4.41|^7.4.13|^8.0.13", "symfony/filesystem": "^6.4|^7.4|^8.0", - "symfony/phpunit-bridge": "^6.4|^7.4|^8.0", "symfony/process": "^6.4|^7.4|^8.0" }, "type": "composer-plugin", @@ -5056,7 +5093,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.10.0" + "source": "https://github.com/symfony/flex/tree/v2.11.0" }, "funding": [ { @@ -5076,31 +5113,33 @@ "type": "tidelift" } ], - "time": "2025-11-16T09:38:19+00:00" + "time": "2026-05-29T17:25:22+00:00" }, { "name": "symfony/form", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "c34ec2c2648e2dfedab3ce7e3c6c86f8d89c3092" + "reference": "041129e45f7f4e36436ae00042a13a91008e8d53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/c34ec2c2648e2dfedab3ce7e3c6c86f8d89c3092", - "reference": "c34ec2c2648e2dfedab3ce7e3c6c86f8d89c3092", + "url": "https://api.github.com/repos/symfony/form/zipball/041129e45f7f4e36436ae00042a13a91008e8d53", + "reference": "041129e45f7f4e36436ae00042a13a91008e8d53", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher": "^7.4|^8.0", "symfony/options-resolver": "^7.4|^8.0", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-intl-icu": "^1.21", "symfony/polyfill-mbstring": "^1.0", "symfony/property-access": "^7.4|^8.0", - "symfony/service-contracts": "^2.5|^3" + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^8.1" }, "conflict": { "symfony/intl": "<7.4", @@ -5151,7 +5190,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v8.0.4" + "source": "https://github.com/symfony/form/tree/v8.1.1" }, "funding": [ { @@ -5171,48 +5210,51 @@ "type": "tidelift" } ], - "time": "2026-01-23T11:07:10+00:00" + "time": "2026-06-16T16:07:17+00:00" }, { "name": "symfony/framework-bundle", - "version": "v8.0.5", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "e2f9469e7a802dd7c0d193792afc494d68177c54" + "reference": "a3ca5c9df0bb88c1378d230570746ef6271c812e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/e2f9469e7a802dd7c0d193792afc494d68177c54", - "reference": "e2f9469e7a802dd7c0d193792afc494d68177c54", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/a3ca5c9df0bb88c1378d230570746ef6271c812e", + "reference": "a3ca5c9df0bb88c1378d230570746ef6271c812e", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=8.4", + "php": ">=8.4.1", "symfony/cache": "^7.4|^8.0", "symfony/config": "^7.4.4|^8.0.4", - "symfony/dependency-injection": "^7.4.4|^8.0.4", + "symfony/dependency-injection": "^8.1", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^7.4|^8.0", - "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/event-dispatcher": "^8.1", "symfony/filesystem": "^7.4|^8.0", "symfony/finder": "^7.4|^8.0", "symfony/http-foundation": "^7.4|^8.0", - "symfony/http-kernel": "^7.4|^8.0", + "symfony/http-kernel": "^8.1", "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php85": "^1.32", - "symfony/routing": "^7.4|^8.0" + "symfony/polyfill-php85": "^1.33", + "symfony/routing": "^7.4|^8.0", + "symfony/service-contracts": "^3.7.1", + "symfony/var-exporter": "^8.1" }, "conflict": { "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/reflection-docblock": "<5.2|>=7", "phpdocumentor/type-resolver": "<1.5.1", - "symfony/console": "<7.4", + "symfony/console": "<8.1", "symfony/form": "<7.4", "symfony/json-streamer": "<7.4", - "symfony/messenger": "<7.4", + "symfony/messenger": "<7.4.10|>=8.0,<8.0.10", + "symfony/mime": "<7.4.9|>=8.0,<8.0.9", "symfony/security-csrf": "<7.4", "symfony/serializer": "<7.4", "symfony/translation": "<7.4", @@ -5222,14 +5264,14 @@ "require-dev": { "doctrine/persistence": "^1.3|^2|^3", "dragonmantank/cron-expression": "^3.1", - "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "phpstan/phpdoc-parser": "^1.0|^2.0", "seld/jsonlint": "^1.10", "symfony/asset": "^7.4|^8.0", "symfony/asset-mapper": "^7.4|^8.0", "symfony/browser-kit": "^7.4|^8.0", "symfony/clock": "^7.4|^8.0", - "symfony/console": "^7.4|^8.0", + "symfony/console": "^8.1", "symfony/css-selector": "^7.4|^8.0", "symfony/dom-crawler": "^7.4|^8.0", "symfony/dotenv": "^7.4|^8.0", @@ -5240,10 +5282,10 @@ "symfony/json-streamer": "^7.4|^8.0", "symfony/lock": "^7.4|^8.0", "symfony/mailer": "^7.4|^8.0", - "symfony/messenger": "^7.4|^8.0", - "symfony/mime": "^7.4|^8.0", + "symfony/messenger": "^7.4.10|^8.0.10", + "symfony/mime": "^7.4.9|^8.0.9", "symfony/notifier": "^7.4|^8.0", - "symfony/object-mapper": "^7.4|^8.0", + "symfony/object-mapper": "^7.4.9|^8.0.9", "symfony/polyfill-intl-icu": "^1.0", "symfony/process": "^7.4|^8.0", "symfony/property-info": "^7.4|^8.0", @@ -5291,7 +5333,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v8.0.5" + "source": "https://github.com/symfony/framework-bundle/tree/v8.1.1" }, "funding": [ { @@ -5311,26 +5353,27 @@ "type": "tidelift" } ], - "time": "2026-01-27T09:06:10+00:00" + "time": "2026-06-27T09:05:56+00:00" }, { "name": "symfony/http-client", - "version": "v8.0.5", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "f9fdd372473e66469c6d32a4ed12efcffdea38c4" + "reference": "d41e9778eed03c64b095532c6d414e92e3c520d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/f9fdd372473e66469c6d32a4ed12efcffdea38c4", - "reference": "f9fdd372473e66469c6d32a4ed12efcffdea38c4", + "url": "https://api.github.com/repos/symfony/http-client/zipball/d41e9778eed03c64b095532c6d414e92e3c520d9", + "reference": "d41e9778eed03c64b095532c6d414e92e3c520d9", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "psr/log": "^1|^2|^3", - "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/http-client-contracts": "^3.7", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -5346,7 +5389,7 @@ "require-dev": { "amphp/http-client": "^5.3.2", "amphp/http-tunnel": "^2.0", - "guzzlehttp/promises": "^1.4|^2.0", + "guzzlehttp/guzzle": "^7.10", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", @@ -5387,7 +5430,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v8.0.5" + "source": "https://github.com/symfony/http-client/tree/v8.1.1" }, "funding": [ { @@ -5407,20 +5450,20 @@ "type": "tidelift" } ], - "time": "2026-01-27T16:18:07+00:00" + "time": "2026-06-16T12:55:20+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.6.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "75d7043853a42837e68111812f4d964b01e5101c" + "reference": "41fc42d276aeff21192465331ebbab7d83a743c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", - "reference": "75d7043853a42837e68111812f4d964b01e5101c", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41fc42d276aeff21192465331ebbab7d83a743c0", + "reference": "41fc42d276aeff21192465331ebbab7d83a743c0", "shasum": "" }, "require": { @@ -5433,7 +5476,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -5469,7 +5512,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.7.1" }, "funding": [ { @@ -5480,29 +5523,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-29T11:18:49+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/http-foundation", - "version": "v8.0.5", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "e3422806e6f6760dbed0ddbc0a7fbfb6b5ce96bb" + "reference": "6a168c8fcee806b57ac020244da14293d1f9a883" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e3422806e6f6760dbed0ddbc0a7fbfb6b5ce96bb", - "reference": "e3422806e6f6760dbed0ddbc0a7fbfb6b5ce96bb", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6a168c8fcee806b57ac020244da14293d1f9a883", + "reference": "6a168c8fcee806b57ac020244da14293d1f9a883", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "^1.1" }, "conflict": { @@ -5545,7 +5593,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v8.0.5" + "source": "https://github.com/symfony/http-foundation/tree/v8.1.1" }, "funding": [ { @@ -5565,34 +5613,38 @@ "type": "tidelift" } ], - "time": "2026-01-27T16:18:07+00:00" + "time": "2026-06-12T08:43:41+00:00" }, { "name": "symfony/http-kernel", - "version": "v8.0.5", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "20c1c5e41fc53928dbb670088f544f2d460d497d" + "reference": "89d8d6e7fbab3d9eda89ccb5ecdf44a74c4ec9d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/20c1c5e41fc53928dbb670088f544f2d460d497d", - "reference": "20c1c5e41fc53928dbb670088f544f2d460d497d", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/89d8d6e7fbab3d9eda89ccb5ecdf44a74c4ec9d2", + "reference": "89d8d6e7fbab3d9eda89ccb5ecdf44a74c4ec9d2", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^7.4|^8.0", "symfony/event-dispatcher": "^7.4|^8.0", "symfony/http-foundation": "^7.4|^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { + "symfony/dependency-injection": "<8.1", "symfony/flex": "<2.10", "symfony/http-client-contracts": "<2.5", "symfony/translation-contracts": "<2.5", + "symfony/var-dumper": "<8.1", + "symfony/web-profiler-bundle": "<8.1", "twig/twig": "<3.21" }, "provide": { @@ -5605,13 +5657,14 @@ "symfony/config": "^7.4|^8.0", "symfony/console": "^7.4|^8.0", "symfony/css-selector": "^7.4|^8.0", - "symfony/dependency-injection": "^7.4|^8.0", + "symfony/dependency-injection": "^8.1", "symfony/dom-crawler": "^7.4|^8.0", "symfony/expression-language": "^7.4|^8.0", "symfony/finder": "^7.4|^8.0", "symfony/http-client-contracts": "^2.5|^3", "symfony/process": "^7.4|^8.0", "symfony/property-access": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.0", "symfony/routing": "^7.4|^8.0", "symfony/serializer": "^7.4|^8.0", "symfony/stopwatch": "^7.4|^8.0", @@ -5619,7 +5672,7 @@ "symfony/translation-contracts": "^2.5|^3", "symfony/uid": "^7.4|^8.0", "symfony/validator": "^7.4|^8.0", - "symfony/var-dumper": "^7.4|^8.0", + "symfony/var-dumper": "^8.1", "symfony/var-exporter": "^7.4|^8.0", "twig/twig": "^3.21" }, @@ -5649,7 +5702,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v8.0.5" + "source": "https://github.com/symfony/http-kernel/tree/v8.1.1" }, "funding": [ { @@ -5669,24 +5722,24 @@ "type": "tidelift" } ], - "time": "2026-01-28T10:46:31+00:00" + "time": "2026-06-27T09:27:36+00:00" }, { "name": "symfony/intl", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "8d049269c2accca0b02e5f9de39f3ee92ebc4468" + "reference": "e2883a541b3cf5a2daff70170a420155d97e65e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/8d049269c2accca0b02e5f9de39f3ee92ebc4468", - "reference": "8d049269c2accca0b02e5f9de39f3ee92ebc4468", + "url": "https://api.github.com/repos/symfony/intl/zipball/e2883a541b3cf5a2daff70170a420155d97e65e4", + "reference": "e2883a541b3cf5a2daff70170a420155d97e65e4", "shasum": "" }, "require": { - "php": ">=8.4" + "php": ">=8.4.1" }, "conflict": { "symfony/string": "<7.4" @@ -5738,7 +5791,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v8.0.4" + "source": "https://github.com/symfony/intl/tree/v8.1.1" }, "funding": [ { @@ -5758,25 +5811,25 @@ "type": "tidelift" } ], - "time": "2026-01-12T12:37:40+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/mailer", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "a074d353f5b5a81d356652e8a2034fdd0501420b" + "reference": "4fa583a7377f28d54e4de442fba76375b2e20a12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/a074d353f5b5a81d356652e8a2034fdd0501420b", - "reference": "a074d353f5b5a81d356652e8a2034fdd0501420b", + "url": "https://api.github.com/repos/symfony/mailer/zipball/4fa583a7377f28d54e4de442fba76375b2e20a12", + "reference": "4fa583a7377f28d54e4de442fba76375b2e20a12", "shasum": "" }, "require": { "egulias/email-validator": "^2.1.10|^3|^4", - "php": ">=8.4", + "php": ">=8.4.1", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", "symfony/event-dispatcher": "^7.4|^8.0", @@ -5818,7 +5871,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v8.0.4" + "source": "https://github.com/symfony/mailer/tree/v8.1.1" }, "funding": [ { @@ -5838,29 +5891,31 @@ "type": "tidelift" } ], - "time": "2026-01-08T08:40:07+00:00" + "time": "2026-06-16T12:55:20+00:00" }, { "name": "symfony/messenger", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "3483db96bcc33310cd1807d2b962e7e01d9f41c2" + "reference": "6518d975287e79d5a15392ac9184966f7418175a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/3483db96bcc33310cd1807d2b962e7e01d9f41c2", - "reference": "3483db96bcc33310cd1807d2b962e7e01d9f41c2", + "url": "https://api.github.com/repos/symfony/messenger/zipball/6518d975287e79d5a15392ac9184966f7418175a", + "reference": "6518d975287e79d5a15392ac9184966f7418175a", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "psr/log": "^1|^2|^3", - "symfony/clock": "^7.4|^8.0" + "symfony/clock": "^7.4|^8.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "symfony/console": "<7.4", + "symfony/dependency-injection": "<8.1", "symfony/event-dispatcher-contracts": "<2.5", "symfony/lock": "<7.4", "symfony/serializer": "<7.4.4|>=8.0,<8.0.4" @@ -5868,7 +5923,7 @@ "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", "symfony/console": "^7.4|^8.0", - "symfony/dependency-injection": "^7.4|^8.0", + "symfony/dependency-injection": "^8.1", "symfony/event-dispatcher": "^7.4|^8.0", "symfony/http-kernel": "^7.4|^8.0", "symfony/lock": "^7.4|^8.0", @@ -5908,7 +5963,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v8.0.4" + "source": "https://github.com/symfony/messenger/tree/v8.1.1" }, "funding": [ { @@ -5928,36 +5983,36 @@ "type": "tidelift" } ], - "time": "2026-01-08T22:36:47+00:00" + "time": "2026-06-16T19:38:37+00:00" }, { "name": "symfony/mime", - "version": "v8.0.5", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "543d01b6ee4b8eb80ce9349186ad530eb8704252" + "reference": "b164ae7e3f7915aacfe9ee155f2f358502440664" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/543d01b6ee4b8eb80ce9349186ad530eb8704252", - "reference": "543d01b6ee4b8eb80ce9349186ad530eb8704252", + "url": "https://api.github.com/repos/symfony/mime/zipball/b164ae7e3f7915aacfe9ee155f2f358502440664", + "reference": "b164ae7e3f7915aacfe9ee155f2f358502440664", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, "conflict": { "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/reflection-docblock": "<5.2|>=7", "phpdocumentor/type-resolver": "<1.5.1" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "symfony/dependency-injection": "^7.4|^8.0", "symfony/process": "^7.4|^8.0", "symfony/property-access": "^7.4|^8.0", @@ -5994,7 +6049,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v8.0.5" + "source": "https://github.com/symfony/mime/tree/v8.1.0" }, "funding": [ { @@ -6014,25 +6069,25 @@ "type": "tidelift" } ], - "time": "2026-01-27T09:06:10+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v8.0.4", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "7c3da570ec252d5ca1212945ddbbf1dac4a0d779" + "reference": "38563fac41ede8521e5e3dc139a4f2b097471c8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/7c3da570ec252d5ca1212945ddbbf1dac4a0d779", - "reference": "7c3da570ec252d5ca1212945ddbbf1dac4a0d779", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/38563fac41ede8521e5e3dc139a4f2b097471c8c", + "reference": "38563fac41ede8521e5e3dc139a4f2b097471c8c", "shasum": "" }, "require": { "monolog/monolog": "^3", - "php": ">=8.4", + "php": ">=8.4.1", "symfony/http-kernel": "^7.4|^8.0", "symfony/service-contracts": "^2.5|^3" }, @@ -6071,7 +6126,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v8.0.4" + "source": "https://github.com/symfony/monolog-bridge/tree/v8.1.0" }, "funding": [ { @@ -6091,20 +6146,20 @@ "type": "tidelift" } ], - "time": "2026-01-07T12:23:22+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/monolog-bundle", - "version": "v4.0.1", + "version": "v4.0.2", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "3b4ee2717ee56c5e1edb516140a175eb2a72bc66" + "reference": "c012c6aba13129eb02aa7dd61e66e720911d8598" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/3b4ee2717ee56c5e1edb516140a175eb2a72bc66", - "reference": "3b4ee2717ee56c5e1edb516140a175eb2a72bc66", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/c012c6aba13129eb02aa7dd61e66e720911d8598", + "reference": "c012c6aba13129eb02aa7dd61e66e720911d8598", "shasum": "" }, "require": { @@ -6150,7 +6205,7 @@ ], "support": { "issues": "https://github.com/symfony/monolog-bundle/issues", - "source": "https://github.com/symfony/monolog-bundle/tree/v4.0.1" + "source": "https://github.com/symfony/monolog-bundle/tree/v4.0.2" }, "funding": [ { @@ -6170,24 +6225,24 @@ "type": "tidelift" } ], - "time": "2025-12-08T08:00:13+00:00" + "time": "2026-04-02T18:27:21+00:00" }, { "name": "symfony/options-resolver", - "version": "v8.0.0", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "d2b592535ffa6600c265a3893a7f7fd2bad82dd7" + "reference": "88f9c561f678a02d54b897014049fa839e33ff82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/d2b592535ffa6600c265a3893a7f7fd2bad82dd7", - "reference": "d2b592535ffa6600c265a3893a7f7fd2bad82dd7", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/88f9c561f678a02d54b897014049fa839e33ff82", + "reference": "88f9c561f678a02d54b897014049fa839e33ff82", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", @@ -6221,7 +6276,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v8.0.0" + "source": "https://github.com/symfony/options-resolver/tree/v8.1.0" }, "funding": [ { @@ -6241,24 +6296,24 @@ "type": "tidelift" } ], - "time": "2025-11-12T15:55:31+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/password-hasher", - "version": "v8.0.4", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "ca6af4e20357d58d50c818d676cf2e2dd5e53b02" + "reference": "6934d16beaa4677f2c4584229fff1b51099dd7af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/ca6af4e20357d58d50c818d676cf2e2dd5e53b02", - "reference": "ca6af4e20357d58d50c818d676cf2e2dd5e53b02", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/6934d16beaa4677f2c4584229fff1b51099dd7af", + "reference": "6934d16beaa4677f2c4584229fff1b51099dd7af", "shasum": "" }, "require": { - "php": ">=8.4" + "php": ">=8.4.1" }, "require-dev": { "symfony/console": "^7.4|^8.0", @@ -6294,7 +6349,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v8.0.4" + "source": "https://github.com/symfony/password-hasher/tree/v8.1.0" }, "funding": [ { @@ -6314,20 +6369,20 @@ "type": "tidelift" } ], - "time": "2026-01-01T23:07:29+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { @@ -6377,7 +6432,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { @@ -6397,20 +6452,107 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-deepclone", + "version": "v1.40.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-deepclone.git", + "reference": "dca4ccba5f360070b574414dce4c1e7a559844fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-deepclone/zipball/dca4ccba5f360070b574414dce4c1e7a559844fa", + "reference": "dca4ccba5f360070b574414dce4c1e7a559844fa", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "provide": { + "ext-deepclone": "*" + }, + "suggest": { + "ext-deepclone": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\DeepClone\\": "" + }, + "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 the deepclone extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "deepclone", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-deepclone/tree/v1.40.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-12T07:27:17+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "reference": "e9247d281d694a5120554d9afaf54e070e88a603" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603", + "reference": "e9247d281d694a5120554d9afaf54e070e88a603", "shasum": "" }, "require": { @@ -6459,7 +6601,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1" }, "funding": [ { @@ -6479,20 +6621,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2026-05-26T05:58:03+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.33.0", + "version": "v1.38.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c" + "reference": "445c90e341fccda10311019cf82ff73bb7343945" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", - "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/445c90e341fccda10311019cf82ff73bb7343945", + "reference": "445c90e341fccda10311019cf82ff73bb7343945", "shasum": "" }, "require": { @@ -6547,7 +6689,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.38.0" }, "funding": [ { @@ -6567,20 +6709,20 @@ "type": "tidelift" } ], - "time": "2025-06-20T22:24:30+00:00" + "time": "2026-05-25T11:52:53+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + "reference": "dc21118016c039a66235cf93d96b435ffb282412" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/dc21118016c039a66235cf93d96b435ffb282412", + "reference": "dc21118016c039a66235cf93d96b435ffb282412", "shasum": "" }, "require": { @@ -6634,7 +6776,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.38.1" }, "funding": [ { @@ -6654,20 +6796,20 @@ "type": "tidelift" } ], - "time": "2024-09-10T14:38:51+00:00" + "time": "2026-05-25T15:22:23+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "version": "v1.38.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", "shasum": "" }, "require": { @@ -6719,7 +6861,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0" }, "funding": [ { @@ -6739,20 +6881,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-05-25T13:48:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "version": "v1.38.2", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", "shasum": "" }, "require": { @@ -6804,7 +6946,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" }, "funding": [ { @@ -6824,20 +6966,20 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2026-05-27T06:59:30+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", "shasum": "" }, "require": { @@ -6888,7 +7030,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" }, "funding": [ { @@ -6908,20 +7050,20 @@ "type": "tidelift" } ], - "time": "2025-01-02T08:10:11+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-php84", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", "shasum": "" }, "require": { @@ -6968,7 +7110,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" }, "funding": [ { @@ -6988,20 +7130,20 @@ "type": "tidelift" } ], - "time": "2025-06-24T13:30:11+00:00" + "time": "2026-05-26T12:51:13+00:00" }, { "name": "symfony/polyfill-php85", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", + "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", "shasum": "" }, "require": { @@ -7048,7 +7190,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.38.1" }, "funding": [ { @@ -7068,24 +7210,24 @@ "type": "tidelift" } ], - "time": "2025-06-23T16:12:55+00:00" + "time": "2026-05-26T02:25:22+00:00" }, { "name": "symfony/process", - "version": "v8.0.5", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674" + "reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674", - "reference": "b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674", + "url": "https://api.github.com/repos/symfony/process/zipball/c4a9e58f235a6bf7f97ffbfedae2687353ac79e5", + "reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5", "shasum": "" }, "require": { - "php": ">=8.4" + "php": ">=8.4.1" }, "type": "library", "autoload": { @@ -7113,7 +7255,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v8.0.5" + "source": "https://github.com/symfony/process/tree/v8.1.0" }, "funding": [ { @@ -7133,24 +7275,24 @@ "type": "tidelift" } ], - "time": "2026-01-26T15:08:38+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/property-access", - "version": "v8.0.4", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "a35a5ec85b605d0d1a9fd802cb44d87682c746fd" + "reference": "9261ef060f26cc7b728f67f141ba19b98a6209a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/a35a5ec85b605d0d1a9fd802cb44d87682c746fd", - "reference": "a35a5ec85b605d0d1a9fd802cb44d87682c746fd", + "url": "https://api.github.com/repos/symfony/property-access/zipball/9261ef060f26cc7b728f67f141ba19b98a6209a9", + "reference": "9261ef060f26cc7b728f67f141ba19b98a6209a9", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/property-info": "^7.4.4|^8.0.4" }, "require-dev": { @@ -7194,7 +7336,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v8.0.4" + "source": "https://github.com/symfony/property-access/tree/v8.1.0" }, "funding": [ { @@ -7214,33 +7356,33 @@ "type": "tidelift" } ], - "time": "2026-01-05T09:27:50+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/property-info", - "version": "v8.0.5", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "9d987224b54758240e80a062c5e414431bbf84de" + "reference": "4721e8c56d0cd2378e0ef9a9899f810008b859f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/9d987224b54758240e80a062c5e414431bbf84de", - "reference": "9d987224b54758240e80a062c5e414431bbf84de", + "url": "https://api.github.com/repos/symfony/property-info/zipball/4721e8c56d0cd2378e0ef9a9899f810008b859f7", + "reference": "4721e8c56d0cd2378e0ef9a9899f810008b859f7", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/string": "^7.4|^8.0", - "symfony/type-info": "^7.4.4|^8.0.4" + "symfony/type-info": "^7.4.7|^8.0.7" }, "conflict": { - "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/reflection-docblock": "<5.2|>=7", "phpdocumentor/type-resolver": "<1.5.1" }, "require-dev": { - "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "phpstan/phpdoc-parser": "^1.0|^2.0", "symfony/cache": "^7.4|^8.0", "symfony/dependency-injection": "^7.4|^8.0", @@ -7280,7 +7422,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v8.0.5" + "source": "https://github.com/symfony/property-info/tree/v8.1.0" }, "funding": [ { @@ -7300,24 +7442,24 @@ "type": "tidelift" } ], - "time": "2026-01-27T16:18:07+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v8.0.4", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "d6edf266746dd0b8e81e754a79da77b08dc00531" + "reference": "67fd34de15ded1763aa1e330fe345f080a94022c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/d6edf266746dd0b8e81e754a79da77b08dc00531", - "reference": "d6edf266746dd0b8e81e754a79da77b08dc00531", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/67fd34de15ded1763aa1e330fe345f080a94022c", + "reference": "67fd34de15ded1763aa1e330fe345f080a94022c", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "psr/http-message": "^1.0|^2.0", "symfony/http-foundation": "^7.4|^8.0" }, @@ -7367,7 +7509,7 @@ "psr-7" ], "support": { - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v8.0.4" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v8.1.0" }, "funding": [ { @@ -7387,24 +7529,24 @@ "type": "tidelift" } ], - "time": "2026-01-03T23:40:55+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/rate-limiter", - "version": "v8.0.5", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "7ae921420913ea0d6e4763e229b839b1d9a99288" + "reference": "dd8f48286c000b8511b9413105f4118c8c2a4bd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/7ae921420913ea0d6e4763e229b839b1d9a99288", - "reference": "7ae921420913ea0d6e4763e229b839b1d9a99288", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/dd8f48286c000b8511b9413105f4118c8c2a4bd6", + "reference": "dd8f48286c000b8511b9413105f4118c8c2a4bd6", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/options-resolver": "^7.4|^8.0" }, "require-dev": { @@ -7441,7 +7583,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v8.0.5" + "source": "https://github.com/symfony/rate-limiter/tree/v8.1.1" }, "funding": [ { @@ -7461,24 +7603,24 @@ "type": "tidelift" } ], - "time": "2026-01-27T16:18:07+00:00" + "time": "2026-06-09T11:06:24+00:00" }, { "name": "symfony/routing", - "version": "v8.0.4", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "4a2bc08d1c35307239329f434d45c2bfe8241fa9" + "reference": "fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/4a2bc08d1c35307239329f434d45c2bfe8241fa9", - "reference": "4a2bc08d1c35307239329f434d45c2bfe8241fa9", + "url": "https://api.github.com/repos/symfony/routing/zipball/fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3", + "reference": "fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { @@ -7521,7 +7663,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v8.0.4" + "source": "https://github.com/symfony/routing/tree/v8.1.0" }, "funding": [ { @@ -7541,25 +7683,25 @@ "type": "tidelift" } ], - "time": "2026-01-12T12:37:40+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/runtime", - "version": "v8.0.1", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "73b34037b23db051048ba2873031ddb89be9f19d" + "reference": "b7ea1abe04561e814b3134db0f56c287cedb35cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/73b34037b23db051048ba2873031ddb89be9f19d", - "reference": "73b34037b23db051048ba2873031ddb89be9f19d", + "url": "https://api.github.com/repos/symfony/runtime/zipball/b7ea1abe04561e814b3134db0f56c287cedb35cc", + "reference": "b7ea1abe04561e814b3134db0f56c287cedb35cc", "shasum": "" }, "require": { "composer-plugin-api": "^1.0|^2.0", - "php": ">=8.4" + "php": ">=8.4.1" }, "conflict": { "symfony/error-handler": "<7.4" @@ -7567,6 +7709,7 @@ "require-dev": { "composer/composer": "^2.6", "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", "symfony/dotenv": "^7.4|^8.0", "symfony/http-foundation": "^7.4|^8.0", "symfony/http-kernel": "^7.4|^8.0" @@ -7604,7 +7747,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v8.0.1" + "source": "https://github.com/symfony/runtime/tree/v8.1.0" }, "funding": [ { @@ -7624,26 +7767,26 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:08:45+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/security-bundle", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "c170650a00ba724be3455852747af600a2f042b4" + "reference": "838e7c4735f20db962f41692e02240a9189f8643" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/c170650a00ba724be3455852747af600a2f042b4", - "reference": "c170650a00ba724be3455852747af600a2f042b4", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/838e7c4735f20db962f41692e02240a9189f8643", + "reference": "838e7c4735f20db962f41692e02240a9189f8643", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=8.4", + "php": ">=8.4.1", "symfony/clock": "^7.4|^8.0", "symfony/config": "^7.4|^8.0", "symfony/dependency-injection": "^7.4|^8.0", @@ -7653,7 +7796,7 @@ "symfony/password-hasher": "^7.4|^8.0", "symfony/security-core": "^7.4|^8.0", "symfony/security-csrf": "^7.4|^8.0", - "symfony/security-http": "^7.4|^8.0", + "symfony/security-http": "^8.1", "symfony/service-contracts": "^2.5|^3" }, "require-dev": { @@ -7668,6 +7811,7 @@ "symfony/http-client": "^7.4|^8.0", "symfony/ldap": "^7.4|^8.0", "symfony/process": "^7.4|^8.0", + "symfony/property-info": "^7.4|^8.0", "symfony/rate-limiter": "^7.4|^8.0", "symfony/runtime": "^7.4|^8.0", "symfony/serializer": "^7.4|^8.0", @@ -7704,7 +7848,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v8.0.4" + "source": "https://github.com/symfony/security-bundle/tree/v8.1.1" }, "funding": [ { @@ -7724,24 +7868,24 @@ "type": "tidelift" } ], - "time": "2026-01-10T13:58:55+00:00" + "time": "2026-06-16T16:07:17+00:00" }, { "name": "symfony/security-core", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "c62565de41a136535ffa79a4db0373a7173b4d02" + "reference": "2350e2f04858a7d50e758852512f9f5c3091a37b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/c62565de41a136535ffa79a4db0373a7173b4d02", - "reference": "c62565de41a136535ffa79a4db0373a7173b4d02", + "url": "https://api.github.com/repos/symfony/security-core/zipball/2350e2f04858a7d50e758852512f9f5c3091a37b", + "reference": "2350e2f04858a7d50e758852512f9f5c3091a37b", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/event-dispatcher-contracts": "^2.5|^3", "symfony/password-hasher": "^7.4|^8.0", "symfony/service-contracts": "^2.5|^3" @@ -7756,6 +7900,7 @@ "symfony/expression-language": "^7.4|^8.0", "symfony/http-foundation": "^7.4|^8.0", "symfony/ldap": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", "symfony/string": "^7.4|^8.0", "symfony/translation": "^7.4|^8.0", "symfony/validator": "^7.4|^8.0" @@ -7786,7 +7931,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v8.0.4" + "source": "https://github.com/symfony/security-core/tree/v8.1.1" }, "funding": [ { @@ -7806,24 +7951,25 @@ "type": "tidelift" } ], - "time": "2026-01-23T11:07:10+00:00" + "time": "2026-06-09T10:54:51+00:00" }, { "name": "symfony/security-csrf", - "version": "v8.0.4", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "8be8bc615044c5911e6d15a5b0a80132068170c5" + "reference": "c865a8ee0d30b14545d7e5349b8e443f4fa9dc3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/8be8bc615044c5911e6d15a5b0a80132068170c5", - "reference": "8be8bc615044c5911e6d15a5b0a80132068170c5", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/c865a8ee0d30b14545d7e5349b8e443f4fa9dc3f", + "reference": "c865a8ee0d30b14545d7e5349b8e443f4fa9dc3f", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/security-core": "^7.4|^8.0" }, "require-dev": { @@ -7857,7 +8003,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v8.0.4" + "source": "https://github.com/symfony/security-csrf/tree/v8.1.0" }, "funding": [ { @@ -7877,26 +8023,27 @@ "type": "tidelift" } ], - "time": "2026-01-23T11:07:10+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/security-http", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "02f37c050db6e997052916194086d1a0a8790b8f" + "reference": "93f5e8bd49489256e469384e5e408257e8dc3e25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/02f37c050db6e997052916194086d1a0a8790b8f", - "reference": "02f37c050db6e997052916194086d1a0a8790b8f", + "url": "https://api.github.com/repos/symfony/security-http/zipball/93f5e8bd49489256e469384e5e408257e8dc3e25", + "reference": "93f5e8bd49489256e469384e5e408257e8dc3e25", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-foundation": "^7.4|^8.0", - "symfony/http-kernel": "^7.4|^8.0", + "symfony/http-kernel": "^8.1", "symfony/polyfill-mbstring": "^1.0", "symfony/property-access": "^7.4|^8.0", "symfony/security-core": "^7.4|^8.0", @@ -7944,7 +8091,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v8.0.4" + "source": "https://github.com/symfony/security-http/tree/v8.1.1" }, "funding": [ { @@ -7964,20 +8111,20 @@ "type": "tidelift" } ], - "time": "2026-01-23T11:07:10+00:00" + "time": "2026-06-27T06:18:14+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.6.1", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/c0a284bab1ed8aa0417e3d69250ab437739563a0", + "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0", "shasum": "" }, "require": { @@ -7995,7 +8142,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -8031,7 +8178,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.1" }, "funding": [ { @@ -8051,20 +8198,20 @@ "type": "tidelift" } ], - "time": "2025-07-15T11:30:57+00:00" + "time": "2026-06-16T09:55:08+00:00" }, { "name": "symfony/stimulus-bundle", - "version": "v2.32.0", + "version": "v2.36.0", "source": { "type": "git", "url": "https://github.com/symfony/stimulus-bundle.git", - "reference": "dfbf6b443bb381cb611e06f64dc23603b614b575" + "reference": "377a3d1ec5834631a7db53bd275276ff3c5b49df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/dfbf6b443bb381cb611e06f64dc23603b614b575", - "reference": "dfbf6b443bb381cb611e06f64dc23603b614b575", + "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/377a3d1ec5834631a7db53bd275276ff3c5b49df", + "reference": "377a3d1ec5834631a7db53bd275276ff3c5b49df", "shasum": "" }, "require": { @@ -8104,7 +8251,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/stimulus-bundle/tree/v2.32.0" + "source": "https://github.com/symfony/stimulus-bundle/tree/v2.36.0" }, "funding": [ { @@ -8124,24 +8271,24 @@ "type": "tidelift" } ], - "time": "2025-12-02T07:12:06+00:00" + "time": "2026-05-06T04:31:36+00:00" }, { "name": "symfony/stopwatch", - "version": "v8.0.0", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "67df1914c6ccd2d7b52f70d40cf2aea02159d942" + "reference": "21c07b026905d596e8379caeb115d87aa479499d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/67df1914c6ccd2d7b52f70d40cf2aea02159d942", - "reference": "67df1914c6ccd2d7b52f70d40cf2aea02159d942", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/21c07b026905d596e8379caeb115d87aa479499d", + "reference": "21c07b026905d596e8379caeb115d87aa479499d", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/service-contracts": "^2.5|^3" }, "type": "library", @@ -8170,7 +8317,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v8.0.0" + "source": "https://github.com/symfony/stopwatch/tree/v8.1.0" }, "funding": [ { @@ -8190,24 +8337,24 @@ "type": "tidelift" } ], - "time": "2025-08-04T07:36:47+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/string", - "version": "v8.0.4", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "758b372d6882506821ed666032e43020c4f57194" + "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/758b372d6882506821ed666032e43020c4f57194", - "reference": "758b372d6882506821ed666032e43020c4f57194", + "url": "https://api.github.com/repos/symfony/string/zipball/afd5944f4005862d961efb85c8bbd5c523c4e3c9", + "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-intl-grapheme": "^1.33", "symfony/polyfill-intl-normalizer": "^1.0", @@ -8260,7 +8407,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.0.4" + "source": "https://github.com/symfony/string/tree/v8.1.0" }, "funding": [ { @@ -8280,24 +8427,24 @@ "type": "tidelift" } ], - "time": "2026-01-12T12:37:40+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/translation", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "db70c8ce7db74fd2da7b1d268db46b2a8ce32c10" + "reference": "342b4218630dc2cf284cedcb2080c80b13404014" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/db70c8ce7db74fd2da7b1d268db46b2a8ce32c10", - "reference": "db70c8ce7db74fd2da7b1d268db46b2a8ce32c10", + "url": "https://api.github.com/repos/symfony/translation/zipball/342b4218630dc2cf284cedcb2080c80b13404014", + "reference": "342b4218630dc2cf284cedcb2080c80b13404014", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/polyfill-mbstring": "^1.0", "symfony/translation-contracts": "^3.6.1" }, @@ -8353,7 +8500,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v8.0.4" + "source": "https://github.com/symfony/translation/tree/v8.1.1" }, "funding": [ { @@ -8373,20 +8520,20 @@ "type": "tidelift" } ], - "time": "2026-01-13T13:06:50+00:00" + "time": "2026-06-06T11:11:44+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.6.1", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "65a8bc82080447fae78373aa10f8d13b38338977" + "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", - "reference": "65a8bc82080447fae78373aa10f8d13b38338977", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/ccb206b98faccc511ebae8e5fad50f2dc0b30621", + "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621", "shasum": "" }, "require": { @@ -8399,7 +8546,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -8435,7 +8582,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.7.1" }, "funding": [ { @@ -8455,36 +8602,37 @@ "type": "tidelift" } ], - "time": "2025-07-15T13:41:35+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/twig-bridge", - "version": "v8.0.5", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "3e60c35cb47b1077524c066ec277eaf92cdc2393" + "reference": "471e3b9537f514664ab8595668cd34c65cfa5d93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/3e60c35cb47b1077524c066ec277eaf92cdc2393", - "reference": "3e60c35cb47b1077524c066ec277eaf92cdc2393", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/471e3b9537f514664ab8595668cd34c65cfa5d93", + "reference": "471e3b9537f514664ab8595668cd34c65cfa5d93", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/translation-contracts": "^2.5|^3", - "twig/twig": "^3.21" + "twig/twig": "^3.25" }, "conflict": { - "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/reflection-docblock": "<5.2|>=7", "phpdocumentor/type-resolver": "<1.5.1", - "symfony/form": "<7.4.4|>8.0,<8.0.4" + "symfony/form": "<7.4.4|>8.0,<8.0.4", + "symfony/mime": "<7.4.9|>8.0,<8.0.9" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3|^4", "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "symfony/asset": "^7.4|^8.0", "symfony/asset-mapper": "^7.4|^8.0", "symfony/console": "^7.4|^8.0", @@ -8497,7 +8645,7 @@ "symfony/http-foundation": "^7.4|^8.0", "symfony/http-kernel": "^7.4|^8.0", "symfony/intl": "^7.4|^8.0", - "symfony/mime": "^7.4|^8.0", + "symfony/mime": "^7.4.9|^8.0.9", "symfony/polyfill-intl-icu": "^1.0", "symfony/property-info": "^7.4|^8.0", "symfony/routing": "^7.4|^8.0", @@ -8542,7 +8690,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v8.0.5" + "source": "https://github.com/symfony/twig-bridge/tree/v8.1.1" }, "funding": [ { @@ -8562,25 +8710,25 @@ "type": "tidelift" } ], - "time": "2026-01-27T09:06:10+00:00" + "time": "2026-06-17T15:04:37+00:00" }, { "name": "symfony/twig-bundle", - "version": "v8.0.4", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "5a68f2e0e06996514bf04900c3982b93b42487af" + "reference": "b7f4a471a07b8b52174d153e4db12f46954192ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/5a68f2e0e06996514bf04900c3982b93b42487af", - "reference": "5a68f2e0e06996514bf04900c3982b93b42487af", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/b7f4a471a07b8b52174d153e4db12f46954192ed", + "reference": "b7f4a471a07b8b52174d153e4db12f46954192ed", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", - "php": ">=8.4", + "php": ">=8.4.1", "symfony/config": "^7.4|^8.0", "symfony/dependency-injection": "^7.4|^8.0", "symfony/http-foundation": "^7.4|^8.0", @@ -8626,7 +8774,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v8.0.4" + "source": "https://github.com/symfony/twig-bundle/tree/v8.1.0" }, "funding": [ { @@ -8646,24 +8794,24 @@ "type": "tidelift" } ], - "time": "2026-01-06T12:43:21+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/type-info", - "version": "v8.0.4", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "106a2d3bbf0d4576b2f70e6ca866fa420956ed0d" + "reference": "9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/106a2d3bbf0d4576b2f70e6ca866fa420956ed0d", - "reference": "106a2d3bbf0d4576b2f70e6ca866fa420956ed0d", + "url": "https://api.github.com/repos/symfony/type-info/zipball/9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7", + "reference": "9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "psr/container": "^1.1|^2.0" }, "conflict": { @@ -8708,7 +8856,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v8.0.4" + "source": "https://github.com/symfony/type-info/tree/v8.1.0" }, "funding": [ { @@ -8728,51 +8876,51 @@ "type": "tidelift" } ], - "time": "2026-01-09T12:15:10+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/ux-autocomplete", - "version": "v2.32.0", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-autocomplete.git", - "reference": "d4259531cadaf6c36c611a325fe0fe4b9955c279" + "reference": "558216281c4b722d4547ae9cde5d5cb7c1fc2a3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-autocomplete/zipball/d4259531cadaf6c36c611a325fe0fe4b9955c279", - "reference": "d4259531cadaf6c36c611a325fe0fe4b9955c279", + "url": "https://api.github.com/repos/symfony/ux-autocomplete/zipball/558216281c4b722d4547ae9cde5d5cb7c1fc2a3f", + "reference": "558216281c4b722d4547ae9cde5d5cb7c1fc2a3f", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/dependency-injection": "^6.3|^7.0|^8.0", + "php": ">=8.4", + "symfony/dependency-injection": "^7.4|^8.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-foundation": "^6.3|^7.0|^8.0", - "symfony/http-kernel": "^6.3|^7.0|^8.0", - "symfony/property-access": "^6.3|^7.0|^8.0" + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0" }, "conflict": { "doctrine/orm": "2.9.0 || 2.9.1" }, "require-dev": { "doctrine/collections": "^1.6.8|^2.0", - "doctrine/doctrine-bundle": "^2.4.3|^3.0|^4.0", + "doctrine/doctrine-bundle": "^2.14|^3.0|^4.0", "doctrine/orm": "^2.9.4|^3.0", "fakerphp/faker": "^1.22", "mtdowling/jmespath.php": "^2.6", - "symfony/form": "^6.3|^7.0|^8.0", - "symfony/framework-bundle": "^6.3|^7.0|^8.0", + "phpunit/phpunit": "^11.1|^12.0", + "symfony/form": "^7.2|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", "symfony/maker-bundle": "^1.40", - "symfony/options-resolver": "^6.3|^7.0|^8.0", - "symfony/phpunit-bridge": "^6.3|^7.0|^8.0", - "symfony/process": "^6.3|^7.0|^8.0", - "symfony/security-bundle": "^6.3|^7.0|^8.0", - "symfony/twig-bundle": "^6.3|^7.0|^8.0", - "symfony/uid": "^6.3|^7.0|^8.0", + "symfony/options-resolver": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/security-bundle": "^7.4|^8.0", + "symfony/twig-bundle": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", "twig/twig": "^2.14.7|^3.0.4", - "zenstruck/browser": "^1.1", - "zenstruck/foundry": "^2.0" + "zenstruck/browser": "^1.9", + "zenstruck/foundry": "^2.7" }, "type": "symfony-bundle", "extra": { @@ -8802,7 +8950,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-autocomplete/tree/v2.32.0" + "source": "https://github.com/symfony/ux-autocomplete/tree/v3.2.0" }, "funding": [ { @@ -8822,51 +8970,49 @@ "type": "tidelift" } ], - "time": "2026-01-01T14:41:17+00:00" + "time": "2026-06-05T09:42:50+00:00" }, { "name": "symfony/ux-turbo", - "version": "v2.32.0", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-turbo.git", - "reference": "0deaa8abef20933d11f8bbe9899d950b4333ca1e" + "reference": "923c6479da86ebdcbd4f723a80c24d47d50567fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/0deaa8abef20933d11f8bbe9899d950b4333ca1e", - "reference": "0deaa8abef20933d11f8bbe9899d950b4333ca1e", + "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/923c6479da86ebdcbd4f723a80c24d47d50567fa", + "reference": "923c6479da86ebdcbd4f723a80c24d47d50567fa", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/stimulus-bundle": "^2.9.1" + "php": ">=8.4", + "symfony/stimulus-bundle": "^2.9.1|^3.0" }, "conflict": { - "symfony/flex": "<1.13" + "symfony/flex": "<1.13", + "symfony/mercure": ">=0.7.0 <0.7.2" }, "require-dev": { - "dbrekelmans/bdi": "dev-main", - "doctrine/doctrine-bundle": "^2.4.3|^3.0|^4.0", + "doctrine/doctrine-bundle": "^2.14|^3.0|^4.0", "doctrine/orm": "^2.8|^3.0", - "php-webdriver/webdriver": "^1.15", "phpstan/phpstan": "^2.1.17", - "symfony/asset-mapper": "^6.4|^7.0|^8.0", - "symfony/debug-bundle": "^5.4|^6.0|^7.0|^8.0", - "symfony/expression-language": "^5.4|^6.0|^7.0|^8.0", - "symfony/form": "^5.4|^6.0|^7.0|^8.0", - "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "phpunit/phpunit": "^11.1|^12.0", + "symfony/asset-mapper": "^7.4|^8.0", + "symfony/browser-kit": "^7.4|^8.0", + "symfony/debug-bundle": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/form": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", "symfony/mercure-bundle": "^0.3.7|^0.4.1", - "symfony/messenger": "^5.4|^6.0|^7.0|^8.0", - "symfony/panther": "^2.2", - "symfony/phpunit-bridge": "^5.4|^6.0|^7.0|^8.0", - "symfony/process": "^5.4|6.3.*|^7.0|^8.0", - "symfony/property-access": "^5.4|^6.0|^7.0|^8.0", - "symfony/security-core": "^5.4|^6.0|^7.0|^8.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0|^8.0", - "symfony/twig-bundle": "^6.4|^7.0|^8.0", - "symfony/ux-twig-component": "^2.21", - "symfony/web-profiler-bundle": "^5.4|^6.0|^7.0|^8.0" + "symfony/messenger": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/security-core": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/twig-bundle": "^7.4|^8.0", + "symfony/ux-twig-component": "^2.21|^3.0", + "symfony/web-profiler-bundle": "^7.4|^8.0" }, "type": "symfony-bundle", "extra": { @@ -8905,7 +9051,7 @@ "turbo-stream" ], "support": { - "source": "https://github.com/symfony/ux-turbo/tree/v2.32.0" + "source": "https://github.com/symfony/ux-turbo/tree/v3.2.0" }, "funding": [ { @@ -8925,35 +9071,38 @@ "type": "tidelift" } ], - "time": "2025-12-17T06:03:34+00:00" + "time": "2026-06-19T07:14:15+00:00" }, { "name": "symfony/validator", - "version": "v8.0.5", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "ba171e89ee2d01c24c1d8201d59ec595ef4adba1" + "reference": "d162b73fa884ce2185033c143172dc12b023051a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/ba171e89ee2d01c24c1d8201d59ec595ef4adba1", - "reference": "ba171e89ee2d01c24c1d8201d59ec595ef4adba1", + "url": "https://api.github.com/repos/symfony/validator/zipball/d162b73fa884ce2185033c143172dc12b023051a", + "reference": "d162b73fa884ce2185033c143172dc12b023051a", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.0", "symfony/translation-contracts": "^2.5|^3" }, "conflict": { "doctrine/lexer": "<1.1", - "symfony/doctrine-bridge": "<7.4" + "symfony/doctrine-bridge": "<7.4", + "symfony/expression-language": "<7.4" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3|^4", "symfony/cache": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", "symfony/config": "^7.4|^8.0", "symfony/console": "^7.4|^8.0", "symfony/dependency-injection": "^7.4|^8.0", @@ -8999,7 +9148,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v8.0.5" + "source": "https://github.com/symfony/validator/tree/v8.1.1" }, "funding": [ { @@ -9019,24 +9168,24 @@ "type": "tidelift" } ], - "time": "2026-01-27T09:06:10+00:00" + "time": "2026-06-27T06:18:14+00:00" }, { "name": "symfony/var-dumper", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "326e0406fc315eca57ef5740fa4a280b7a068c82" + "reference": "40096a2515a979f3125c5c928603995b8664c62a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/326e0406fc315eca57ef5740fa4a280b7a068c82", - "reference": "326e0406fc315eca57ef5740fa4a280b7a068c82", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/40096a2515a979f3125c5c928603995b8664c62a", + "reference": "40096a2515a979f3125c5c928603995b8664c62a", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/polyfill-mbstring": "^1.0" }, "conflict": { @@ -9086,7 +9235,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v8.0.4" + "source": "https://github.com/symfony/var-dumper/tree/v8.1.1" }, "funding": [ { @@ -9106,24 +9255,26 @@ "type": "tidelift" } ], - "time": "2026-01-01T23:07:29+00:00" + "time": "2026-06-09T10:54:51+00:00" }, { "name": "symfony/var-exporter", - "version": "v8.0.0", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04" + "reference": "75b74315b4e4be40e5534cf9c5cc30dd0907ed71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04", - "reference": "7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/75b74315b4e4be40e5534cf9c5cc30dd0907ed71", + "reference": "75b74315b4e4be40e5534cf9c5cc30dd0907ed71", "shasum": "" }, "require": { - "php": ">=8.4" + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-deepclone": "^1.40" }, "require-dev": { "symfony/property-access": "^7.4|^8.0", @@ -9153,11 +9304,12 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "description": "Provides tools to export, instantiate, hydrate, clone and lazy-load PHP objects", "homepage": "https://symfony.com", "keywords": [ "clone", "construct", + "deep-clone", "export", "hydrate", "instantiate", @@ -9166,7 +9318,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v8.0.0" + "source": "https://github.com/symfony/var-exporter/tree/v8.1.1" }, "funding": [ { @@ -9186,28 +9338,28 @@ "type": "tidelift" } ], - "time": "2025-11-05T18:53:00+00:00" + "time": "2026-06-27T09:05:56+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v8.0.4", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "0d0df8b3601f80b455d0bf40402d104c02d8b6fa" + "reference": "eb4cf71d8fc496d790ec85b1b684a7ac30d57a96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/0d0df8b3601f80b455d0bf40402d104c02d8b6fa", - "reference": "0d0df8b3601f80b455d0bf40402d104c02d8b6fa", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/eb4cf71d8fc496d790ec85b1b684a7ac30d57a96", + "reference": "eb4cf71d8fc496d790ec85b1b684a7ac30d57a96", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", - "php": ">=8.4", + "php": ">=8.4.1", "symfony/config": "^7.4|^8.0", "symfony/framework-bundle": "^7.4|^8.0", - "symfony/http-kernel": "^7.4|^8.0", + "symfony/http-kernel": "^8.1", "symfony/routing": "^7.4|^8.0", "symfony/twig-bundle": "^7.4|^8.0" }, @@ -9251,7 +9403,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v8.0.4" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v8.1.1" }, "funding": [ { @@ -9271,31 +9423,32 @@ "type": "tidelift" } ], - "time": "2026-01-07T12:23:22+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/yaml", - "version": "v8.0.1", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "7a1a90ba1df6e821a6b53c4cabdc32a56cabfb14" + "reference": "8e4cdd4311683516be06944f4b85244063cdb886" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/7a1a90ba1df6e821a6b53c4cabdc32a56cabfb14", - "reference": "7a1a90ba1df6e821a6b53c4cabdc32a56cabfb14", + "url": "https://api.github.com/repos/symfony/yaml/zipball/8e4cdd4311683516be06944f4b85244063cdb886", + "reference": "8e4cdd4311683516be06944f4b85244063cdb886", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "symfony/console": "<7.4" }, "require-dev": { - "symfony/console": "^7.4|^8.0" + "symfony/console": "^7.4|^8.0", + "yaml/yaml-test-suite": "*" }, "bin": [ "Resources/bin/yaml-lint" @@ -9326,7 +9479,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v8.0.1" + "source": "https://github.com/symfony/yaml/tree/v8.1.1" }, "funding": [ { @@ -9346,20 +9499,20 @@ "type": "tidelift" } ], - "time": "2025-12-04T18:17:06+00:00" + "time": "2026-06-09T11:06:24+00:00" }, { "name": "symfonycasts/sass-bundle", - "version": "v0.9.0", + "version": "v0.10.0", "source": { "type": "git", "url": "https://github.com/SymfonyCasts/sass-bundle.git", - "reference": "3472f2018417b4f7258095089b327a7ba79018ad" + "reference": "eedf6ace11e5323344726d2b6e0ba1635cf12bb5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SymfonyCasts/sass-bundle/zipball/3472f2018417b4f7258095089b327a7ba79018ad", - "reference": "3472f2018417b4f7258095089b327a7ba79018ad", + "url": "https://api.github.com/repos/SymfonyCasts/sass-bundle/zipball/eedf6ace11e5323344726d2b6e0ba1635cf12bb5", + "reference": "eedf6ace11e5323344726d2b6e0ba1635cf12bb5", "shasum": "" }, "require": { @@ -9367,6 +9520,7 @@ "symfony/asset-mapper": "^6.3|^7.0|^8.0", "symfony/console": "^5.4|^6.3|^7.0|^8.0", "symfony/filesystem": "^5.4|^6.3|^7.0|^8.0", + "symfony/finder": "^5.4|^6.3|^7.0|^8.0", "symfony/http-client": "^5.4|^6.3|^7.0|^8.0", "symfony/process": "^5.4|^6.3|^7.0|^8.0" }, @@ -9399,9 +9553,9 @@ ], "support": { "issues": "https://github.com/SymfonyCasts/sass-bundle/issues", - "source": "https://github.com/SymfonyCasts/sass-bundle/tree/v0.9.0" + "source": "https://github.com/SymfonyCasts/sass-bundle/tree/v0.10.0" }, - "time": "2025-11-29T13:44:16+00:00" + "time": "2026-04-09T11:29:28+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -9549,16 +9703,16 @@ }, { "name": "twig/cssinliner-extra", - "version": "v3.23.0", + "version": "v3.26.0", "source": { "type": "git", "url": "https://github.com/twigphp/cssinliner-extra.git", - "reference": "c25fa18b09a418e4d1454ec291f9406f630675ba" + "reference": "1b0dc906bbad7226c967bd325e99cccb1a850c4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/cssinliner-extra/zipball/c25fa18b09a418e4d1454ec291f9406f630675ba", - "reference": "c25fa18b09a418e4d1454ec291f9406f630675ba", + "url": "https://api.github.com/repos/twigphp/cssinliner-extra/zipball/1b0dc906bbad7226c967bd325e99cccb1a850c4b", + "reference": "1b0dc906bbad7226c967bd325e99cccb1a850c4b", "shasum": "" }, "require": { @@ -9602,7 +9756,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/cssinliner-extra/tree/v3.23.0" + "source": "https://github.com/twigphp/cssinliner-extra/tree/v3.26.0" }, "funding": [ { @@ -9614,20 +9768,20 @@ "type": "tidelift" } ], - "time": "2025-12-02T14:45:16+00:00" + "time": "2026-05-15T13:14:14+00:00" }, { "name": "twig/extra-bundle", - "version": "v3.23.0", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "7a27e784dc56eddfef5e9295829b290ce06f1682" + "reference": "6a621fcb1f28aa9ea7b34a99047ae0cdf5b834c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/7a27e784dc56eddfef5e9295829b290ce06f1682", - "reference": "7a27e784dc56eddfef5e9295829b290ce06f1682", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/6a621fcb1f28aa9ea7b34a99047ae0cdf5b834c9", + "reference": "6a621fcb1f28aa9ea7b34a99047ae0cdf5b834c9", "shasum": "" }, "require": { @@ -9676,7 +9830,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.23.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.24.0" }, "funding": [ { @@ -9688,20 +9842,20 @@ "type": "tidelift" } ], - "time": "2025-12-18T20:46:15+00:00" + "time": "2026-02-07T08:07:38+00:00" }, { "name": "twig/inky-extra", - "version": "v3.23.0", + "version": "v3.26.0", "source": { "type": "git", "url": "https://github.com/twigphp/inky-extra.git", - "reference": "6bdca65a38167f7bd0ad7ea04819098d465a5cc4" + "reference": "0a8b24f0d0247bf6dc5e2af0c0ab09c0c4e5343e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/inky-extra/zipball/6bdca65a38167f7bd0ad7ea04819098d465a5cc4", - "reference": "6bdca65a38167f7bd0ad7ea04819098d465a5cc4", + "url": "https://api.github.com/repos/twigphp/inky-extra/zipball/0a8b24f0d0247bf6dc5e2af0c0ab09c0c4e5343e", + "reference": "0a8b24f0d0247bf6dc5e2af0c0ab09c0c4e5343e", "shasum": "" }, "require": { @@ -9746,7 +9900,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/inky-extra/tree/v3.23.0" + "source": "https://github.com/twigphp/inky-extra/tree/v3.26.0" }, "funding": [ { @@ -9758,20 +9912,20 @@ "type": "tidelift" } ], - "time": "2025-12-02T14:45:16+00:00" + "time": "2026-05-15T13:14:14+00:00" }, { "name": "twig/twig", - "version": "v3.23.0", + "version": "v3.28.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9" + "reference": "597c12ed286fb9d1701a36684ce6e0cbe28ebc8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9", - "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/597c12ed286fb9d1701a36684ce6e0cbe28ebc8b", + "reference": "597c12ed286fb9d1701a36684ce6e0cbe28ebc8b", "shasum": "" }, "require": { @@ -9781,7 +9935,8 @@ "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "phpstan/phpstan": "^2.0", + "php-cs-fixer/shim": "^3.0@stable", + "phpstan/phpstan": "^2.0@stable", "psr/container": "^1.0|^2.0", "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, @@ -9825,7 +9980,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.23.0" + "source": "https://github.com/twigphp/Twig/tree/v3.28.0" }, "funding": [ { @@ -9837,7 +9992,7 @@ "type": "tidelift" } ], - "time": "2026-01-23T21:00:41+00:00" + "time": "2026-07-03T20:44:34+00:00" }, { "name": "ua-parser/uap-php", @@ -9904,6 +10059,65 @@ } ], "packages-dev": [ + { + "name": "carthage-software/mago", + "version": "1.43.0", + "source": { + "type": "git", + "url": "https://github.com/carthage-software/mago.git", + "reference": "3bee8a65ba55d037f8a9656e7b6be029f817c4e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/carthage-software/mago/zipball/3bee8a65ba55d037f8a9656e7b6be029f817c4e3", + "reference": "3bee8a65ba55d037f8a9656e7b6be029f817c4e3", + "shasum": "" + }, + "require": { + "php": "~8.1 || ~8.2 || ~8.3 || ~8.4 || ~8.5 || ~8.6" + }, + "suggest": { + "ext-curl": "To show binary download progress" + }, + "bin": [ + "composer/bin/mago" + ], + "type": "library", + "autoload": { + "files": [ + "composer/src/functions.php", + "composer/src/internal.php" + ], + "psr-4": { + "Mago\\": "composer/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT OR Apache-2.0" + ], + "authors": [ + { + "name": "Saif Eddin Gmati", + "email": "azjezz@carthage.software" + } + ], + "description": "Mago is a toolchain for PHP that aims to provide a set of tools to help developers write better code.", + "keywords": [ + "dev" + ], + "support": { + "issues": "https://github.com/carthage-software/mago/issues", + "source": "https://github.com/carthage-software/mago/tree/1.43.0" + }, + "funding": [ + { + "url": "https://github.com/azjezz", + "type": "github" + } + ], + "time": "2026-07-05T12:16:04+00:00" + }, { "name": "dama/doctrine-test-bundle", "version": "v8.6.0", @@ -9975,33 +10189,44 @@ }, { "name": "deployer/deployer", - "version": "v7.5.12", + "version": "v8.0.5", "source": { "type": "git", "url": "https://github.com/deployphp/deployer.git", - "reference": "efc71dac9ccc86b3f9946e75d50cb106b775aae2" + "reference": "199273500b4f14ff5eafd76bea524e5d44bcaff3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/deployphp/deployer/zipball/efc71dac9ccc86b3f9946e75d50cb106b775aae2", - "reference": "efc71dac9ccc86b3f9946e75d50cb106b775aae2", + "url": "https://api.github.com/repos/deployphp/deployer/zipball/199273500b4f14ff5eafd76bea524e5d44bcaff3", + "reference": "199273500b4f14ff5eafd76bea524e5d44bcaff3", "shasum": "" }, "require": { - "ext-json": "*", - "php": "^8.0|^7.3" + "maml/maml": "^3.2", + "php": "^8.3", + "symfony/console": "^7.4.0 || ^8.0.0", + "symfony/process": "^7.4.0 || ^8.0.0", + "symfony/yaml": "^7.4.0 || ^8.0.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.64", - "pestphp/pest": "^3.3", - "phpstan/phpstan": "^1.4", - "phpunit/php-code-coverage": "^11.0", - "phpunit/phpunit": "^11.4" + "friendsofphp/php-cs-fixer": "^3.68", + "phpstan/phpstan": "^2.1", + "phpunit/php-code-coverage": "^12.0", + "phpunit/phpunit": "^12.5" }, "bin": [ "bin/dep" ], "type": "library", + "autoload": { + "files": [ + "src/functions.php", + "src/Support/helpers.php" + ], + "psr-4": { + "Deployer\\": "src/" + } + }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -10025,20 +10250,20 @@ "type": "github" } ], - "time": "2025-02-19T16:45:27+00:00" + "time": "2026-05-18T16:59:34+00:00" }, { "name": "doctrine/data-fixtures", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "7a615ba135e45d67674bb623d90f34f6c7b6bd97" + "reference": "bf7ac3a050b54b261cedfb3d0a44733819062275" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/7a615ba135e45d67674bb623d90f34f6c7b6bd97", - "reference": "7a615ba135e45d67674bb623d90f34f6c7b6bd97", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/bf7ac3a050b54b261cedfb3d0a44733819062275", + "reference": "bf7ac3a050b54b261cedfb3d0a44733819062275", "shasum": "" }, "require": { @@ -10056,12 +10281,14 @@ "doctrine/dbal": "^3.5 || ^4", "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/orm": "^2.14 || ^3", + "doctrine/phpcr-odm": "^1.8 || ^2.0", "ext-sqlite3": "*", "fig/log-test": "^1", - "phpstan/phpstan": "2.1.31", - "phpunit/phpunit": "10.5.45 || 12.4.0", - "symfony/cache": "^6.4 || ^7", - "symfony/var-exporter": "^6.4 || ^7" + "jackalope/jackalope-fs": "*", + "phpstan/phpstan": "2.1.46", + "phpunit/phpunit": "10.5.63 || 12.5.12", + "symfony/cache": "^6.4 || ^7 || ^8", + "symfony/var-exporter": "^6.4 || ^7 || ^8" }, "suggest": { "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", @@ -10092,7 +10319,7 @@ ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/2.2.0" + "source": "https://github.com/doctrine/data-fixtures/tree/2.2.1" }, "funding": [ { @@ -10108,7 +10335,7 @@ "type": "tidelift" } ], - "time": "2025-10-17T20:06:20+00:00" + "time": "2026-04-01T13:56:01+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", @@ -10196,6 +10423,60 @@ ], "time": "2025-12-03T16:05:42+00:00" }, + { + "name": "maml/maml", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/maml-dev/maml-php.git", + "reference": "f11cdff4325bf399f23c33fc1995450e40ac0854" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maml-dev/maml-php/zipball/f11cdff4325bf399f23c33fc1995450e40ac0854", + "reference": "f11cdff4325bf399f23c33fc1995450e40ac0854", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2" + }, + "require-dev": { + "php-cs-fixer/shim": "^3.94", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Maml\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Medvedev", + "email": "anton@medv.io" + } + ], + "description": "MAML Parser", + "homepage": "https://maml.dev", + "keywords": [ + "config", + "configuration", + "maml", + "parser", + "serializer" + ], + "support": { + "issues": "https://github.com/maml-dev/maml-php/issues", + "source": "https://github.com/maml-dev/maml-php/tree/v3.2.0" + }, + "time": "2026-04-12T16:50:36+00:00" + }, { "name": "micheh/phpcs-gitlab", "version": "2.1.0", @@ -10311,20 +10592,19 @@ }, { "name": "nikic/php-parser", - "version": "v5.7.0", + "version": "v5.8.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f", "shasum": "" }, "require": { - "ext-ctype": "*", "ext-json": "*", "ext-tokenizer": "*", "php": ">=7.4" @@ -10363,9 +10643,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.8.0" }, - "time": "2025-12-06T11:56:16+00:00" + "time": "2026-07-04T14:30:18+00:00" }, { "name": "phar-io/manifest", @@ -10487,11 +10767,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.38", + "version": "2.2.5", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dfaf1f530e1663aa167bc3e52197adb221582629", - "reference": "dfaf1f530e1663aa167bc3e52197adb221582629", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/909c1e5fef7989ac0d0c1c5c42e32a5c4f6198a0", + "reference": "909c1e5fef7989ac0d0c1c5c42e32a5c4f6198a0", "shasum": "" }, "require": { @@ -10514,6 +10794,17 @@ "license": [ "MIT" ], + "authors": [ + { + "name": "Ondřej Mirtes" + }, + { + "name": "Markus Staab" + }, + { + "name": "Vincent Langlet" + } + ], "description": "PHPStan - PHP Static Analysis Tool", "keywords": [ "dev", @@ -10536,25 +10827,25 @@ "type": "github" } ], - "time": "2026-01-30T17:12:46+00:00" + "time": "2026-07-05T06:31:06+00:00" }, { "name": "phpstan/phpstan-doctrine", - "version": "2.0.14", + "version": "2.0.28", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-doctrine.git", - "reference": "70cd3e82fef49171163ff682a89cfe793d88581c" + "reference": "b4623954d5ffee6311e4ddbaef65c074ae0f781a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/70cd3e82fef49171163ff682a89cfe793d88581c", - "reference": "70cd3e82fef49171163ff682a89cfe793d88581c", + "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/b4623954d5ffee6311e4ddbaef65c074ae0f781a", + "reference": "b4623954d5ffee6311e4ddbaef65c074ae0f781a", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.1.34" + "phpstan/phpstan": "^2.2.2" }, "conflict": { "doctrine/collections": "<1.0", @@ -10574,7 +10865,7 @@ "doctrine/lexer": "^2.0 || ^3.0", "doctrine/mongodb-odm": "^2.4.3", "doctrine/orm": "^2.16.0", - "doctrine/persistence": "^2.2.1 || ^3.2", + "doctrine/persistence": "^2.2.1 || ^3.4.3", "gedmo/doctrine-extensions": "^3.8", "nesbot/carbon": "^2.49", "php-parallel-lint/php-parallel-lint": "^1.2", @@ -10583,6 +10874,7 @@ "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^9.6.20", "ramsey/uuid": "^4.2", + "shipmonk/name-collision-detector": "^2.1", "symfony/cache": "^5.4", "symfony/uid": "^5.4 || ^6.4 || ^7.3" }, @@ -10605,24 +10897,27 @@ "MIT" ], "description": "Doctrine extensions for PHPStan", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-doctrine/issues", - "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.14" + "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.28" }, - "time": "2026-01-25T14:56:09+00:00" + "time": "2026-07-13T08:43:43+00:00" }, { "name": "phpstan/phpstan-symfony", - "version": "2.0.12", + "version": "2.0.20", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "a46dd92eaf15146cd932d897a272e59cd4108ce2" + "reference": "53f1a6462dbe71fad36ce054caf5e1b725b740fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/a46dd92eaf15146cd932d897a272e59cd4108ce2", - "reference": "a46dd92eaf15146cd932d897a272e59cd4108ce2", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/53f1a6462dbe71fad36ce054caf5e1b725b740fd", + "reference": "53f1a6462dbe71fad36ce054caf5e1b725b740fd", "shasum": "" }, "require": { @@ -10676,24 +10971,27 @@ } ], "description": "Symfony Framework extensions and rules for PHPStan", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.12" + "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.20" }, - "time": "2026-01-23T09:04:33+00:00" + "time": "2026-06-16T09:17:35+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "12.5.2", + "version": "12.5.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "4a9739b51cbcb355f6e95659612f92e282a7077b" + "reference": "186dab580576598076de6818596d12b61801880e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4a9739b51cbcb355f6e95659612f92e282a7077b", - "reference": "4a9739b51cbcb355f6e95659612f92e282a7077b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/186dab580576598076de6818596d12b61801880e", + "reference": "186dab580576598076de6818596d12b61801880e", "shasum": "" }, "require": { @@ -10702,16 +11000,15 @@ "ext-xmlwriter": "*", "nikic/php-parser": "^5.7.0", "php": ">=8.3", - "phpunit/php-file-iterator": "^6.0", "phpunit/php-text-template": "^5.0", "sebastian/complexity": "^5.0", - "sebastian/environment": "^8.0.3", - "sebastian/lines-of-code": "^4.0", + "sebastian/environment": "^8.1.2", + "sebastian/lines-of-code": "^4.0.1", "sebastian/version": "^6.0", "theseer/tokenizer": "^2.0.1" }, "require-dev": { - "phpunit/phpunit": "^12.5.1" + "phpunit/phpunit": "^12.5.28" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -10749,7 +11046,7 @@ "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/12.5.2" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.7" }, "funding": [ { @@ -10769,7 +11066,7 @@ "type": "tidelift" } ], - "time": "2025-12-24T07:03:04+00:00" + "time": "2026-06-01T13:24:19+00:00" }, { "name": "phpunit/php-file-iterator", @@ -11030,42 +11327,43 @@ }, { "name": "phpunit/phpunit", - "version": "12.5.8", + "version": "12.5.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889" + "reference": "0608d157a284f15cc73b99a3327eff06b66a176d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/37ddb96c14bfee10304825edbb7e66d341ec6889", - "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0608d157a284f15cc73b99a3327eff06b66a176d", + "reference": "0608d157a284f15cc73b99a3327eff06b66a176d", "shasum": "" }, "require": { "ext-dom": "*", + "ext-filter": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", - "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", - "phpunit/php-code-coverage": "^12.5.2", - "phpunit/php-file-iterator": "^6.0.0", + "phpunit/php-code-coverage": "^12.5.7", + "phpunit/php-file-iterator": "^6.0.1", "phpunit/php-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", "phpunit/php-timer": "^8.0.0", - "sebastian/cli-parser": "^4.2.0", - "sebastian/comparator": "^7.1.4", + "sebastian/cli-parser": "^4.2.1", + "sebastian/comparator": "^7.1.8", "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.0.3", - "sebastian/exporter": "^7.0.2", - "sebastian/global-state": "^8.0.2", + "sebastian/environment": "^8.1.2", + "sebastian/exporter": "^7.0.3", + "sebastian/global-state": "^8.0.3", "sebastian/object-enumerator": "^7.0.0", - "sebastian/type": "^6.0.3", + "sebastian/recursion-context": "^7.0.1", + "sebastian/type": "^6.0.4", "sebastian/version": "^6.0.0", "staabm/side-effects-detector": "^1.0.5" }, @@ -11107,51 +11405,35 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.8" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.31" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" + "url": "https://phpunit.de/sponsoring.html", + "type": "other" } ], - "time": "2026-01-27T06:12:29+00:00" + "time": "2026-07-06T14:54:16+00:00" }, { "name": "sebastian/cli-parser", - "version": "4.2.0", + "version": "4.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04" + "reference": "7d05781b13f7dec9043a629a21d086ed74582a15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/90f41072d220e5c40df6e8635f5dafba2d9d4d04", - "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/7d05781b13f7dec9043a629a21d086ed74582a15", + "reference": "7d05781b13f7dec9043a629a21d086ed74582a15", "shasum": "" }, "require": { "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { @@ -11180,7 +11462,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.0" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.1" }, "funding": [ { @@ -11200,20 +11482,20 @@ "type": "tidelift" } ], - "time": "2025-09-14T09:36:45+00:00" + "time": "2026-05-17T05:29:34+00:00" }, { "name": "sebastian/comparator", - "version": "7.1.4", + "version": "7.1.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6" + "reference": "7c65c1e79836812819705b473a90c12399542485" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a7de5df2e094f9a80b40a522391a7e6022df5f6", - "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/7c65c1e79836812819705b473a90c12399542485", + "reference": "7c65c1e79836812819705b473a90c12399542485", "shasum": "" }, "require": { @@ -11221,10 +11503,10 @@ "ext-mbstring": "*", "php": ">=8.3", "sebastian/diff": "^7.0", - "sebastian/exporter": "^7.0" + "sebastian/exporter": "^7.0.3" }, "require-dev": { - "phpunit/phpunit": "^12.2" + "phpunit/phpunit": "^12.5.25" }, "suggest": { "ext-bcmath": "For comparing BcMath\\Number objects" @@ -11272,7 +11554,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.4" + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.8" }, "funding": [ { @@ -11292,7 +11574,7 @@ "type": "tidelift" } ], - "time": "2026-01-24T09:28:48+00:00" + "time": "2026-05-21T04:45:25+00:00" }, { "name": "sebastian/complexity", @@ -11421,23 +11703,23 @@ }, { "name": "sebastian/environment", - "version": "8.0.3", + "version": "8.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" + "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/9d32c685773823b1983e256ae4ecd48a10d6e439", + "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439", "shasum": "" }, "require": { "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^12.5.26" }, "suggest": { "ext-posix": "*" @@ -11445,7 +11727,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "8.1-dev" } }, "autoload": { @@ -11473,7 +11755,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" + "source": "https://github.com/sebastianbergmann/environment/tree/8.1.2" }, "funding": [ { @@ -11493,29 +11775,29 @@ "type": "tidelift" } ], - "time": "2025-08-12T14:11:56+00:00" + "time": "2026-05-25T13:40:20+00:00" }, { "name": "sebastian/exporter", - "version": "7.0.2", + "version": "7.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "016951ae10980765e4e7aee491eb288c64e505b7" + "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/016951ae10980765e4e7aee491eb288c64e505b7", - "reference": "016951ae10980765e4e7aee491eb288c64e505b7", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", + "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", "shasum": "" }, "require": { "ext-mbstring": "*", "php": ">=8.3", - "sebastian/recursion-context": "^7.0" + "sebastian/recursion-context": "^7.0.1" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { @@ -11563,7 +11845,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.2" + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.3" }, "funding": [ { @@ -11583,30 +11865,30 @@ "type": "tidelift" } ], - "time": "2025-09-24T06:16:11+00:00" + "time": "2026-05-20T04:37:17+00:00" }, { "name": "sebastian/global-state", - "version": "8.0.2", + "version": "8.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "ef1377171613d09edd25b7816f05be8313f9115d" + "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", - "reference": "ef1377171613d09edd25b7816f05be8313f9115d", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b164d3274d6537ab462591c5755f76a8f5b1aae9", + "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9", "shasum": "" }, "require": { "php": ">=8.3", "sebastian/object-reflector": "^5.0", - "sebastian/recursion-context": "^7.0" + "sebastian/recursion-context": "^7.0.1" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^12.5.28" }, "type": "library", "extra": { @@ -11637,7 +11919,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.3" }, "funding": [ { @@ -11657,28 +11939,28 @@ "type": "tidelift" } ], - "time": "2025-08-29T11:29:25+00:00" + "time": "2026-06-01T15:10:33+00:00" }, { "name": "sebastian/lines-of-code", - "version": "4.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" + "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", - "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d543b8ef219dcd8da262cbb958639a96bedba10e", + "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e", "shasum": "" }, "require": { - "nikic/php-parser": "^5.0", + "nikic/php-parser": "^5.7.0", "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { @@ -11707,15 +11989,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/lines-of-code", + "type": "tidelift" } ], - "time": "2025-02-07T04:57:28+00:00" + "time": "2026-05-19T16:22:07+00:00" }, { "name": "sebastian/object-enumerator", @@ -11909,23 +12203,23 @@ }, { "name": "sebastian/type", - "version": "6.0.3", + "version": "6.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" + "reference": "82ff822c2edc46724be9f7411d3163021f602773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", - "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/82ff822c2edc46724be9f7411d3163021f602773", + "reference": "82ff822c2edc46724be9f7411d3163021f602773", "shasum": "" }, "require": { "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { @@ -11954,7 +12248,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" + "source": "https://github.com/sebastianbergmann/type/tree/6.0.4" }, "funding": [ { @@ -11974,7 +12268,7 @@ "type": "tidelift" } ], - "time": "2025-08-09T06:57:12+00:00" + "time": "2026-05-20T06:45:45+00:00" }, { "name": "sebastian/version", @@ -12163,19 +12457,20 @@ }, { "name": "symfony/maker-bundle", - "version": "v1.65.1", + "version": "v1.67.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "eba30452d212769c9a5bcf0716959fd8ba1e54e3" + "reference": "6ce8b313845f16bcf385ee3cb31d8b24e30d5516" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/eba30452d212769c9a5bcf0716959fd8ba1e54e3", - "reference": "eba30452d212769c9a5bcf0716959fd8ba1e54e3", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/6ce8b313845f16bcf385ee3cb31d8b24e30d5516", + "reference": "6ce8b313845f16bcf385ee3cb31d8b24e30d5516", "shasum": "" }, "require": { + "composer-runtime-api": "^2.1", "doctrine/inflector": "^2.0", "nikic/php-parser": "^5.0", "php": ">=8.1", @@ -12195,7 +12490,7 @@ }, "require-dev": { "composer/semver": "^3.0", - "doctrine/doctrine-bundle": "^2.5.0|^3.0.0", + "doctrine/doctrine-bundle": "^2.10|^3.0", "doctrine/orm": "^2.15|^3", "doctrine/persistence": "^3.1|^4.0", "symfony/http-client": "^6.4|^7.0|^8.0", @@ -12237,7 +12532,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.65.1" + "source": "https://github.com/symfony/maker-bundle/tree/v1.67.0" }, "funding": [ { @@ -12257,7 +12552,7 @@ "type": "tidelift" } ], - "time": "2025-12-02T07:14:37+00:00" + "time": "2026-03-18T13:39:06+00:00" }, { "name": "theseer/tokenizer", @@ -12311,20 +12606,20 @@ }, { "name": "tijsverkoyen/deployer-sumo", - "version": "v4.3.0", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/deployer-sumo.git", - "reference": "b0ea4a0e48c6f0d8f2ecb329697c7207c5664dc3" + "reference": "d5da5106b732b10cc134bc58fcc2c529448d4a00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/deployer-sumo/zipball/b0ea4a0e48c6f0d8f2ecb329697c7207c5664dc3", - "reference": "b0ea4a0e48c6f0d8f2ecb329697c7207c5664dc3", + "url": "https://api.github.com/repos/tijsverkoyen/deployer-sumo/zipball/d5da5106b732b10cc134bc58fcc2c529448d4a00", + "reference": "d5da5106b732b10cc134bc58fcc2c529448d4a00", "shasum": "" }, "require": { - "deployer/deployer": "^7.0", + "deployer/deployer": "^8.0", "symfony/dotenv": "^3.4 || ^4.4|| ^5.3 || ^6.0 || ^7.0 || ^8.0" }, "type": "library", @@ -12346,33 +12641,33 @@ "description": "Deployer recipe with SumoCoders specific tasks", "support": { "issues": "https://github.com/tijsverkoyen/deployer-sumo/issues", - "source": "https://github.com/tijsverkoyen/deployer-sumo/tree/v4.3.0" + "source": "https://github.com/tijsverkoyen/deployer-sumo/tree/v5.0.0" }, - "time": "2026-01-08T08:39:13+00:00" + "time": "2026-05-22T13:17:34+00:00" }, { "name": "vincentlanglet/twig-cs-fixer", - "version": "3.13.0", + "version": "4.0.2", "source": { "type": "git", "url": "https://github.com/VincentLanglet/Twig-CS-Fixer.git", - "reference": "511e002e1e18203d26b173763ade29cbfd297750" + "reference": "1cb75618f7dd0f9bf51924aa6d3aa8c588f51d5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/511e002e1e18203d26b173763ade29cbfd297750", - "reference": "511e002e1e18203d26b173763ade29cbfd297750", + "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/1cb75618f7dd0f9bf51924aa6d3aa8c588f51d5a", + "reference": "1cb75618f7dd0f9bf51924aa6d3aa8c588f51d5a", "shasum": "" }, "require": { "composer-runtime-api": "^2.0.0", "ext-ctype": "*", - "php": ">=8.0", + "php": ">=8.1", "symfony/console": "^5.4.9 || ^6.4 || ^7.0 || ^8.0", "symfony/filesystem": "^5.4 || ^6.4 || ^7.0 || ^8.0", "symfony/finder": "^5.4 || ^6.4 || ^7.0 || ^8.0", "symfony/string": "^5.4.42 || ^6.4.10 || ~7.0.10 || ^7.1.3 || ^8.0", - "twig/twig": "^3.4", + "twig/twig": "^3.15", "webmozart/assert": "^1.10 || ^2.0" }, "require-dev": { @@ -12382,6 +12677,7 @@ "friendsofphp/php-cs-fixer": "^3.13.0", "infection/infection": "^0.26.16 || ^0.32.0", "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0", "phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpstan/phpstan-symfony": "^2.0", @@ -12416,7 +12712,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.13.0" + "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/4.0.2" }, "funding": [ { @@ -12424,20 +12720,20 @@ "type": "github" } ], - "time": "2026-01-24T00:18:59+00:00" + "time": "2026-06-29T15:22:14+00:00" }, { "name": "webmozart/assert", - "version": "2.1.2", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649" + "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/ce6a2f100c404b2d32a1dd1270f9b59ad4f57649", - "reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/2ccb7c2e821038c03a3e6e1700c570c158c55f70", + "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70", "shasum": "" }, "require": { @@ -12453,7 +12749,11 @@ }, "type": "library", "extra": { + "psalm": { + "pluginClass": "Webmozart\\Assert\\PsalmPlugin" + }, "branch-alias": { + "dev-master": "2.0-dev", "dev-feature/2-0": "2.0-dev" } }, @@ -12484,9 +12784,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.1.2" + "source": "https://github.com/webmozarts/assert/tree/2.4.1" }, - "time": "2026-01-13T14:02:24+00:00" + "time": "2026-06-15T15:31:57+00:00" } ], "aliases": [], diff --git a/config/packages/asset_mapper.yaml b/config/packages/asset_mapper.yaml index f8c67e9..97cb98a 100644 --- a/config/packages/asset_mapper.yaml +++ b/config/packages/asset_mapper.yaml @@ -7,7 +7,7 @@ framework: - vendor/twbs/bootstrap-icons/font/ missing_import_mode: strict excluded_patterns: - - '**/assets/styles/**/_*.scss' + - '*/assets/styles/**/_*.scss' when@prod: framework: diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index 9a8ac68..852b877 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -9,7 +9,7 @@ doctrine: profiling_collect_backtrace: '%kernel.debug%' orm: validate_xml_mapping: true - naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware + naming_strategy: doctrine.orm.naming_strategy.underscore identity_generation_preferences: Doctrine\DBAL\Platforms\PostgreSQLPlatform: identity auto_mapping: true @@ -20,8 +20,6 @@ doctrine: dir: '%kernel.project_dir%/src/Entity' prefix: 'App\Entity' alias: App - controller_resolver: - auto_mapping: false when@test: doctrine: diff --git a/config/packages/web_profiler.yaml b/config/packages/web_profiler.yaml index 0eac3c9..2093767 100644 --- a/config/packages/web_profiler.yaml +++ b/config/packages/web_profiler.yaml @@ -3,8 +3,7 @@ when@dev: toolbar: true framework: - profiler: - collect_serializer_data: true + profiler: true when@test: framework: diff --git a/config/reference.php b/config/reference.php index 74b89ec..8092916 100644 --- a/config/reference.php +++ b/config/reference.php @@ -78,6 +78,7 @@ * tags?: TagsType, * resource_tags?: TagsType, * decorates?: string, + * decorates_tag?: string, * decoration_inner_name?: string, * decoration_priority?: int, * decoration_on_invalid?: 'exception'|'ignore'|null, @@ -118,17 +119,22 @@ * stack: list>, * public?: bool, * deprecated?: DeprecationType, + * decorates?: string, + * decorates_tag?: string, + * decoration_inner_name?: string, + * decoration_priority?: int, + * decoration_on_invalid?: 'exception'|'ignore'|null, * } * @psalm-type ServicesConfig = array{ * _defaults?: DefaultsType, - * _instanceof?: InstanceofType, + * _instanceof?: array, * ... * } * @psalm-type ExtensionType = array * @psalm-type FrameworkConfig = array{ * secret?: scalar|Param|null, * http_method_override?: bool|Param, // Set true to enable support for the '_method' request parameter to determine the intended HTTP method on POST requests. // Default: false - * allowed_http_method_override?: list|null, + * allowed_http_method_override?: null|list, * trust_x_sendfile_type_header?: scalar|Param|null, // Set true to enable support for xsendfile in binary file responses. // Default: "%env(bool:default::SYMFONY_TRUST_X_SENDFILE_TYPE_HEADER)%" * ide?: scalar|Param|null, // Default: "%env(default::SYMFONY_IDE)%" * test?: bool|Param, @@ -136,9 +142,9 @@ * set_locale_from_accept_language?: bool|Param, // Whether to use the Accept-Language HTTP header to set the Request locale (only when the "_locale" request attribute is not passed). // Default: false * set_content_language_from_locale?: bool|Param, // Whether to set the Content-Language HTTP header on the Response using the Request locale. // Default: false * enabled_locales?: list, - * trusted_hosts?: list, + * trusted_hosts?: string|list, * trusted_proxies?: mixed, // Default: ["%env(default::SYMFONY_TRUSTED_PROXIES)%"] - * trusted_headers?: list, + * trusted_headers?: string|list, * error_controller?: scalar|Param|null, // Default: "error_controller" * handle_all_throwables?: bool|Param, // HttpKernel will handle all kinds of \Throwable. // Default: true * csrf_protection?: bool|array{ @@ -168,7 +174,7 @@ * allow_revalidate?: bool|Param, * stale_while_revalidate?: int|Param, * stale_if_error?: int|Param, - * terminate_on_cache_hit?: bool|Param, + * terminate_on_cache_hit?: bool|Param, // Deprecated: Setting the "framework.http_cache.terminate_on_cache_hit.terminate_on_cache_hit" configuration option is deprecated. It will be removed in version 9.0. * }, * esi?: bool|array{ // ESI configuration * enabled?: bool|Param, // Default: false @@ -188,7 +194,7 @@ * only_exceptions?: bool|Param, // Default: false * only_main_requests?: bool|Param, // Default: false * dsn?: scalar|Param|null, // Default: "file:%kernel.cache_dir%/profiler" - * collect_serializer_data?: true|Param, // Default: true + * collect_serializer_data?: true|Param, // Deprecated: Setting the "framework.profiler.collect_serializer_data.collect_serializer_data" configuration option is deprecated. It will be removed in version 9.0. // Default: true * }, * workflows?: bool|array{ * enabled?: bool|Param, // Default: false @@ -202,35 +208,35 @@ * property?: scalar|Param|null, * service?: scalar|Param|null, * }, - * supports?: list, + * supports?: string|list, * definition_validators?: list, * support_strategy?: scalar|Param|null, - * initial_marking?: list, - * events_to_dispatch?: list|null, - * places?: list, + * initial_marking?: \BackedEnum|string|list, + * events_to_dispatch?: null|list, + * places?: string|list, * }>, - * transitions: list, - * to?: list, * weight?: int|Param, // Default: 1 - * metadata?: list, + * metadata?: array, * }>, - * metadata?: list, + * metadata?: array, * }>, * }, * router?: bool|array{ // Router configuration * enabled?: bool|Param, // Default: false - * resource: scalar|Param|null, + * resource?: scalar|Param|null, * type?: scalar|Param|null, * default_uri?: scalar|Param|null, // The default URI used to generate URLs in a non-HTTP context. // Default: null * http_port?: scalar|Param|null, // Default: 80 @@ -268,7 +274,7 @@ * version_format?: scalar|Param|null, // Default: "%%s?%%s" * json_manifest_path?: scalar|Param|null, // Default: null * base_path?: scalar|Param|null, // Default: "" - * base_urls?: list, + * base_urls?: string|list, * packages?: array, + * base_urls?: string|list, * }>, * }, * asset_mapper?: bool|array{ // Asset Mapper configuration * enabled?: bool|Param, // Default: true - * paths?: array, + * paths?: string|array, * excluded_patterns?: list, * exclude_dotfiles?: bool|Param, // If true, any files starting with "." will be excluded from the asset mapper. // Default: true * server?: bool|Param, // If true, a "dev server" will return the assets from the public directory (true in "debug" mode only by default). // Default: true @@ -300,7 +306,7 @@ * }, * translator?: bool|array{ // Translator configuration * enabled?: bool|Param, // Default: true - * fallbacks?: list, + * fallbacks?: string|list, * logging?: bool|Param, // Default: false * formatter?: scalar|Param|null, // Default: "translator.formatter.default" * cache_dir?: scalar|Param|null, // Default: "%kernel.cache_dir%/translations" @@ -329,7 +335,7 @@ * validation?: bool|array{ // Validation configuration * enabled?: bool|Param, // Default: true * enable_attributes?: bool|Param, // Default: true - * static_method?: list, + * static_method?: string|list, * translation_domain?: scalar|Param|null, // Default: "validators" * email_validation_mode?: "html5"|"html5-allow-no-tld"|"strict"|Param, // Default: "html5" * mapping?: array{ @@ -340,6 +346,7 @@ * endpoint?: scalar|Param|null, // API endpoint for the NotCompromisedPassword Validator. // Default: null * }, * disable_translation?: bool|Param, // Default: false + * property_metadata_existence_check?: bool|Param, // When enabled, validateProperty() and validatePropertyValue() throw an exception if no metadata is found for the given property. // Default: false * auto_mapping?: array, * }>, @@ -353,10 +360,10 @@ * mapping?: array{ * paths?: list, * }, - * default_context?: list, + * default_context?: array, * named_serializers?: array, + * default_context?: array, * include_built_in_normalizers?: bool|Param, // Whether to include the built-in normalizers // Default: true * include_built_in_encoders?: bool|Param, // Whether to include the built-in encoders // Default: true * }>, @@ -389,13 +396,14 @@ * default_doctrine_dbal_provider?: scalar|Param|null, // Default: "database_connection" * default_pdo_provider?: scalar|Param|null, // Default: null * pools?: array, + * adapters?: string|list, * tags?: scalar|Param|null, // Default: null * public?: bool|Param, // Default: false * default_lifetime?: scalar|Param|null, // Default lifetime of the pool. * provider?: scalar|Param|null, // Overwrite the setting from the default provider for this adapter. * early_expiration_message_bus?: scalar|Param|null, * clearer?: scalar|Param|null, + * marshaller?: scalar|Param|null, // The marshaller service to use for this pool. * }>, * }, * php_errors?: array{ // PHP errors handling configuration @@ -412,17 +420,15 @@ * }, * lock?: bool|string|array{ // Lock configuration * enabled?: bool|Param, // Default: false - * resources?: array>, + * resources?: string|array>, * }, * semaphore?: bool|string|array{ // Semaphore configuration * enabled?: bool|Param, // Default: false - * resources?: array, + * resources?: string|array, * }, * messenger?: bool|array{ // Messenger configuration * enabled?: bool|Param, // Default: true - * routing?: array, - * }>, + * routing?: array>, * serializer?: array{ * default_serializer?: scalar|Param|null, // Service id to use as the default serializer for the transports. // Default: "messenger.transport.native_php_serializer" * symfony_serializer?: array{ @@ -433,7 +439,7 @@ * transports?: array, + * options?: array, * failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null * retry_strategy?: string|array{ * service?: scalar|Param|null, // Service id to override the retry strategy entirely. // Default: null @@ -446,7 +452,7 @@ * rate_limiter?: scalar|Param|null, // Rate limiter name to use when processing messages. // Default: null * }>, * failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null - * stop_worker_on_signals?: list, + * stop_worker_on_signals?: int|string|list, * default_bus?: scalar|Param|null, // Default: null * buses?: array, * }>, * }>, @@ -498,14 +504,14 @@ * enabled?: bool|Param, // Default: false * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" * shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true - * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null + * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. // Default: 86400 * }, * retry_failed?: bool|array{ * enabled?: bool|Param, // Default: false * retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null - * http_codes?: array, + * methods?: string|list, * }>, * max_retries?: int|Param, // Default: 3 * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 @@ -514,7 +520,7 @@ * jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 * }, * }, - * mock_response_factory?: scalar|Param|null, // The id of the service that should generate mock responses. It should be either an invokable or an iterable. + * mock_response_factory?: scalar|Param|null, // `true` to always return empty 200 responses, or the id of the service to use to generate mock responses - which should be either an invokable or an iterable. * scoped_clients?: array, * rate_limiter?: scalar|Param|null, // Rate limiter name to use for throttling requests. // Default: null * caching?: bool|array{ // Caching configuration. * enabled?: bool|Param, // Default: false * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" * shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true - * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null + * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. // Default: 86400 * }, * retry_failed?: bool|array{ * enabled?: bool|Param, // Default: false * retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null - * http_codes?: array, + * methods?: string|list, * }>, * max_retries?: int|Param, // Default: 3 * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 @@ -575,8 +582,8 @@ * transports?: array, * envelope?: array{ // Mailer Envelope configuration * sender?: scalar|Param|null, - * recipients?: list, - * allowed_recipients?: list, + * recipients?: string|list, + * allowed_recipients?: string|list, * }, * headers?: array, + * policy?: "fixed_window"|"token_bucket"|"sliding_window"|"compound"|"no_limit"|Param, // The algorithm to be used by this limiter. + * limiters?: string|list, * limit?: int|Param, // The maximum allowed hits in a fixed interval or burst. * interval?: scalar|Param|null, // Configures the fixed interval if "policy" is set to "fixed_window" or "sliding_window". The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). * rate?: array{ // Configures the fill rate if "policy" is set to "token_bucket". * interval?: scalar|Param|null, // Configures the rate interval. The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). * amount?: int|Param, // Amount of tokens to add each interval. // Default: 1 * }, + * anchor_at?: scalar|Param|null, // Aligns the "fixed_window" policy to a calendar (e.g. "2024-01-05 00:00:00 UTC" combined with `interval: 1 month` resets the counter on the 5th of each month). UTC if not specified. // Default: null * }>, * }, * uid?: bool|array{ // Uid configuration @@ -644,35 +652,41 @@ * name_based_uuid_namespace?: scalar|Param|null, * time_based_uuid_version?: 7|6|1|Param, // Default: 7 * time_based_uuid_node?: scalar|Param|null, + * uuid47_secret?: scalar|Param|null, // A high-entropy secret used by the "uuid47_transformer" service. Defaults to "kernel.secret". // Default: null * }, * html_sanitizer?: bool|array{ // HtmlSanitizer configuration * enabled?: bool|Param, // Default: false * sanitizers?: array, - * block_elements?: list, - * drop_elements?: list, + * block_elements?: string|list, + * drop_elements?: string|list, * allow_attributes?: array, * drop_attributes?: array, * force_attributes?: array>, * force_https_urls?: bool|Param, // Transforms URLs using the HTTP scheme to use the HTTPS scheme instead. // Default: false - * allowed_link_schemes?: list, - * allowed_link_hosts?: list|null, + * allowed_link_schemes?: string|list, + * allowed_link_hosts?: null|string|list, * allow_relative_links?: bool|Param, // Allows relative URLs to be used in links href attributes. // Default: false - * allowed_media_schemes?: list, - * allowed_media_hosts?: list|null, + * allowed_media_schemes?: string|list, + * allowed_media_hosts?: null|string|list, * allow_relative_medias?: bool|Param, // Allows relative URLs to be used in media source attributes (img, audio, video, ...). // Default: false - * with_attribute_sanitizers?: list, - * without_attribute_sanitizers?: list, + * with_attribute_sanitizers?: string|list, + * without_attribute_sanitizers?: string|list, * max_input_length?: int|Param, // The maximum length allowed for the sanitized input. // Default: 0 * }>, * }, * webhook?: bool|array{ // Webhook configuration * enabled?: bool|Param, // Default: false * message_bus?: scalar|Param|null, // The message bus to use. // Default: "messenger.default_bus" + * event_header_name?: scalar|Param|null, // Default: "Webhook-Event" + * id_header_name?: scalar|Param|null, // Default: "Webhook-Id" + * signature_header_name?: scalar|Param|null, // Default: "Webhook-Signature" + * signing_algorithm?: scalar|Param|null, // Default: "sha256" * routing?: array, * }, @@ -681,13 +695,17 @@ * }, * json_streamer?: bool|array{ // JSON streamer configuration * enabled?: bool|Param, // Default: false + * default_options?: array{ + * include_null_properties?: bool|Param, // Encode the properties with null value // Default: false + * ... + * }, * }, * } * @psalm-type DoctrineConfig = array{ * dbal?: array{ * default_connection?: scalar|Param|null, * types?: array, * driver_schemes?: array, * connections?: array, @@ -858,7 +876,7 @@ * datetime_functions?: array, * }, * filters?: array, * }>, @@ -912,6 +930,7 @@ * traces_sampler?: scalar|Param|null, * profiles_sample_rate?: float|Param, // The sampling factor to apply to profiles. A value of 0 will deny sending any profiles, and a value of 1 will send all profiles. Profiles are sampled in relation to traces_sample_rate * enable_logs?: bool|Param, + * log_flush_threshold?: mixed, // Default: null * enable_metrics?: bool|Param, // Default: true * attach_stacktrace?: bool|Param, * attach_metric_code_locations?: bool|Param, @@ -921,6 +940,7 @@ * spotlight?: bool|Param, * spotlight_url?: scalar|Param|null, * release?: scalar|Param|null, // Default: "%env(default::SENTRY_RELEASE)%" + * org_id?: int|Param, * server_name?: scalar|Param|null, * ignore_exceptions?: list, * ignore_transactions?: list, @@ -931,6 +951,7 @@ * before_send_log?: scalar|Param|null, * before_send_metric?: scalar|Param|null, * trace_propagation_targets?: mixed, + * strict_trace_continuation?: bool|Param, * tags?: array, * error_types?: scalar|Param|null, * max_breadcrumbs?: int|Param, @@ -955,11 +976,13 @@ * enabled?: bool|Param, // Default: true * capture_soft_fails?: bool|Param, // Default: true * isolate_breadcrumbs_by_message?: bool|Param, // Default: false + * isolate_context_by_message?: bool|Param, // Default: false * }, * tracing?: bool|array{ * enabled?: bool|Param, // Default: true * dbal?: bool|array{ * enabled?: bool|Param, // Default: true + * ignore_prepare_spans?: bool|Param, // Default: false * connections?: list, * }, * twig?: bool|array{ @@ -992,7 +1015,7 @@ * auto_reload?: scalar|Param|null, * optimizations?: int|Param, * default_path?: scalar|Param|null, // The default path used to load templates. // Default: "%kernel.project_dir%/templates" - * file_name_pattern?: list, + * file_name_pattern?: string|list, * paths?: array, * date?: array{ // The default format options used by the date filter. * format?: scalar|Param|null, // Default: "F j, Y H:i" @@ -1052,14 +1075,14 @@ * use_underscore?: bool|Param, // Default: true * unordered_list_markers?: list, * }, - * ... + * ... * }, * } * @psalm-type SecurityConfig = array{ * access_denied_url?: scalar|Param|null, // Default: null * session_fixation_strategy?: "none"|"migrate"|"invalidate"|Param, // Default: "migrate" * expose_security_errors?: \Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::None|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::AccountStatus|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::All|Param, // Default: "none" - * erase_credentials?: bool|Param, // Default: true + * erase_credentials?: bool|Param, // Deprecated: Setting the "security.erase_credentials.erase_credentials" configuration option is deprecated. It will be removed in Symfony 9.0, as the "eraseCredentials()" method was removed in Symfony 8.0. // Default: true * access_decision_manager?: array{ * strategy?: "affirmative"|"consensus"|"unanimous"|"priority"|Param, * service?: scalar|Param|null, @@ -1069,7 +1092,7 @@ * }, * password_hashers?: array, + * migrate_from?: string|list, * hash_algorithm?: scalar|Param|null, // Name of hashing algorithm for PBKDF2 (i.e. sha256, sha512, etc..) See hash_algos() for a list of supported algorithms. // Default: "sha512" * key_length?: scalar|Param|null, // Default: 40 * ignore_case?: bool|Param, // Default: false @@ -1083,36 +1106,36 @@ * providers?: array, + * providers?: string|list, * }, * entity?: array{ - * class: scalar|Param|null, // The full entity class name of your user class. + * class?: scalar|Param|null, // The full entity class name of your user class. * property?: scalar|Param|null, // Default: null * manager_name?: scalar|Param|null, // Default: null * }, * memory?: array{ * users?: array, + * roles?: string|list, * }>, * }, * ldap?: array{ - * service: scalar|Param|null, - * base_dn: scalar|Param|null, + * service?: scalar|Param|null, + * base_dn?: scalar|Param|null, * search_dn?: scalar|Param|null, // Default: null * search_password?: scalar|Param|null, // Default: null * extra_fields?: list, - * default_roles?: list, + * default_roles?: string|list, * role_fetcher?: scalar|Param|null, // Default: null * uid_key?: scalar|Param|null, // Default: "sAMAccountName" * filter?: scalar|Param|null, // Default: "({uid_key}={user_identifier})" * password_attribute?: scalar|Param|null, // Default: null * }, * }>, - * firewalls: array, + * methods?: string|list, * security?: bool|Param, // Default: true * user_checker?: scalar|Param|null, // The UserChecker to use when authenticating users in this firewall. // Default: "security.user_checker" * request_matcher?: scalar|Param|null, @@ -1131,8 +1154,8 @@ * path?: scalar|Param|null, // Default: "/logout" * target?: scalar|Param|null, // Default: "/" * invalidate_session?: bool|Param, // Default: true - * clear_site_data?: list<"*"|"cache"|"cookies"|"storage"|"executionContexts"|Param>, - * delete_cookies?: array, + * delete_cookies?: string|array, + * signature_properties?: list, * lifetime?: int|Param, // The lifetime of the login link in seconds. // Default: 600 * max_uses?: int|Param, // Max number of times a login link can be used - null means unlimited within lifetime. // Default: null * used_link_cache?: scalar|Param|null, // Cache service id used to expired links of max_uses is set. @@ -1270,14 +1293,14 @@ * success_handler?: scalar|Param|null, * failure_handler?: scalar|Param|null, * realm?: scalar|Param|null, // Default: null - * token_extractors?: list, - * token_handler: string|array{ + * token_extractors?: string|list, + * token_handler?: string|array{ * id?: scalar|Param|null, * oidc_user_info?: string|array{ - * base_uri: scalar|Param|null, // Base URI of the userinfo endpoint on the OIDC server, or the OIDC server URI to use the discovery (require "discovery" to be configured). + * base_uri?: scalar|Param|null, // Base URI of the userinfo endpoint on the OIDC server, or the OIDC server URI to use the discovery (require "discovery" to be configured). * discovery?: array{ // Enable the OIDC discovery. * cache?: array{ - * id: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration. + * id?: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration. * }, * }, * claim?: scalar|Param|null, // Claim which contains the user identifier (e.g. sub, email, etc.). // Default: "sub" @@ -1285,25 +1308,26 @@ * }, * oidc?: array{ * discovery?: array{ // Enable the OIDC discovery. - * base_uri: list, + * base_uri?: string|list, * cache?: array{ - * id: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration. + * id?: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration. * }, + * enforce_key_usage_verification?: bool|Param, // When enabled (default), only keys explicitly designated for signature (via "use":"sig" or a "key_ops" entry containing "sign"/"verify") are accepted. When disabled, keys without any usage designation are also accepted; keys explicitly restricted to encryption are still rejected. // Default: true * }, * claim?: scalar|Param|null, // Claim which contains the user identifier (e.g.: sub, email..). // Default: "sub" - * audience: scalar|Param|null, // Audience set in the token, for validation purpose. - * issuers: list, - * algorithms: list, + * audience?: scalar|Param|null, // Audience set in the token, for validation purpose. + * issuers?: list, + * algorithms?: list, * keyset?: scalar|Param|null, // JSON-encoded JWKSet used to sign the token (must contain a list of valid public keys). * encryption?: bool|array{ * enabled?: bool|Param, // Default: false * enforce?: bool|Param, // When enabled, the token shall be encrypted. // Default: false - * algorithms: list, - * keyset: scalar|Param|null, // JSON-encoded JWKSet used to decrypt the token (must contain a list of valid private keys). + * algorithms?: list, + * keyset?: scalar|Param|null, // JSON-encoded JWKSet used to decrypt the token (must contain a list of valid private keys). * }, * }, * cas?: array{ - * validation_url: scalar|Param|null, // CAS server validation URL + * validation_url?: scalar|Param|null, // CAS server validation URL * prefix?: scalar|Param|null, // CAS prefix // Default: "cas" * http_client?: scalar|Param|null, // HTTP Client service // Default: null * }, @@ -1326,7 +1350,7 @@ * remember_me?: array{ * secret?: scalar|Param|null, // Default: "%kernel.secret%" * service?: scalar|Param|null, - * user_providers?: list, + * user_providers?: string|list, * catch_exceptions?: bool|Param, // Default: true * signature_properties?: list, * token_provider?: string|array{ @@ -1376,12 +1400,12 @@ * path?: scalar|Param|null, // Use the urldecoded format. // Default: null * host?: scalar|Param|null, // Default: null * port?: int|Param, // Default: null - * ips?: list, + * ips?: string|list, * attributes?: array, * route?: scalar|Param|null, // Default: null - * methods?: list, + * methods?: string|list, * allow_if?: scalar|Param|null, // Default: null - * roles?: list, + * roles?: string|list, * }>, * role_hierarchy?: array>, * } @@ -1474,7 +1498,7 @@ * script-src?: list, * style-src?: list, * upgrade-insecure-requests?: bool|Param, // Default: false - * report-uri?: list, + * report-uri?: string|list, * worker-src?: list, * prefetch-src?: list, * report-to?: scalar|Param|null, @@ -1502,7 +1526,7 @@ * script-src?: list, * style-src?: list, * upgrade-insecure-requests?: bool|Param, // Default: false - * report-uri?: list, + * report-uri?: string|list, * worker-src?: list, * prefetch-src?: list, * report-to?: scalar|Param|null, @@ -1510,7 +1534,7 @@ * }, * referrer_policy?: bool|array{ * enabled?: bool|Param, // Default: false - * policies?: list, + * policies?: string|list, * }, * permissions_policy?: bool|array{ * enabled?: bool|Param, // Default: false @@ -1592,7 +1616,7 @@ * use_microseconds?: scalar|Param|null, // Default: true * channels?: list, * handlers?: array, + * tags?: string|list, * console_formatter_options?: mixed, // Default: [] * formatter?: scalar|Param|null, * nested?: bool|Param, // Default: false @@ -1709,13 +1733,13 @@ * host?: scalar|Param|null, * }, * from_email?: scalar|Param|null, - * to_email?: list, + * to_email?: string|list, * subject?: scalar|Param|null, * content_type?: scalar|Param|null, // Default: null * headers?: list, * mailer?: scalar|Param|null, // Default: null * email_prototype?: string|array{ - * id: scalar|Param|null, + * id?: scalar|Param|null, * method?: scalar|Param|null, // Default: null * }, * verbosity_levels?: array{ @@ -1760,6 +1784,7 @@ * @psalm-type SymfonycastsSassConfig = array{ * root_sass?: list, * binary?: scalar|Param|null, // The Sass binary to use // Default: null + * search_for_binary?: scalar|Param|null, // Whether to search for the Sass binary in the system PATH // Default: true * sass_options?: array{ * style?: "compressed"|"expanded"|Param, // The style of the generated CSS: compressed or expanded. // Default: "expanded" * charset?: bool|Param, // Whether to include the charset declaration in the generated Sass. @@ -1907,7 +1932,10 @@ final class App */ public static function config(array $config): array { - return AppReference::config($config); + /** @var ConfigType $config */ + $config = AppReference::config($config); + + return $config; } } diff --git a/importmap.php b/importmap.php index 4afe22a..130c5da 100644 --- a/importmap.php +++ b/importmap.php @@ -10,186 +10,74 @@ * be used as an "entrypoint" (and passed to the importmap() Twig function). * * The "importmap:require" command can be used to add new entries to this file. + * + * @return array */ return [ - 'app' => [ - 'path' => './assets/app.js', - 'entrypoint' => true, - ], - '@hotwired/stimulus' => [ - 'version' => '3.2.2', - ], - '@symfony/stimulus-bundle' => [ - 'path' => './vendor/symfony/stimulus-bundle/assets/dist/loader.js', - ], - 'tom-select' => [ - 'version' => '2.4.5', - ], - '@orchidjs/sifter' => [ - 'version' => '1.1.0', - ], - '@orchidjs/unicode-variants' => [ - 'version' => '1.1.2', - ], - 'tom-select/dist/css/tom-select.default.min.css' => [ - 'version' => '2.4.5', - 'type' => 'css', - ], - 'tom-select/dist/css/tom-select.default.css' => [ - 'version' => '2.4.5', - 'type' => 'css', - ], - 'tom-select/dist/css/tom-select.bootstrap4.css' => [ - 'version' => '2.4.5', - 'type' => 'css', - ], - 'tom-select/dist/css/tom-select.bootstrap5.css' => [ - 'version' => '2.4.5', - 'type' => 'css', - ], - '@hotwired/turbo' => [ - 'version' => '8.0.23', - ], - 'sumocoders/Clipboard' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/clipboard_controller.js', - ], - 'sumocoders/SidebarCollapsable' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/sidebar_collapsable_controller.js', - ], - 'sumocoders/Toast' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/toast_controller.js', - ], - 'sumocoders/addToast' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/js/toast.js', - ], - 'sumocoders/cookie' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/js/cookie.js', - ], - 'sumocoders/Theme' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/theme_controller.js', - ], - 'sumocoders/Tooltip' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/tooltip_controller.js', - ], - 'sumocoders/DateTimePicker' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/date_time_picker_controller.js', - ], - 'sumocoders/Tabs' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/tabs_controller.js', - ], - 'sumocoders/PasswordStrengthChecker' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/password_strength_checker_controller.js', - ], - 'sumocoders/TogglePassword' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/toggle_password_controller.js', - ], - 'sumocoders/FormCollection' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/form_collection_controller.js', - ], - 'sumocoders/debounce' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/js/debounce.js', - ], - 'sumocoders/ScrollToTop' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/scroll_to_top_controller.js', - ], - 'sumocoders/Popover' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/popover_controller.js', - ], - 'sumocoders/ajax_client' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/js/ajax_client.js', - ], - 'sumocoders/Confirm' => [ - 'path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/confirm_controller.js', - ], - 'bootstrap' => [ - 'version' => '5.3.8', - ], - '@popperjs/core' => [ - 'version' => '2.11.8', - ], - 'bootstrap/dist/css/bootstrap.min.css' => [ - 'version' => '5.3.8', - 'type' => 'css', - ], - 'flatpickr' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/flatpickr.css' => [ - 'version' => '4.6.13', - 'type' => 'css', - ], - 'flatpickr/dist/themes/airbnb.css' => [ - 'version' => '4.6.13', - 'type' => 'css', - ], - 'flatpickr/dist/l10n/at.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/cs.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/da.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/nl.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/et.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/fi.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/fr.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/de.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/gr.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/lv.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/lt.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/it.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/no.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/pl.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/pt.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/sk.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/sv.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/es.js' => [ - 'version' => '4.6.13', - ], - 'flatpickr/dist/l10n/sl.js' => [ - 'version' => '4.6.13', - ], - 'sortablejs' => [ - 'version' => '1.15.6', - ], - 'axios' => [ - 'version' => '1.13.4', - ], - '@stimulus-components/clipboard' => [ - 'version' => '5.0.0', - ], - 'flatpickr/dist/flatpickr.min.css' => [ - 'version' => '4.6.13', - 'type' => 'css', - ], + 'app' => ['path' => './assets/app.js', 'entrypoint' => true], + '@hotwired/stimulus' => ['version' => '3.2.2'], + '@symfony/stimulus-bundle' => ['path' => './vendor/symfony/stimulus-bundle/assets/dist/loader.js'], + 'tom-select' => ['version' => '2.6.2'], + '@orchidjs/sifter' => ['version' => '1.1.0'], + '@orchidjs/unicode-variants' => ['version' => '1.1.2'], + 'tom-select/dist/css/tom-select.default.min.css' => ['version' => '2.6.2', 'type' => 'css'], + 'tom-select/dist/css/tom-select.default.css' => ['version' => '2.6.2', 'type' => 'css'], + 'tom-select/dist/css/tom-select.bootstrap4.css' => ['version' => '2.6.2', 'type' => 'css'], + 'tom-select/dist/css/tom-select.bootstrap5.css' => ['version' => '2.6.2', 'type' => 'css'], + '@hotwired/turbo' => ['version' => '8.0.23'], + 'bootstrap' => ['version' => '5.3.8'], + 'flatpickr' => ['version' => '4.6.13'], + 'flatpickr/dist/flatpickr.css' => ['version' => '4.6.13', 'type' => 'css'], + 'flatpickr/dist/themes/airbnb.css' => ['version' => '4.6.13', 'type' => 'css'], + 'flatpickr/dist/l10n/at.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/cs.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/da.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/nl.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/et.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/fi.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/fr.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/de.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/gr.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/lv.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/lt.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/it.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/no.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/pl.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/pt.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/sk.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/sv.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/es.js' => ['version' => '4.6.13'], + 'flatpickr/dist/l10n/sl.js' => ['version' => '4.6.13'], + 'sortablejs' => ['version' => '1.15.7'], + 'axios' => ['version' => '1.18.1'], + '@stimulus-components/clipboard' => ['version' => '5.0.0'], + '@popperjs/core' => ['version' => '2.11.8'], + 'bootstrap/dist/css/bootstrap.min.css' => ['version' => '5.3.8', 'type' => 'css'], + 'flatpickr/dist/flatpickr.min.css' => ['version' => '4.6.13', 'type' => 'css'], + 'sumocoders/Clipboard' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/clipboard_controller.js'], + 'sumocoders/SidebarCollapsable' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/sidebar_collapsable_controller.js'], + 'sumocoders/Toast' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/toast_controller.js'], + 'sumocoders/addToast' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/js/toast.js'], + 'sumocoders/cookie' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/js/cookie.js'], + 'sumocoders/Theme' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/theme_controller.js'], + 'sumocoders/Tooltip' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/tooltip_controller.js'], + 'sumocoders/DateTimePicker' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/date_time_picker_controller.js'], + 'sumocoders/Tabs' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/tabs_controller.js'], + 'sumocoders/PasswordStrengthChecker' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/password_strength_checker_controller.js'], + 'sumocoders/TogglePassword' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/toggle_password_controller.js'], + 'sumocoders/FormCollection' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/form_collection_controller.js'], + 'sumocoders/debounce' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/js/debounce.js'], + 'sumocoders/ScrollToTop' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/scroll_to_top_controller.js'], + 'sumocoders/Popover' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/popover_controller.js'], + 'sumocoders/ajax_client' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/js/ajax_client.js'], + 'sumocoders/Confirm' => ['path' => './vendor/sumocoders/framework-core-bundle/assets-public/controllers/confirm_controller.js'], ]; diff --git a/mago.dist.toml b/mago.dist.toml new file mode 100644 index 0000000..c81ab5d --- /dev/null +++ b/mago.dist.toml @@ -0,0 +1,101 @@ +# Welcome to Mago! +# For full documentation, see https://mago.carthage.software/tools/overview +version = "1" +php-version = "8.5" + +[source] +workspace = "." +paths = [ + "migrations/", + "src/", + "tests/", +] +includes = [ + "vendor" +] +excludes = [ + "var/**", + "tests/bootstrap.php" +] + +[source.glob] +literal-separator = true + +[parser] +enable-short-tags = false + +[formatter] +inline-empty-function-braces = false +inline-empty-method-braces = false +inline-empty-constructor-braces = false +inline-empty-classlike-braces = false +method-chain-breaking-style = "same-line" +first-method-chain-on-new-line = false +preserve-breaking-member-access-chain = true +preserve-breaking-argument-list = true +preserve-breaking-array-like = true +preserve-breaking-parameter-list = true +preserve-breaking-attribute-list = true +preserve-breaking-conditional-expression = true +space-before-arrow-function-parameter-list-parenthesis = true +empty-line-before-return = true + +[linter] +integrations = [ + "symfony", + "phpunit", + "doctrine" +] + +[linter.rules] +literal-named-argument = { enabled = false } +strict-types = { enabled = false } + +[analyzer] +find-unused-expressions = true +analyze-dead-code = true +find-unused-parameters = true +strict-list-index-checks = true +no-boolean-literal-comparison = true +check-missing-type-hints = true +check-closure-missing-type-hints = true +check-arrow-function-missing-type-hints = true +register-super-globals = true +check-use-statements = true +check-name-casing = true + +ignore = [ + { + code = "excess-template-parameter", + in = "src/Form/", + }, + { + code = "mixed-return-statement", + in = "src/Repository/", + }, + { + code = "property-type-coercion", + in = "tests/", + }, + { + code = "possible-method-access-on-null", + in = "tests/", + }, + { + code = "ambiguous-object-method-access", + in = "tests/", + } +] + +[guard] +mode = "structural" +excludes = [ + "vendor/**" +] + +[[guard.structural.rules]] +on = "App\\Controller\\**" +target = "class" +must-be-named = "*Controller" +must-extend = "Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController" +reason = "Controllers must extend AbstractController and name should end with *Controller." diff --git a/phpstan.dist.neon b/phpstan.dist.neon index 1968b8f..f21bae7 100644 --- a/phpstan.dist.neon +++ b/phpstan.dist.neon @@ -14,4 +14,5 @@ parameters: - src/ excludePaths: - %rootDir%/../../../migrations + - %rootDir%/../../../src/Kernel.php ignoreErrors: diff --git a/public/index.php b/public/index.php index 9982c21..c0037a8 100644 --- a/public/index.php +++ b/public/index.php @@ -4,6 +4,6 @@ require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; -return function (array $context) { +return static function (array $context) { return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); }; diff --git a/symfony.lock b/symfony.lock index ff647de..45b78b7 100644 --- a/symfony.lock +++ b/symfony.lock @@ -1,4 +1,16 @@ { + "carthage-software/mago": { + "version": "1.43", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "main", + "version": "1.0", + "ref": "0be125d45ff145f21b54f21d33f7e62846940db6" + }, + "files": [ + "mago.toml" + ] + }, "dama/doctrine-test-bundle": { "version": "8.6", "recipe": { @@ -17,7 +29,7 @@ "repo": "github.com/symfony/recipes", "branch": "main", "version": "1.0", - "ref": "87424683adc81d7dc305eefec1fced883084aab9" + "ref": "fdd756167454623e21f1d769c5b814b243782a67" } }, "doctrine/doctrine-bundle": { @@ -26,7 +38,7 @@ "repo": "github.com/symfony/recipes", "branch": "main", "version": "3.0", - "ref": "18ee08e513ba0303fd09a01fc1c934870af06ffa" + "ref": "d39a3bd844edfe90c20ae520b804a3bf4f82b4ad" }, "files": [ "config/packages/doctrine.yaml", @@ -47,7 +59,7 @@ ] }, "doctrine/doctrine-migrations-bundle": { - "version": "3.7", + "version": "4.0", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -63,7 +75,7 @@ "version": "v3.7.0" }, "nelmio/security-bundle": { - "version": "3.8", + "version": "3.9", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -75,7 +87,7 @@ ] }, "phpstan/phpstan": { - "version": "2.1", + "version": "2.2", "recipe": { "repo": "github.com/symfony/recipes-contrib", "branch": "main", @@ -92,7 +104,7 @@ "repo": "github.com/symfony/recipes", "branch": "main", "version": "11.1", - "ref": "1117deb12541f35793eec9fff7494d7aa12283fc" + "ref": "ca0bc067abfb40a8de1b2561b96cbfc2b833c314" }, "files": [ ".env.test", @@ -102,7 +114,7 @@ ] }, "scheb/2fa-bundle": { - "version": "8.3", + "version": "8.6", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -115,12 +127,12 @@ ] }, "sentry/sentry-symfony": { - "version": "5.8", + "version": "5.11", "recipe": { "repo": "github.com/symfony/recipes-contrib", "branch": "main", "version": "5.0", - "ref": "12f504985eb24e3b20a9e41e0ec7e398798d18f0" + "ref": "aac2bc5220e9ab5b9e3838a7a4da90e7f74e6148" }, "files": [ "config/packages/sentry.yaml" @@ -132,14 +144,14 @@ "repo": "github.com/symfony/recipes-contrib", "branch": "main", "version": "3.6", - "ref": "1019e5c08d4821cb9b77f4891f8e9c31ff20ac6f" + "ref": "3868461a63d8cc781a00c008baea09b6594871a6" }, "files": [ "phpcs.xml.dist" ] }, "sumocoders/framework-core-bundle": { - "version": "v17.1.0" + "version": "v17.2.1" }, "symfony/apache-pack": { "version": "1.0", @@ -154,12 +166,12 @@ ] }, "symfony/asset-mapper": { - "version": "8.0", + "version": "8.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", "version": "6.4", - "ref": "5ad1308aa756d58f999ffbe1540d1189f5d7d14a" + "ref": "c01c47af2ec66a74ec046eccb919cfe27d3464ec" }, "files": [ "assets/app.js", @@ -169,7 +181,7 @@ ] }, "symfony/console": { - "version": "8.0", + "version": "8.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -181,7 +193,7 @@ ] }, "symfony/debug-bundle": { - "version": "8.0", + "version": "8.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -193,7 +205,7 @@ ] }, "symfony/flex": { - "version": "2.10", + "version": "2.11", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -206,7 +218,7 @@ ] }, "symfony/form": { - "version": "8.0", + "version": "8.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -218,12 +230,12 @@ ] }, "symfony/framework-bundle": { - "version": "8.0", + "version": "8.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "7.4", - "ref": "09f6e081c763a206802674ce0cb34a022f0ffc6d" + "version": "8.1", + "ref": "312027aea160796a50bf2d185503afdb5d71f570" }, "files": [ "config/packages/cache.yaml", @@ -238,7 +250,7 @@ ] }, "symfony/mailer": { - "version": "8.0", + "version": "8.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -250,7 +262,7 @@ ] }, "symfony/maker-bundle": { - "version": "1.65", + "version": "1.67", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -259,7 +271,7 @@ } }, "symfony/messenger": { - "version": "8.0", + "version": "8.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -283,7 +295,7 @@ ] }, "symfony/property-info": { - "version": "8.0", + "version": "8.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -295,7 +307,7 @@ ] }, "symfony/routing": { - "version": "8.0", + "version": "8.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -308,7 +320,7 @@ ] }, "symfony/security-bundle": { - "version": "8.0", + "version": "8.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -321,12 +333,12 @@ ] }, "symfony/stimulus-bundle": { - "version": "2.32", + "version": "2.36", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "2.24", - "ref": "3357f2fa6627b93658d8e13baa416b2a94a50c5f" + "version": "2.25", + "ref": "9b51a69079f3629061dfe0e5d7e20f5a9b20752c" }, "files": [ "assets/controllers.json", @@ -336,7 +348,7 @@ ] }, "symfony/translation": { - "version": "8.0", + "version": "8.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -349,12 +361,12 @@ ] }, "symfony/twig-bundle": { - "version": "8.0", + "version": "8.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", "version": "6.4", - "ref": "cab5fd2a13a45c266d45a7d9337e28dee6272877" + "ref": "f250159ebe99153d0c640a3e7742876fc7453f2c" }, "files": [ "config/packages/twig.yaml", @@ -362,7 +374,7 @@ ] }, "symfony/ux-autocomplete": { - "version": "2.32", + "version": "3.2", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -374,7 +386,7 @@ ] }, "symfony/ux-turbo": { - "version": "2.32", + "version": "3.2", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -386,7 +398,7 @@ ] }, "symfony/validator": { - "version": "8.0", + "version": "8.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -398,12 +410,12 @@ ] }, "symfony/web-profiler-bundle": { - "version": "8.0", + "version": "8.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "7.3", - "ref": "a363460c1b0b4a4d0242f2ce1a843ca0f6ac9026" + "version": "8.1", + "ref": "6bdd46f712bbed33a27130b6e055391cb1ab73d9" }, "files": [ "config/packages/web_profiler.yaml", @@ -411,12 +423,12 @@ ] }, "symfonycasts/sass-bundle": { - "version": "0.8", + "version": "0.10", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", "version": "0.5", - "ref": "4fe7a892a9f6f052c64ca2d6ee600cf95716f974" + "ref": "4812be2fc05dad51e05837779e9175321fb68d9f" }, "files": [ "config/packages/symfonycasts_sass.yaml", @@ -424,10 +436,10 @@ ] }, "twig/extra-bundle": { - "version": "v3.23.0" + "version": "v3.24.0" }, "vincentlanglet/twig-cs-fixer": { - "version": "3.13", + "version": "4.0", "recipe": { "repo": "github.com/symfony/recipes-contrib", "branch": "main", From 28e83fbe249a6d9bbe1080b48a7d042b7b28e487 Mon Sep 17 00:00:00 2001 From: Tijs Verkoyen Date: Mon, 13 Jul 2026 14:36:35 +0200 Subject: [PATCH 2/8] chore: fix mago fmt issues --- migrations/Version20210413143447.php | 42 +++++++++---------- src/Command/User/CreateCommand.php | 9 ++-- src/Controller/HomeController.php | 2 +- .../User/Admin/AddUserController.php | 4 +- .../User/Admin/EditUserController.php | 14 +++---- .../User/Admin/OverviewController.php | 4 +- .../User/Ajax/PasswordStrengthController.php | 2 +- src/Controller/User/ConfirmController.php | 10 ++--- .../User/ForgotPasswordController.php | 4 +- src/Controller/User/LoginController.php | 4 +- .../User/Profile/EmailController.php | 5 ++- .../User/Profile/PasswordController.php | 5 ++- .../User/Profile/TwoFactorController.php | 6 +-- .../Profile/TwoFactorQrCodeController.php | 2 +- src/Controller/User/ProfileController.php | 2 +- src/Controller/User/RegisterController.php | 4 +- .../User/ResendConfirmationController.php | 2 +- .../User/ResetPasswordController.php | 8 ++-- src/Entity/User/User.php | 13 +++--- src/EventListener/MenuListener.php | 2 +- src/Form/User/Admin/ChangePasswordType.php | 2 +- src/Form/User/Admin/FilterType.php | 2 +- src/Form/User/Admin/UserType.php | 4 +- src/Form/User/ChangeEmailType.php | 2 +- src/Form/User/Enable2FaType.php | 2 +- src/Form/User/ForgotPasswordType.php | 2 +- src/Form/User/LoginType.php | 4 +- src/Form/User/RegisterType.php | 4 +- .../User/RepeatedPasswordStrengthType.php | 4 +- src/Form/User/ResetPasswordType.php | 2 +- src/Message/User/ChangePassword.php | 2 +- src/Message/User/ConfirmUser.php | 2 +- src/Message/User/DisableUser.php | 2 +- src/Message/User/EnableUser.php | 2 +- src/Message/User/RegisterUser.php | 4 +- src/Message/User/ResetPassword.php | 6 +-- src/Message/User/SendConfirmation.php | 2 +- src/Message/User/UpdateUser.php | 2 +- src/MessageHandler/User/CreateUserHandler.php | 2 +- src/MessageHandler/User/EnableUserHandler.php | 2 +- .../User/RegisterUserHandler.php | 2 +- .../User/SendConfirmationHandler.php | 5 +-- .../User/SendPasswordResetHandler.php | 5 +-- src/MessageHandler/User/UpdateUserHandler.php | 2 +- src/Repository/User/UserRepository.php | 10 +++-- src/Security/AuthenticationEntryPoint.php | 2 +- src/Security/CustomAuthenticator.php | 2 +- src/Security/UserChecker.php | 8 ++-- src/Validator/User/UniqueEmailValidator.php | 8 ++-- src/Validator/User/UserTotpCodeValidator.php | 3 +- src/ValueObject/User/Role.php | 2 +- .../User/ChangePasswordHandlerTest.php | 2 +- .../User/CreateUserHandlerTest.php | 2 +- .../User/RegisterUserHandlerTest.php | 4 +- .../User/ResetPasswordHandlerTest.php | 2 +- .../User/SendConfirmationHandlerTest.php | 4 +- .../User/SendPasswordResetHandlerTest.php | 4 +- tests/Security/UserCheckerTest.php | 2 +- .../User/UniqueEmailValidatorTest.php | 27 ++++++------ tests/ValueObject/User/RoleTest.php | 2 +- 60 files changed, 151 insertions(+), 145 deletions(-) diff --git a/migrations/Version20210413143447.php b/migrations/Version20210413143447.php index 2e81206..3e6f97b 100644 --- a/migrations/Version20210413143447.php +++ b/migrations/Version20210413143447.php @@ -17,33 +17,31 @@ public function getDescription(): string public function up(Schema $schema): void { $this->addSql(<<<'SQL' - CREATE TABLE user ( - id INT AUTO_INCREMENT NOT NULL, - email VARCHAR(180) NOT NULL, - password VARCHAR(255) DEFAULT NULL, - enabled TINYINT(1) NOT NULL, - roles JSON NOT NULL, - confirmation_token VARCHAR(255) DEFAULT NULL, - confirmation_requested_at DATETIME DEFAULT NULL, - confirmed_at DATETIME DEFAULT NULL, - password_reset_token VARCHAR(255) DEFAULT NULL, - password_requested_at DATETIME DEFAULT NULL, - totp_secret VARCHAR(255) DEFAULT NULL, - backup_codes JSON NOT NULL, - trusted_version INT NOT NULL, - UNIQUE INDEX UNIQ_8D93D649E7927C74 (email), - PRIMARY KEY(id) - ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` - SQL - ); + CREATE TABLE user ( + id INT AUTO_INCREMENT NOT NULL, + email VARCHAR(180) NOT NULL, + password VARCHAR(255) DEFAULT NULL, + enabled TINYINT(1) NOT NULL, + roles JSON NOT NULL, + confirmation_token VARCHAR(255) DEFAULT NULL, + confirmation_requested_at DATETIME DEFAULT NULL, + confirmed_at DATETIME DEFAULT NULL, + password_reset_token VARCHAR(255) DEFAULT NULL, + password_requested_at DATETIME DEFAULT NULL, + totp_secret VARCHAR(255) DEFAULT NULL, + backup_codes JSON NOT NULL, + trusted_version INT NOT NULL, + UNIQUE INDEX UNIQ_8D93D649E7927C74 (email), + PRIMARY KEY(id) + ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` + SQL); } public function down(Schema $schema): void { $this->addSql(<<<'SQL' - DROP TABLE user - SQL - ); + DROP TABLE user + SQL); } public function isTransactional(): bool diff --git a/src/Command/User/CreateCommand.php b/src/Command/User/CreateCommand.php index e59b8be..02205c7 100644 --- a/src/Command/User/CreateCommand.php +++ b/src/Command/User/CreateCommand.php @@ -26,9 +26,12 @@ public function __construct( */ public function __invoke( SymfonyStyle $io, - #[Argument(description: 'The email of the user')] string $email, - #[Argument(description: 'The locale to use')] string $locale = 'nl', - #[Argument(description: 'The roles of the user')] array $roles = ['ROLE_USER'], + #[Argument(description: 'The email of the user')] + string $email, + #[Argument(description: 'The locale to use')] + string $locale = 'nl', + #[Argument(description: 'The roles of the user')] + array $roles = ['ROLE_USER'], ): int { $message = new CreateUser(); $message->email = $email; diff --git a/src/Controller/HomeController.php b/src/Controller/HomeController.php index ca49fdb..19d2873 100644 --- a/src/Controller/HomeController.php +++ b/src/Controller/HomeController.php @@ -25,7 +25,7 @@ public function __invoke( 'user_profile', [ '_locale' => $request->getPreferredLanguage($locales) ?? $locale, - ] + ], ); } } diff --git a/src/Controller/User/Admin/AddUserController.php b/src/Controller/User/Admin/AddUserController.php index 96de8e5..2d8d04c 100644 --- a/src/Controller/User/Admin/AddUserController.php +++ b/src/Controller/User/Admin/AddUserController.php @@ -35,7 +35,7 @@ public function __invoke(Request $request): Response $this->addFlash( 'success', - $this->translator->trans('User successfully added.') + $this->translator->trans('User successfully added.'), ); return $this->redirectToRoute('user_admin_overview'); @@ -45,7 +45,7 @@ public function __invoke(Request $request): Response 'user/admin/add.html.twig', [ 'form' => $form, - ] + ], ); } } diff --git a/src/Controller/User/Admin/EditUserController.php b/src/Controller/User/Admin/EditUserController.php index 458b859..4855222 100644 --- a/src/Controller/User/Admin/EditUserController.php +++ b/src/Controller/User/Admin/EditUserController.php @@ -42,7 +42,7 @@ public function __invoke(Request $request, #[CurrentUser] User $currentUser, Use $this->addFlash( 'success', - $this->translator->trans('User successfully edited.') + $this->translator->trans('User successfully edited.'), ); return $this->redirectToRoute('user_admin_overview'); @@ -57,7 +57,7 @@ public function __invoke(Request $request, #[CurrentUser] User $currentUser, Use $this->addFlash( 'success', - $this->translator->trans('User successfully disabled.') + $this->translator->trans('User successfully disabled.'), ); return $this->redirectToRoute('user_admin_edit', ['user' => $user->getId()]); @@ -73,7 +73,7 @@ public function __invoke(Request $request, #[CurrentUser] User $currentUser, Use $this->addFlash( 'success', - $this->translator->trans('User successfully enabled.') + $this->translator->trans('User successfully enabled.'), ); return $this->redirectToRoute('user_admin_edit', ['user' => $user->getId()]); @@ -89,7 +89,7 @@ public function __invoke(Request $request, #[CurrentUser] User $currentUser, Use $this->addFlash( 'success', - $this->translator->trans('Confirmation mail successfully sent') + $this->translator->trans('Confirmation mail successfully sent'), ); return $this->redirectToRoute('user_admin_edit', ['user' => $user->getId()]); @@ -106,7 +106,7 @@ public function __invoke(Request $request, #[CurrentUser] User $currentUser, Use $this->addFlash( 'success', - $this->translator->trans('Password reset successfully sent.') + $this->translator->trans('Password reset successfully sent.'), ); return $this->redirectToRoute('user_admin_edit', ['user' => $user->getId()]); @@ -121,7 +121,7 @@ public function __invoke(Request $request, #[CurrentUser] User $currentUser, Use $this->addFlash( 'success', - $this->translator->trans('2FA disabled') + $this->translator->trans('2FA disabled'), ); return $this->redirectToRoute('user_admin_edit', ['user' => $user->getId()]); @@ -137,7 +137,7 @@ public function __invoke(Request $request, #[CurrentUser] User $currentUser, Use 'disableUserForm' => $disableUserForm ?? null, 'enableUserForm' => $enableUserForm ?? null, 'resendConfirmationForm' => $resendConfirmationForm ?? null, - ] + ], ); } } diff --git a/src/Controller/User/Admin/OverviewController.php b/src/Controller/User/Admin/OverviewController.php index f0eab9a..71e2fb1 100644 --- a/src/Controller/User/Admin/OverviewController.php +++ b/src/Controller/User/Admin/OverviewController.php @@ -25,7 +25,7 @@ public function __invoke(Request $request, #[MapQueryParameter] int $page = 1): { $form = $this->createForm( FilterType::class, - new FilterDataTransferObject() + new FilterDataTransferObject(), ); $form->handleRequest($request); @@ -37,7 +37,7 @@ public function __invoke(Request $request, #[MapQueryParameter] int $page = 1): [ 'form' => $form, 'users' => $paginatedUsers, - ] + ], ); } } diff --git a/src/Controller/User/Ajax/PasswordStrengthController.php b/src/Controller/User/Ajax/PasswordStrengthController.php index 9c2b48c..fa8153b 100644 --- a/src/Controller/User/Ajax/PasswordStrengthController.php +++ b/src/Controller/User/Ajax/PasswordStrengthController.php @@ -11,7 +11,7 @@ #[Route( '/admin/users/ajax/password-strength', name: 'admin_user_ajax_password_strength', - alias: ['user_ajax_password_strength'] + alias: ['user_ajax_password_strength'], )] final class PasswordStrengthController extends AbstractController { diff --git a/src/Controller/User/ConfirmController.php b/src/Controller/User/ConfirmController.php index f13319d..1148329 100644 --- a/src/Controller/User/ConfirmController.php +++ b/src/Controller/User/ConfirmController.php @@ -31,8 +31,8 @@ public function __invoke(string $token, Request $request): Response $this->addFlash( 'error', $this->translator->trans( - 'It looks like you clicked on an invalid account activation link. Please try again.' - ) + 'It looks like you clicked on an invalid account activation link. Please try again.', + ), ); return $this->redirectToRoute('login'); @@ -46,7 +46,7 @@ public function __invoke(string $token, Request $request): Response $this->addFlash( 'success', - $this->translator->trans('Account activated successfully.') + $this->translator->trans('Account activated successfully.'), ); /* @@ -56,7 +56,7 @@ public function __invoke(string $token, Request $request): Response if ($user->getPasswordResetToken() !== null) { return $this->redirectToRoute( 'user_reset_password', - ['token' => $user->getPasswordResetToken()] + ['token' => $user->getPasswordResetToken()], ); } @@ -67,7 +67,7 @@ public function __invoke(string $token, Request $request): Response 'user/confirm.html.twig', [ 'form' => $confirmForm, - ] + ], ); } } diff --git a/src/Controller/User/ForgotPasswordController.php b/src/Controller/User/ForgotPasswordController.php index 19e3b06..fa1cc75 100644 --- a/src/Controller/User/ForgotPasswordController.php +++ b/src/Controller/User/ForgotPasswordController.php @@ -30,7 +30,7 @@ public function __invoke(Request $request): Response $this->addFlash( 'success', - $this->translator->trans('Password reset link successfully sent.') + $this->translator->trans('Password reset link successfully sent.'), ); return $this->redirectToRoute('login'); @@ -40,7 +40,7 @@ public function __invoke(Request $request): Response 'user/forgot.html.twig', [ 'form' => $form, - ] + ], ); } } diff --git a/src/Controller/User/LoginController.php b/src/Controller/User/LoginController.php index d4e8121..951aa28 100644 --- a/src/Controller/User/LoginController.php +++ b/src/Controller/User/LoginController.php @@ -27,7 +27,7 @@ public function __invoke(): Response LoginType::class, [ 'email' => $this->authenticationUtils->getLastUsername(), - ] + ], ); return $this->render( @@ -36,7 +36,7 @@ public function __invoke(): Response 'error' => $this->authenticationUtils->getLastAuthenticationError(), 'last_username' => $this->authenticationUtils->getLastUsername(), 'form' => $form, - ] + ], ); } } diff --git a/src/Controller/User/Profile/EmailController.php b/src/Controller/User/Profile/EmailController.php index 979fab2..e9fb26b 100644 --- a/src/Controller/User/Profile/EmailController.php +++ b/src/Controller/User/Profile/EmailController.php @@ -28,7 +28,8 @@ public function __construct( #[Breadcrumb('Email')] public function __invoke( Request $request, - #[CurrentUser] User $user + #[CurrentUser] + User $user, ): Response { $message = new ChangeEmail($user->getId(), $user->getEmail()); @@ -40,7 +41,7 @@ public function __invoke( $this->addFlash( 'success', - $this->translator->trans('Email successfully edited.') + $this->translator->trans('Email successfully edited.'), ); return $this->redirectToRoute('user_email'); diff --git a/src/Controller/User/Profile/PasswordController.php b/src/Controller/User/Profile/PasswordController.php index ba06629..1f325f4 100644 --- a/src/Controller/User/Profile/PasswordController.php +++ b/src/Controller/User/Profile/PasswordController.php @@ -26,7 +26,8 @@ public function __construct( #[Breadcrumb('user_password')] public function __invoke( Request $request, - #[CurrentUser] User $user + #[CurrentUser] + User $user, ): Response { $form = $this->createForm(ChangePasswordType::class, new ChangePassword($user->getId())); $form->handleRequest($request); @@ -36,7 +37,7 @@ public function __invoke( $this->addFlash( 'success', - $this->translator->trans('Password successfully edited.') + $this->translator->trans('Password successfully edited.'), ); return $this->redirectToRoute('user_profile'); diff --git a/src/Controller/User/Profile/TwoFactorController.php b/src/Controller/User/Profile/TwoFactorController.php index 91ea162..6f305d1 100644 --- a/src/Controller/User/Profile/TwoFactorController.php +++ b/src/Controller/User/Profile/TwoFactorController.php @@ -56,7 +56,7 @@ public function __invoke( $session->set('2fa_show_backup_codes', true); $this->addFlash( 'success', - $this->translator->trans('2FA enabled') + $this->translator->trans('2FA enabled'), ); return $this->redirectToRoute('user_2fa'); @@ -72,7 +72,7 @@ public function __invoke( $this->addFlash( 'success', - $this->translator->trans('2FA disabled') + $this->translator->trans('2FA disabled'), ); return $this->redirectToRoute('user_2fa'); @@ -92,7 +92,7 @@ public function __invoke( 'showBackupCodes' => $showBackupCodes, 'enable2FaForm' => $enable2FaForm ?? null, 'disable2FaForm' => $disable2FaForm ?? null, - ] + ], ); } } diff --git a/src/Controller/User/Profile/TwoFactorQrCodeController.php b/src/Controller/User/Profile/TwoFactorQrCodeController.php index 74f1aed..0329ce1 100644 --- a/src/Controller/User/Profile/TwoFactorQrCodeController.php +++ b/src/Controller/User/Profile/TwoFactorQrCodeController.php @@ -46,7 +46,7 @@ public function __invoke( 200, [ 'Content-Type' => 'image/svg+xml', - ] + ], ); } } diff --git a/src/Controller/User/ProfileController.php b/src/Controller/User/ProfileController.php index 2fc1fdd..f354355 100644 --- a/src/Controller/User/ProfileController.php +++ b/src/Controller/User/ProfileController.php @@ -21,7 +21,7 @@ public function __invoke( 'user/profile.html.twig', [ 'user' => $user, - ] + ], ); } } diff --git a/src/Controller/User/RegisterController.php b/src/Controller/User/RegisterController.php index 8ae1b8f..c70b60f 100644 --- a/src/Controller/User/RegisterController.php +++ b/src/Controller/User/RegisterController.php @@ -33,7 +33,7 @@ public function __invoke(Request $request, SessionInterface $session): Response 'user_register', [ 'success' => true, - ] + ], ); } @@ -42,7 +42,7 @@ public function __invoke(Request $request, SessionInterface $session): Response [ 'form' => $form, 'show_registered_message' => $request->query->getBoolean('success', false), - ] + ], ); } } diff --git a/src/Controller/User/ResendConfirmationController.php b/src/Controller/User/ResendConfirmationController.php index 200c38f..83abdc8 100644 --- a/src/Controller/User/ResendConfirmationController.php +++ b/src/Controller/User/ResendConfirmationController.php @@ -29,7 +29,7 @@ public function __invoke(string $token, Request $request): Response if (!$user instanceof User) { $this->addFlash( 'error', - $this->translator->trans('Invalid confirmation token.') + $this->translator->trans('Invalid confirmation token.'), ); return $this->redirectToRoute('login'); diff --git a/src/Controller/User/ResetPasswordController.php b/src/Controller/User/ResetPasswordController.php index f2c7462..0623931 100644 --- a/src/Controller/User/ResetPasswordController.php +++ b/src/Controller/User/ResetPasswordController.php @@ -31,8 +31,8 @@ public function __invoke(string $token, Request $request): Response $this->addFlash( 'error', $this->translator->trans( - 'It looks like you clicked on an invalid password reset link. Please try again.' - ) + 'It looks like you clicked on an invalid password reset link. Please try again.', + ), ); return $this->redirectToRoute('user_forgot_password'); @@ -46,7 +46,7 @@ public function __invoke(string $token, Request $request): Response $this->addFlash( 'success', - $this->translator->trans('New password set successfully.') + $this->translator->trans('New password set successfully.'), ); return $this->redirectToRoute('login'); @@ -56,7 +56,7 @@ public function __invoke(string $token, Request $request): Response 'user/reset.html.twig', [ 'form' => $form, - ] + ], ); } } diff --git a/src/Entity/User/User.php b/src/Entity/User/User.php index 413c0f2..a9fb908 100644 --- a/src/Entity/User/User.php +++ b/src/Entity/User/User.php @@ -19,7 +19,7 @@ #[ORM\Entity(repositoryClass: UserRepository::class)] #[ORM\Table(name: 'user')] -#[UniqueEntity('email', message: "There is already an account with this email")] +#[UniqueEntity('email', message: 'There is already an account with this email')] #[AuditTrail] class User implements UserInterface, @@ -72,7 +72,7 @@ public function __construct( #[ORM\Column(type: 'string', length: 180, unique: true)] private string $email, #[ORM\Column(type: 'json')] - private array $roles + private array $roles, ) { $this->password = null; $this->enabled = false; @@ -88,7 +88,7 @@ public function __construct( */ public function update( string $email, - array $roles + array $roles, ): void { $this->email = $email; $this->roles = $roles; @@ -143,7 +143,7 @@ public function getRoles(): array */ public function getDisplayRoles(): array { - return array_map(fn(string $role) => strtolower(substr($role, 5)), $this->getRoles()); + return array_map(fn (string $role) => strtolower(substr($role, 5)), $this->getRoles()); } /** @@ -266,7 +266,7 @@ public function clearTotpSecret(): void $this->totpSecret = null; } - public function getTotpAuthenticationUsername(): string|null + public function getTotpAuthenticationUsername(): ?string { return $this->email; } @@ -277,7 +277,7 @@ public function getTotpAuthenticationConfiguration(): ?TotpConfigurationInterfac $this->totpSecret, TotpConfiguration::ALGORITHM_SHA1, 30, - 6 + 6, ); } @@ -323,5 +323,4 @@ public function changeEmail(string $email): void { $this->email = $email; } - } diff --git a/src/EventListener/MenuListener.php b/src/EventListener/MenuListener.php index b094b47..2f260f6 100644 --- a/src/EventListener/MenuListener.php +++ b/src/EventListener/MenuListener.php @@ -29,7 +29,7 @@ public function onConfigureMenu(ConfigureMenuEvent $event): void ], ], ], - ) + ), ); } } diff --git a/src/Form/User/Admin/ChangePasswordType.php b/src/Form/User/Admin/ChangePasswordType.php index 45dd14a..4fc916e 100644 --- a/src/Form/User/Admin/ChangePasswordType.php +++ b/src/Form/User/Admin/ChangePasswordType.php @@ -17,7 +17,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void $builder ->add( 'password', - RepeatedPasswordStrengthType::class + RepeatedPasswordStrengthType::class, ); } } diff --git a/src/Form/User/Admin/FilterType.php b/src/Form/User/Admin/FilterType.php index e62eaf5..ba19a54 100644 --- a/src/Form/User/Admin/FilterType.php +++ b/src/Form/User/Admin/FilterType.php @@ -23,7 +23,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void [ 'label' => 'filter.term', 'required' => false, - ] + ], ); } diff --git a/src/Form/User/Admin/UserType.php b/src/Form/User/Admin/UserType.php index 2c23605..837d991 100644 --- a/src/Form/User/Admin/UserType.php +++ b/src/Form/User/Admin/UserType.php @@ -22,7 +22,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void EmailType::class, [ 'label' => 'Email', - ] + ], ) ->add( 'roles', @@ -32,7 +32,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'choices' => Role::getChoices(), 'multiple' => true, 'expanded' => true, - ] + ], ); } } diff --git a/src/Form/User/ChangeEmailType.php b/src/Form/User/ChangeEmailType.php index b48910e..2df3a4e 100644 --- a/src/Form/User/ChangeEmailType.php +++ b/src/Form/User/ChangeEmailType.php @@ -21,7 +21,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void EmailType::class, [ 'required' => true, - ] + ], ); } diff --git a/src/Form/User/Enable2FaType.php b/src/Form/User/Enable2FaType.php index f3ee6b1..2501944 100644 --- a/src/Form/User/Enable2FaType.php +++ b/src/Form/User/Enable2FaType.php @@ -27,7 +27,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'pattern' => '[0-9]*', 'placeholder' => 'Enter the code from your authenticator app', ], - ] + ], ); } diff --git a/src/Form/User/ForgotPasswordType.php b/src/Form/User/ForgotPasswordType.php index 988f897..c2f8104 100644 --- a/src/Form/User/ForgotPasswordType.php +++ b/src/Form/User/ForgotPasswordType.php @@ -27,7 +27,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'tabindex' => 1, 'autocomplete' => 'username', ], - ] + ], ); } diff --git a/src/Form/User/LoginType.php b/src/Form/User/LoginType.php index 6630d01..889a9e5 100644 --- a/src/Form/User/LoginType.php +++ b/src/Form/User/LoginType.php @@ -27,7 +27,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'tabindex' => 1, 'autocomplete' => 'username', ], - ] + ], ) ->add( 'password', @@ -38,7 +38,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'tabindex' => 2, 'autocomplete' => 'current-password', ], - ] + ], ); } } diff --git a/src/Form/User/RegisterType.php b/src/Form/User/RegisterType.php index 6b34c14..27053ff 100644 --- a/src/Form/User/RegisterType.php +++ b/src/Form/User/RegisterType.php @@ -23,11 +23,11 @@ public function buildForm(FormBuilderInterface $builder, array $options): void EmailType::class, [ 'label' => 'Email', - ] + ], ) ->add( 'password', - RepeatedPasswordStrengthType::class + RepeatedPasswordStrengthType::class, ); } diff --git a/src/Form/User/RepeatedPasswordStrengthType.php b/src/Form/User/RepeatedPasswordStrengthType.php index a84d198..4a02d47 100644 --- a/src/Form/User/RepeatedPasswordStrengthType.php +++ b/src/Form/User/RepeatedPasswordStrengthType.php @@ -22,7 +22,7 @@ public function configureOptions(OptionsResolver $resolver): void 'attr' => [ 'autocomplete' => 'new-password', ], - ] + ], ); $resolver->setDefault( 'second_options', @@ -31,7 +31,7 @@ public function configureOptions(OptionsResolver $resolver): void 'attr' => [ 'autocomplete' => 'new-password', ], - ] + ], ); } diff --git a/src/Form/User/ResetPasswordType.php b/src/Form/User/ResetPasswordType.php index 39bce44..23e7bb2 100644 --- a/src/Form/User/ResetPasswordType.php +++ b/src/Form/User/ResetPasswordType.php @@ -17,7 +17,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void $builder ->add( 'password', - RepeatedPasswordStrengthType::class + RepeatedPasswordStrengthType::class, ); } diff --git a/src/Message/User/ChangePassword.php b/src/Message/User/ChangePassword.php index e4d7606..3337d01 100644 --- a/src/Message/User/ChangePassword.php +++ b/src/Message/User/ChangePassword.php @@ -10,7 +10,7 @@ class ChangePassword public string $password; public function __construct( - public readonly int $userId + public readonly int $userId, ) { } } diff --git a/src/Message/User/ConfirmUser.php b/src/Message/User/ConfirmUser.php index 3603693..30ae492 100644 --- a/src/Message/User/ConfirmUser.php +++ b/src/Message/User/ConfirmUser.php @@ -5,7 +5,7 @@ readonly class ConfirmUser { public function __construct( - public int $userId + public int $userId, ) { } } diff --git a/src/Message/User/DisableUser.php b/src/Message/User/DisableUser.php index 9646b32..e8f2dff 100644 --- a/src/Message/User/DisableUser.php +++ b/src/Message/User/DisableUser.php @@ -5,7 +5,7 @@ readonly class DisableUser { public function __construct( - public int $userId + public int $userId, ) { } } diff --git a/src/Message/User/EnableUser.php b/src/Message/User/EnableUser.php index 2f3fc91..eda6c2b 100644 --- a/src/Message/User/EnableUser.php +++ b/src/Message/User/EnableUser.php @@ -5,7 +5,7 @@ readonly class EnableUser { public function __construct( - public int $userId + public int $userId, ) { } } diff --git a/src/Message/User/RegisterUser.php b/src/Message/User/RegisterUser.php index a5cfc28..2efe6b9 100644 --- a/src/Message/User/RegisterUser.php +++ b/src/Message/User/RegisterUser.php @@ -10,9 +10,9 @@ class RegisterUser extends UserDataTransferObject { #[NotBlank] #[Assert\PasswordStrength( - minScore: Assert\PasswordStrength::STRENGTH_STRONG + minScore: Assert\PasswordStrength::STRENGTH_STRONG, )] - #[Assert\NotCompromisedPassword()] + #[Assert\NotCompromisedPassword] #[Assert\Length(min: 12)] public string $password; } diff --git a/src/Message/User/ResetPassword.php b/src/Message/User/ResetPassword.php index 4c64b51..6056a24 100644 --- a/src/Message/User/ResetPassword.php +++ b/src/Message/User/ResetPassword.php @@ -7,14 +7,14 @@ class ResetPassword { #[Assert\PasswordStrength( - minScore: Assert\PasswordStrength::STRENGTH_STRONG + minScore: Assert\PasswordStrength::STRENGTH_STRONG, )] - #[Assert\NotCompromisedPassword()] + #[Assert\NotCompromisedPassword] #[Assert\Length(min: 12)] public string $password; public function __construct( - public readonly int $userId + public readonly int $userId, ) { } } diff --git a/src/Message/User/SendConfirmation.php b/src/Message/User/SendConfirmation.php index 5546d37..64209fe 100644 --- a/src/Message/User/SendConfirmation.php +++ b/src/Message/User/SendConfirmation.php @@ -6,7 +6,7 @@ { public function __construct( public int $userId, - public string $locale + public string $locale, ) { } } diff --git a/src/Message/User/UpdateUser.php b/src/Message/User/UpdateUser.php index 9154f7b..8badab1 100644 --- a/src/Message/User/UpdateUser.php +++ b/src/Message/User/UpdateUser.php @@ -10,7 +10,7 @@ class UpdateUser extends UserDataTransferObject public readonly int $userId; public function __construct( - User $user + User $user, ) { $this->userId = $user->getId(); $this->email = $user->getEmail(); diff --git a/src/MessageHandler/User/CreateUserHandler.php b/src/MessageHandler/User/CreateUserHandler.php index 5339ab6..dd664e7 100644 --- a/src/MessageHandler/User/CreateUserHandler.php +++ b/src/MessageHandler/User/CreateUserHandler.php @@ -22,7 +22,7 @@ public function __invoke(CreateUser $message): User { $user = new User( $message->email, - $message->roles + $message->roles, ); $user->requestPassword(); $this->userRepository->add($user); diff --git a/src/MessageHandler/User/EnableUserHandler.php b/src/MessageHandler/User/EnableUserHandler.php index ba9c0f0..c52a404 100644 --- a/src/MessageHandler/User/EnableUserHandler.php +++ b/src/MessageHandler/User/EnableUserHandler.php @@ -11,7 +11,7 @@ final readonly class EnableUserHandler { public function __construct( - private UserRepository $userRepository + private UserRepository $userRepository, ) { } diff --git a/src/MessageHandler/User/RegisterUserHandler.php b/src/MessageHandler/User/RegisterUserHandler.php index 107c6e4..363527b 100644 --- a/src/MessageHandler/User/RegisterUserHandler.php +++ b/src/MessageHandler/User/RegisterUserHandler.php @@ -24,7 +24,7 @@ public function __invoke(RegisterUser $message): void { $user = new User( $message->email, - $message->roles + $message->roles, ); $encodedPassword = $this->passwordEncoder->hashPassword($user, $message->password); diff --git a/src/MessageHandler/User/SendConfirmationHandler.php b/src/MessageHandler/User/SendConfirmationHandler.php index 8e9e6ca..76674b2 100644 --- a/src/MessageHandler/User/SendConfirmationHandler.php +++ b/src/MessageHandler/User/SendConfirmationHandler.php @@ -38,7 +38,7 @@ public function __invoke(SendConfirmation $message): void $user->requestConfirmation(); $this->userRepository->save(); - $email = (new TemplatedEmail()) + $email = new TemplatedEmail() ->from($this->from) ->to(new Address($user->getEmail(), $user->getEmail())) ->subject($this->translator->trans('account.mail.confirm.title')) @@ -50,9 +50,8 @@ public function __invoke(SendConfirmation $message): void '_locale' => $message->locale, 'token' => $user->getConfirmationToken(), ], - RouterInterface::ABSOLUTE_URL + RouterInterface::ABSOLUTE_URL, ), - ]); $this->mailer->send($email); } diff --git a/src/MessageHandler/User/SendPasswordResetHandler.php b/src/MessageHandler/User/SendPasswordResetHandler.php index 192c3d3..8d813ca 100644 --- a/src/MessageHandler/User/SendPasswordResetHandler.php +++ b/src/MessageHandler/User/SendPasswordResetHandler.php @@ -39,7 +39,7 @@ public function __invoke(SendPasswordReset $message): void $user->requestPassword(); $this->userRepository->save(); - $email = (new TemplatedEmail()) + $email = new TemplatedEmail() ->from($this->from) ->to(new Address($user->getEmail(), $user->getEmail())) ->subject($this->translator->trans('account.mail.reset.title')) @@ -50,9 +50,8 @@ public function __invoke(SendPasswordReset $message): void [ 'token' => $user->getPasswordResetToken(), ], - RouterInterface::ABSOLUTE_URL + RouterInterface::ABSOLUTE_URL, ), - ]); $this->mailer->send($email); } diff --git a/src/MessageHandler/User/UpdateUserHandler.php b/src/MessageHandler/User/UpdateUserHandler.php index ad62cce..fb43199 100644 --- a/src/MessageHandler/User/UpdateUserHandler.php +++ b/src/MessageHandler/User/UpdateUserHandler.php @@ -23,7 +23,7 @@ public function __invoke(UpdateUser $message): void } $user->update( $message->email, - $message->roles + $message->roles, ); $this->userRepository->save(); } diff --git a/src/Repository/User/UserRepository.php b/src/Repository/User/UserRepository.php index b56cce5..370a219 100644 --- a/src/Repository/User/UserRepository.php +++ b/src/Repository/User/UserRepository.php @@ -56,13 +56,14 @@ public function checkConfirmationToken(string $confirmationToken): ?User $expirationCheck->sub($validDuration); try { - return $this->createQueryBuilder('u') + return $this + ->createQueryBuilder('u') ->where('u.confirmationToken = :token AND u.confirmationRequestedAt >= :check') ->setParameter('token', $confirmationToken) ->setParameter('check', $expirationCheck) ->getQuery() ->getSingleResult(); - } catch (NoResultException | NonUniqueResultException) { + } catch (NoResultException|NonUniqueResultException) { return null; } } @@ -74,13 +75,14 @@ public function checkResetToken(string $resetToken): ?User $expirationCheck->sub($validDuration); try { - return $this->createQueryBuilder('u') + return $this + ->createQueryBuilder('u') ->where('u.passwordResetToken = :token AND u.passwordRequestedAt >= :check') ->setParameter('token', $resetToken) ->setParameter('check', $expirationCheck) ->getQuery() ->getSingleResult(); - } catch (NoResultException | NonUniqueResultException) { + } catch (NoResultException|NonUniqueResultException) { return null; } } diff --git a/src/Security/AuthenticationEntryPoint.php b/src/Security/AuthenticationEntryPoint.php index ecc3f6e..ee6bb1b 100644 --- a/src/Security/AuthenticationEntryPoint.php +++ b/src/Security/AuthenticationEntryPoint.php @@ -13,7 +13,7 @@ class AuthenticationEntryPoint implements AuthenticationEntryPointInterface { public function __construct( - private readonly UrlGeneratorInterface $urlGenerator + private readonly UrlGeneratorInterface $urlGenerator, ) { } diff --git a/src/Security/CustomAuthenticator.php b/src/Security/CustomAuthenticator.php index 27b1cfa..691dfc4 100644 --- a/src/Security/CustomAuthenticator.php +++ b/src/Security/CustomAuthenticator.php @@ -23,7 +23,7 @@ class CustomAuthenticator extends AbstractLoginFormAuthenticator final public const LOGIN_ROUTE = 'login'; public function __construct( - private readonly UrlGeneratorInterface $urlGenerator + private readonly UrlGeneratorInterface $urlGenerator, ) { } diff --git a/src/Security/UserChecker.php b/src/Security/UserChecker.php index 7e4a1b7..067fa26 100644 --- a/src/Security/UserChecker.php +++ b/src/Security/UserChecker.php @@ -17,7 +17,7 @@ final class UserChecker implements UserCheckerInterface public function __construct( private readonly TranslatorInterface $translator, private readonly RouterInterface $router, - private readonly UserRepository $userRepository + private readonly UserRepository $userRepository, ) { } @@ -36,10 +36,10 @@ public function checkPreAuth(UserInterface $user): void 'user_resend_confirmation', [ 'token' => $user->getConfirmationToken(), - ] + ], ), - ] - ) + ], + ), ); } diff --git a/src/Validator/User/UniqueEmailValidator.php b/src/Validator/User/UniqueEmailValidator.php index b127dca..5d52a4b 100644 --- a/src/Validator/User/UniqueEmailValidator.php +++ b/src/Validator/User/UniqueEmailValidator.php @@ -16,7 +16,7 @@ class UniqueEmailValidator extends ConstraintValidator { public function __construct( - private readonly UserRepository $userRepository + private readonly UserRepository $userRepository, ) { } @@ -46,7 +46,8 @@ public function validate(mixed $value, Constraint $constraint): void ($formData instanceof CreateUser || $formData instanceof RegisterUser) && $userWithThatEmail instanceof User ) { - $this->context->buildViolation($constraint->message) + $this->context + ->buildViolation($constraint->message) ->setParameter('%email%', $value) ->addViolation(); } @@ -60,7 +61,8 @@ public function validate(mixed $value, Constraint $constraint): void && $userWithThatEmail instanceof User && $formData->userId !== $userWithThatEmail->getId() ) { - $this->context->buildViolation($constraint->message) + $this->context + ->buildViolation($constraint->message) ->setParameter('%email%', $value) ->addViolation(); } diff --git a/src/Validator/User/UserTotpCodeValidator.php b/src/Validator/User/UserTotpCodeValidator.php index 29dd3cb..b7d14bb 100644 --- a/src/Validator/User/UserTotpCodeValidator.php +++ b/src/Validator/User/UserTotpCodeValidator.php @@ -36,7 +36,6 @@ public function validate(mixed $value, Constraint $constraint): void return; } - $this->context->buildViolation($constraint->message) - ->addViolation(); + $this->context->buildViolation($constraint->message)->addViolation(); } } diff --git a/src/ValueObject/User/Role.php b/src/ValueObject/User/Role.php index bb03631..40ba907 100644 --- a/src/ValueObject/User/Role.php +++ b/src/ValueObject/User/Role.php @@ -14,7 +14,7 @@ class Role implements \Stringable ]; public function __construct( - private readonly string $role + private readonly string $role, ) { $this->validate(); } diff --git a/tests/MessageHandler/User/ChangePasswordHandlerTest.php b/tests/MessageHandler/User/ChangePasswordHandlerTest.php index f9635ef..86a2f12 100644 --- a/tests/MessageHandler/User/ChangePasswordHandlerTest.php +++ b/tests/MessageHandler/User/ChangePasswordHandlerTest.php @@ -38,7 +38,7 @@ private function changePassword(): void $handler = new ChangePasswordHandler( $this->userRepository, - $this->passwordHasher + $this->passwordHasher, ); $handler->__invoke($message); } diff --git a/tests/MessageHandler/User/CreateUserHandlerTest.php b/tests/MessageHandler/User/CreateUserHandlerTest.php index 1288dbb..470c43f 100644 --- a/tests/MessageHandler/User/CreateUserHandlerTest.php +++ b/tests/MessageHandler/User/CreateUserHandlerTest.php @@ -33,7 +33,7 @@ private function createUser(): void $handler = new CreateUserHandler( $this->userRepository, - $this->messageBus + $this->messageBus, ); $handler->__invoke($message); } diff --git a/tests/MessageHandler/User/RegisterUserHandlerTest.php b/tests/MessageHandler/User/RegisterUserHandlerTest.php index 63951db..4651232 100644 --- a/tests/MessageHandler/User/RegisterUserHandlerTest.php +++ b/tests/MessageHandler/User/RegisterUserHandlerTest.php @@ -38,7 +38,7 @@ private function registerUser(): void $handler = new RegisterUserHandler( $this->userRepository, $this->passwordHasher, - $this->messageBus + $this->messageBus, ); $handler->__invoke($message); } @@ -72,7 +72,7 @@ public function testEmailIsSent(): void $this->assertEmailHeaderSame( $email, 'To', - '"user@example.com" ' + '"user@example.com" ', ); } diff --git a/tests/MessageHandler/User/ResetPasswordHandlerTest.php b/tests/MessageHandler/User/ResetPasswordHandlerTest.php index f278b15..6d397a3 100644 --- a/tests/MessageHandler/User/ResetPasswordHandlerTest.php +++ b/tests/MessageHandler/User/ResetPasswordHandlerTest.php @@ -34,7 +34,7 @@ private function resetPassword(): void $handler = new ResetPasswordHandler( $this->userRepository, - $this->passwordHasher + $this->passwordHasher, ); $handler->__invoke($message); } diff --git a/tests/MessageHandler/User/SendConfirmationHandlerTest.php b/tests/MessageHandler/User/SendConfirmationHandlerTest.php index d24ab68..9f7321b 100644 --- a/tests/MessageHandler/User/SendConfirmationHandlerTest.php +++ b/tests/MessageHandler/User/SendConfirmationHandlerTest.php @@ -43,7 +43,7 @@ private function sendConfirmation(): void $this->translator, $this->router, $this->userRepository, - 'noreply@example.com' + 'noreply@example.com', ); $handler->__invoke($message); } @@ -66,7 +66,7 @@ public function testEmailIsSent(): void $this->assertEmailHeaderSame( $email, 'To', - '"user@example.com" ' + '"user@example.com" ', ); } diff --git a/tests/MessageHandler/User/SendPasswordResetHandlerTest.php b/tests/MessageHandler/User/SendPasswordResetHandlerTest.php index 8ee0ffb..a72afb8 100644 --- a/tests/MessageHandler/User/SendPasswordResetHandlerTest.php +++ b/tests/MessageHandler/User/SendPasswordResetHandlerTest.php @@ -42,7 +42,7 @@ private function sendPasswordReset(): void $this->translator, $this->router, $this->userRepository, - 'noreply@example.com' + 'noreply@example.com', ); $handler->__invoke($message); } @@ -65,7 +65,7 @@ public function testEmailIsSent(): void $this->assertEmailHeaderSame( $email, 'To', - '"user@example.com" ' + '"user@example.com" ', ); } diff --git a/tests/Security/UserCheckerTest.php b/tests/Security/UserCheckerTest.php index 57edb70..4a8579c 100644 --- a/tests/Security/UserCheckerTest.php +++ b/tests/Security/UserCheckerTest.php @@ -22,7 +22,7 @@ protected function setUp(): void $this->userChecker = new UserChecker( $this->createMock(TranslatorInterface::class), $this->createMock(RouterInterface::class), - $this->createMock(UserRepository::class) + $this->createMock(UserRepository::class), ); } diff --git a/tests/Validator/User/UniqueEmailValidatorTest.php b/tests/Validator/User/UniqueEmailValidatorTest.php index e059a50..8d5fa78 100644 --- a/tests/Validator/User/UniqueEmailValidatorTest.php +++ b/tests/Validator/User/UniqueEmailValidatorTest.php @@ -35,7 +35,8 @@ protected function setUp(): void public function testNoViolationWhenEmailIsUniqueForCreateUser(): void { - $context = $this->getMockBuilder(ExecutionContext::class) + $context = $this + ->getMockBuilder(ExecutionContext::class) ->disableOriginalConstructor() ->getMock(); $context->expects(self::never())->method('buildViolation'); @@ -47,7 +48,8 @@ public function testNoViolationWhenEmailIsUniqueForCreateUser(): void public function testNoViolationWhenEmailIsBlank(): void { - $context = $this->getMockBuilder(ExecutionContext::class) + $context = $this + ->getMockBuilder(ExecutionContext::class) ->disableOriginalConstructor() ->getMock(); $context->expects(self::never())->method('buildViolation'); @@ -60,7 +62,8 @@ public function testNoViolationWhenEmailIsBlank(): void public function testExceptionWhenEmailIsNumber(): void { - $context = $this->getMockBuilder(ExecutionContext::class) + $context = $this + ->getMockBuilder(ExecutionContext::class) ->disableOriginalConstructor() ->getMock(); $validator = new UniqueEmailValidator($this->userRepository); @@ -78,11 +81,11 @@ public function testViolationWhenEmailIsNotUnique(): void $createUser = new CreateUser(); $createUser->email = 'user@example.com'; - $context = $this->getMockBuilder(ExecutionContext::class) + $context = $this + ->getMockBuilder(ExecutionContext::class) ->disableOriginalConstructor() ->getMock(); - $context->expects(self::once())->method('getObject') - ->willReturn($createUser); + $context->expects(self::once())->method('getObject')->willReturn($createUser); $context->expects(self::once())->method('buildViolation'); $validator = new UniqueEmailValidator($this->userRepository); $validator->initialize($context); @@ -96,11 +99,11 @@ public function testNoViolationWhileEditingTheUser(): void $this->userRepository->add($user); $updateUser = new UpdateUser($user); - $context = $this->getMockBuilder(ExecutionContext::class) + $context = $this + ->getMockBuilder(ExecutionContext::class) ->disableOriginalConstructor() ->getMock(); - $context->expects(self::once())->method('getObject') - ->willReturn($updateUser); + $context->expects(self::once())->method('getObject')->willReturn($updateUser); $context->expects(self::never())->method('buildViolation'); $validator = new UniqueEmailValidator($this->userRepository); $validator->initialize($context); @@ -116,11 +119,11 @@ public function testViolationWhileEditingTheUserWithExistingEmail(): void $this->userRepository->add($existingUser); $updateUser = new UpdateUser($user); - $context = $this->getMockBuilder(ExecutionContext::class) + $context = $this + ->getMockBuilder(ExecutionContext::class) ->disableOriginalConstructor() ->getMock(); - $context->expects(self::once())->method('getObject') - ->willReturn($updateUser); + $context->expects(self::once())->method('getObject')->willReturn($updateUser); $context->expects(self::once())->method('buildViolation'); $validator = new UniqueEmailValidator($this->userRepository); $validator->initialize($context); diff --git a/tests/ValueObject/User/RoleTest.php b/tests/ValueObject/User/RoleTest.php index b91ac3b..a3315c6 100644 --- a/tests/ValueObject/User/RoleTest.php +++ b/tests/ValueObject/User/RoleTest.php @@ -4,8 +4,8 @@ namespace App\Tests\ValueObject\User; -use App\ValueObject\User\Role; use App\Exception\User\InvalidRoleException; +use App\ValueObject\User\Role; use PHPUnit\Framework\TestCase; class RoleTest extends TestCase From e7d66aa37d6d2f1f0ef2b0773097619b9f5ccf96 Mon Sep 17 00:00:00 2001 From: Tijs Verkoyen Date: Mon, 13 Jul 2026 14:40:24 +0200 Subject: [PATCH 3/8] chore: fix phpcs issues --- src/Repository/User/UserRepository.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Repository/User/UserRepository.php b/src/Repository/User/UserRepository.php index 370a219..e4a0d5d 100644 --- a/src/Repository/User/UserRepository.php +++ b/src/Repository/User/UserRepository.php @@ -63,7 +63,7 @@ public function checkConfirmationToken(string $confirmationToken): ?User ->setParameter('check', $expirationCheck) ->getQuery() ->getSingleResult(); - } catch (NoResultException|NonUniqueResultException) { + } catch (NoResultException|NonUniqueResultException) { // phpcs:ignore PSR12.Operators.OperatorSpacing.NoSpaceAfter,PSR12.Operators.OperatorSpacing.NoSpaceBefore,Generic.Files.LineLength.TooLong return null; } } @@ -82,7 +82,7 @@ public function checkResetToken(string $resetToken): ?User ->setParameter('check', $expirationCheck) ->getQuery() ->getSingleResult(); - } catch (NoResultException|NonUniqueResultException) { + } catch (NoResultException|NonUniqueResultException) { // phpcs:ignore PSR12.Operators.OperatorSpacing.NoSpaceAfter,PSR12.Operators.OperatorSpacing.NoSpaceBefore,Generic.Files.LineLength.TooLong return null; } } From 830aafdbbfc158357534f022c5336d8c24abb862 Mon Sep 17 00:00:00 2001 From: Tijs Verkoyen Date: Mon, 13 Jul 2026 15:21:00 +0200 Subject: [PATCH 4/8] chore: fix mago lint issues --- mago.dist.toml | 11 ++++++ .../User/Admin/EditUserController.php | 10 ++++- src/Controller/User/ConfirmController.php | 7 +++- .../User/Profile/EmailController.php | 2 +- .../User/ResendConfirmationController.php | 7 +++- .../User/ResetPasswordController.php | 7 +++- src/Entity/User/User.php | 18 +++++---- src/Message/User/Enable2Fa.php | 1 + src/Repository/User/UserRepository.php | 21 ++++++---- src/Security/AuthenticationEntryPoint.php | 1 - src/Security/CustomAuthenticator.php | 11 ++++-- src/Security/UserChecker.php | 7 +++- src/ValueObject/User/Role.php | 2 +- tests/Entity/User/UserTest.php | 32 ++++++++-------- .../User/ChangePasswordHandlerTest.php | 7 ++-- .../User/ConfirmUserHandlerTest.php | 8 ++-- .../User/CreateUserHandlerTest.php | 14 +++---- .../User/Disable2FaHandlerTest.php | 4 +- .../User/DisableUserHandlerTest.php | 2 +- .../User/Enable2FaHandlerTest.php | 6 +-- .../User/EnableUserHandlerTest.php | 2 +- .../User/RegisterUserHandlerTest.php | 21 +++++----- .../User/ResetPasswordHandlerTest.php | 7 ++-- .../User/SendConfirmationHandlerTest.php | 16 ++++---- .../User/SendPasswordResetHandlerTest.php | 14 +++---- .../User/UpdateUserHandlerTest.php | 6 +-- tests/Repository/User/UserRepositoryTest.php | 38 +++++++++---------- tests/Security/UserCheckerTest.php | 4 +- .../User/UniqueEmailValidatorTest.php | 3 -- tests/ValueObject/User/RoleTest.php | 10 ++--- 30 files changed, 171 insertions(+), 128 deletions(-) diff --git a/mago.dist.toml b/mago.dist.toml index c81ab5d..e174189 100644 --- a/mago.dist.toml +++ b/mago.dist.toml @@ -49,7 +49,18 @@ integrations = [ [linter.rules] literal-named-argument = { enabled = false } +readable-literal = { enabled = false } strict-types = { enabled = false } +too-many-methods = { + exclude = [ + "src/Entity/**", + ] +} +too-many-properties = { + exclude = [ + "src/Entity/**", + ] +} [analyzer] find-unused-expressions = true diff --git a/src/Controller/User/Admin/EditUserController.php b/src/Controller/User/Admin/EditUserController.php index 4855222..dfbe13d 100644 --- a/src/Controller/User/Admin/EditUserController.php +++ b/src/Controller/User/Admin/EditUserController.php @@ -22,6 +22,7 @@ use Symfony\Contracts\Translation\TranslatorInterface; #[Route('/admin/users/{user}/edit', name: 'user_admin_edit')] +// @mago-expect lint:cyclomatic-complexity final class EditUserController extends AbstractController { public function __construct( @@ -32,8 +33,13 @@ public function __construct( } #[Breadcrumb('Edit', parent: ['name' => 'user_admin_overview'])] - public function __invoke(Request $request, #[CurrentUser] User $currentUser, User $user): Response - { + // @mago-expect lint:halstead + public function __invoke( + Request $request, + #[CurrentUser] + User $currentUser, + User $user, + ): Response { $form = $this->createForm(UserType::class, new UpdateUser($user)); $form->handleRequest($request); diff --git a/src/Controller/User/ConfirmController.php b/src/Controller/User/ConfirmController.php index 1148329..43cd034 100644 --- a/src/Controller/User/ConfirmController.php +++ b/src/Controller/User/ConfirmController.php @@ -23,8 +23,11 @@ public function __construct( ) { } - public function __invoke(string $token, Request $request): Response - { + public function __invoke( + #[\SensitiveParameter] + string $token, + Request $request, + ): Response { $user = $this->userRepository->checkConfirmationToken($token); if (!$user instanceof User) { diff --git a/src/Controller/User/Profile/EmailController.php b/src/Controller/User/Profile/EmailController.php index e9fb26b..7b93073 100644 --- a/src/Controller/User/Profile/EmailController.php +++ b/src/Controller/User/Profile/EmailController.php @@ -17,7 +17,7 @@ use Symfony\Contracts\Translation\TranslatorInterface; #[Route('/user/email', name: 'user_email')] -class EmailController extends AbstractController +final class EmailController extends AbstractController { public function __construct( private readonly TranslatorInterface $translator, diff --git a/src/Controller/User/ResendConfirmationController.php b/src/Controller/User/ResendConfirmationController.php index 83abdc8..00ae6c2 100644 --- a/src/Controller/User/ResendConfirmationController.php +++ b/src/Controller/User/ResendConfirmationController.php @@ -22,8 +22,11 @@ public function __construct( ) { } - public function __invoke(string $token, Request $request): Response - { + public function __invoke( + #[\SensitiveParameter] + string $token, + Request $request, + ): Response { $user = $this->userRepository->findOneBy(['confirmationToken' => $token]); if (!$user instanceof User) { diff --git a/src/Controller/User/ResetPasswordController.php b/src/Controller/User/ResetPasswordController.php index 0623931..a6f1b87 100644 --- a/src/Controller/User/ResetPasswordController.php +++ b/src/Controller/User/ResetPasswordController.php @@ -23,8 +23,11 @@ public function __construct( ) { } - public function __invoke(string $token, Request $request): Response - { + public function __invoke( + #[\SensitiveParameter] + string $token, + Request $request, + ): Response { $user = $this->userRepository->checkResetToken($token); if (!$user instanceof User) { diff --git a/src/Entity/User/User.php b/src/Entity/User/User.php index a9fb908..17f8814 100644 --- a/src/Entity/User/User.php +++ b/src/Entity/User/User.php @@ -143,7 +143,7 @@ public function getRoles(): array */ public function getDisplayRoles(): array { - return array_map(fn (string $role) => strtolower(substr($role, 5)), $this->getRoles()); + return array_map(static fn (string $role) => strtolower(substr($role, 5)), $this->getRoles()); } /** @@ -154,8 +154,10 @@ public function getPassword(): string return (string) $this->password; } - public function setPassword(string $password): void - { + public function setPassword( + #[\SensitiveParameter] + string $password, + ): void { $this->password = $password; $this->erasePasswordResetRequest(); } @@ -256,8 +258,10 @@ public function isTotpAuthenticationEnabled(): bool return $this->totpSecret !== null; } - public function setTotpSecret(string $totpSecret): void - { + public function setTotpSecret( + #[\SensitiveParameter] + string $totpSecret, + ): void { $this->totpSecret = $totpSecret; } @@ -296,7 +300,7 @@ public function isBackupCode(string $code): bool public function invalidateBackupCode(string $backupCode): void { - $key = array_search($backupCode, $this->backupCodes); + $key = array_search($backupCode, $this->backupCodes, true); if ($key !== false) { unset($this->backupCodes[$key]); } @@ -304,7 +308,7 @@ public function invalidateBackupCode(string $backupCode): void public function addBackupCode(string $backupCode): void { - if (!in_array($backupCode, $this->backupCodes)) { + if (!in_array($backupCode, $this->backupCodes, true)) { $this->backupCodes[] = $backupCode; } } diff --git a/src/Message/User/Enable2Fa.php b/src/Message/User/Enable2Fa.php index a02f138..6d68c11 100644 --- a/src/Message/User/Enable2Fa.php +++ b/src/Message/User/Enable2Fa.php @@ -14,6 +14,7 @@ final class Enable2Fa public function __construct( public readonly User $user, + #[\SensitiveParameter] public readonly string $secret, ) { } diff --git a/src/Repository/User/UserRepository.php b/src/Repository/User/UserRepository.php index e4a0d5d..b62b046 100644 --- a/src/Repository/User/UserRepository.php +++ b/src/Repository/User/UserRepository.php @@ -39,8 +39,11 @@ public function save(): void /** * Used to upgrade (rehash) the user's password automatically over time. */ - public function upgradePassword(PasswordAuthenticatedUserInterface $user, string $newHashedPassword): void - { + public function upgradePassword( + PasswordAuthenticatedUserInterface $user, + #[\SensitiveParameter] + string $newHashedPassword, + ): void { if (!$user instanceof User) { throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', $user::class)); } @@ -49,8 +52,10 @@ public function upgradePassword(PasswordAuthenticatedUserInterface $user, string $this->add($user); } - public function checkConfirmationToken(string $confirmationToken): ?User - { + public function checkConfirmationToken( + #[\SensitiveParameter] + string $confirmationToken, + ): ?User { $expirationCheck = new DateTime(); $validDuration = new DateInterval('P2D'); // 48 hours $expirationCheck->sub($validDuration); @@ -68,8 +73,10 @@ public function checkConfirmationToken(string $confirmationToken): ?User } } - public function checkResetToken(string $resetToken): ?User - { + public function checkResetToken( + #[\SensitiveParameter] + string $resetToken, + ): ?User { $expirationCheck = new DateTime(); $validDuration = new DateInterval('PT4H'); // 4 hours $expirationCheck->sub($validDuration); @@ -96,7 +103,7 @@ public function getAllFilteredUsers(FilterDataTransferObject $filter): Paginator { $queryBuilder = $this->createQueryBuilder('u'); - if (isset($filter->term)) { + if (!is_null($filter->term) && trim($filter->term) !== '') { $queryBuilder ->where('u.email LIKE :term') ->setParameter('term', '%' . $filter->term . '%'); diff --git a/src/Security/AuthenticationEntryPoint.php b/src/Security/AuthenticationEntryPoint.php index ee6bb1b..d4bb6e6 100644 --- a/src/Security/AuthenticationEntryPoint.php +++ b/src/Security/AuthenticationEntryPoint.php @@ -2,7 +2,6 @@ namespace App\Security; -use App\Controller\User\LoginController; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Session\FlashBagAwareSessionInterface; diff --git a/src/Security/CustomAuthenticator.php b/src/Security/CustomAuthenticator.php index 691dfc4..304b442 100644 --- a/src/Security/CustomAuthenticator.php +++ b/src/Security/CustomAuthenticator.php @@ -49,9 +49,14 @@ public function authenticate(Request $request): Passport ); } - public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response - { - if ($targetPath = $this->getTargetPath($request->getSession(), $firewallName)) { + public function onAuthenticationSuccess( + Request $request, + #[\SensitiveParameter] + TokenInterface $token, + string $firewallName, + ): ?Response { + $targetPath = $this->getTargetPath($request->getSession(), $firewallName); + if ($targetPath) { return new RedirectResponse($targetPath); } diff --git a/src/Security/UserChecker.php b/src/Security/UserChecker.php index 067fa26..0ab6088 100644 --- a/src/Security/UserChecker.php +++ b/src/Security/UserChecker.php @@ -48,8 +48,11 @@ public function checkPreAuth(UserInterface $user): void } } - public function checkPostAuth(UserInterface $user, ?TokenInterface $token = null): void - { + public function checkPostAuth( + UserInterface $user, + #[\SensitiveParameter] + ?TokenInterface $token = null, + ): void { if (!$user instanceof User) { return; } diff --git a/src/ValueObject/User/Role.php b/src/ValueObject/User/Role.php index 40ba907..7644cd2 100644 --- a/src/ValueObject/User/Role.php +++ b/src/ValueObject/User/Role.php @@ -21,7 +21,7 @@ public function __construct( private function validate(): void { - if (!in_array($this->role, self::ALL)) { + if (!in_array($this->role, self::ALL, true)) { throw new InvalidRoleException($this->role); } } diff --git a/tests/Entity/User/UserTest.php b/tests/Entity/User/UserTest.php index 81302a4..4c89911 100644 --- a/tests/Entity/User/UserTest.php +++ b/tests/Entity/User/UserTest.php @@ -12,41 +12,41 @@ public function testUserIsUpdated(): void $user = new User('user@example.com', ['ROLE_ADMIN']); $user->update('user-altered@example.com', ['ROLE_USER']); - $this->assertSame('user-altered@example.com', $user->getEmail()); - $this->assertSame(['ROLE_USER'], $user->getRoles()); + static::assertSame('user-altered@example.com', $user->getEmail()); + static::assertSame(['ROLE_USER'], $user->getRoles()); } public function testUsernameIsSameAsEmail(): void { $user = new User('user@example.com', ['ROLE_ADMIN']); - $this->assertSame('user@example.com', $user->getUsername()); - $this->assertSame('user@example.com', $user->getOriginUsername()); + static::assertSame('user@example.com', $user->getUsername()); + static::assertSame('user@example.com', $user->getOriginUsername()); } public function testUserIdentifierIsSameAsEmail(): void { $user = new User('user@example.com', ['ROLE_ADMIN']); - $this->assertSame('user@example.com', $user->getUserIdentifier()); + static::assertSame('user@example.com', $user->getUserIdentifier()); } public function testDisplayRolesForAdmin(): void { $user = new User('user@example.com', ['ROLE_ADMIN']); - $this->assertEquals(['admin', 'user'], $user->getDisplayRoles()); + static::assertEquals(['admin', 'user'], $user->getDisplayRoles()); } public function testDisplayRolesForUser(): void { $user = new User('user@example.com', []); - $this->assertEquals(['user'], $user->getDisplayRoles()); + static::assertEquals(['user'], $user->getDisplayRoles()); $user = new User('user@example.com', ['ROLE_USER']); - $this->assertEquals(['user'], $user->getDisplayRoles()); + static::assertEquals(['user'], $user->getDisplayRoles()); } public function testPropertiesAfterConfirm(): void @@ -55,18 +55,18 @@ public function testPropertiesAfterConfirm(): void $user->requestConfirmation(); $user->confirm(); - $this->assertNull($user->getConfirmationToken()); - $this->assertNull($user->getConfirmationRequestedAt()); - $this->assertEqualsWithDelta($user->getConfirmedAt(), new \DateTimeImmutable(), 1); - $this->assertTrue($user->isEnabled()); - $this->assertTrue($user->isConfirmed()); + static::assertNull($user->getConfirmationToken()); + static::assertNull($user->getConfirmationRequestedAt()); + static::assertEqualsWithDelta($user->getConfirmedAt(), new \DateTimeImmutable(), 1); + static::assertTrue($user->isEnabled()); + static::assertTrue($user->isConfirmed()); } public function testUserIsDisabledByDefault(): void { $user = new User('user@example.com', ['ROLE_ADMIN']); - $this->assertFalse($user->isEnabled()); + static::assertFalse($user->isEnabled()); } public function testUserIsEnabledAfterEnable(): void @@ -74,7 +74,7 @@ public function testUserIsEnabledAfterEnable(): void $user = new User('user@example.com', ['ROLE_ADMIN']); $user->enable(); - $this->assertTrue($user->isEnabled()); + static::assertTrue($user->isEnabled()); } public function testUserIsDisabledAfterDisable(): void @@ -82,6 +82,6 @@ public function testUserIsDisabledAfterDisable(): void $user = new User('user@example.com', ['ROLE_ADMIN']); $user->disable(); - $this->assertFalse($user->isEnabled()); + static::assertFalse($user->isEnabled()); } } diff --git a/tests/MessageHandler/User/ChangePasswordHandlerTest.php b/tests/MessageHandler/User/ChangePasswordHandlerTest.php index 86a2f12..e715f92 100644 --- a/tests/MessageHandler/User/ChangePasswordHandlerTest.php +++ b/tests/MessageHandler/User/ChangePasswordHandlerTest.php @@ -34,6 +34,7 @@ private function changePassword(): void $this->userRepository->add($user); $message = new ChangePassword($user->getId()); + // @mago-expect lint:no-literal-password $message->password = 'new_password'; $handler = new ChangePasswordHandler( @@ -48,7 +49,7 @@ public function testPasswordIsChanged(): void $this->changePassword(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertIsString($user->getPassword()); + static::assertIsString($user->getPassword()); } public function testPasswordResetTokenIsCleared(): void @@ -56,7 +57,7 @@ public function testPasswordResetTokenIsCleared(): void $this->changePassword(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertNull($user->getPasswordResetToken()); + static::assertNull($user->getPasswordResetToken()); } public function testPasswordRequestedAtIsCleared(): void @@ -64,6 +65,6 @@ public function testPasswordRequestedAtIsCleared(): void $this->changePassword(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertNull($user->getPasswordRequestedAt()); + static::assertNull($user->getPasswordRequestedAt()); } } diff --git a/tests/MessageHandler/User/ConfirmUserHandlerTest.php b/tests/MessageHandler/User/ConfirmUserHandlerTest.php index 057ebd2..a5ba870 100644 --- a/tests/MessageHandler/User/ConfirmUserHandlerTest.php +++ b/tests/MessageHandler/User/ConfirmUserHandlerTest.php @@ -39,7 +39,7 @@ public function testUserIsEnabled(): void $this->confirmUser(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertTrue($user->isEnabled()); + static::assertTrue($user->isEnabled()); } public function testConfirmedAtIsSet(): void @@ -47,7 +47,7 @@ public function testConfirmedAtIsSet(): void $this->confirmUser(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertEqualsWithDelta($user->getConfirmedAt(), new \DateTimeImmutable(), 1); + static::assertEqualsWithDelta($user->getConfirmedAt(), new \DateTimeImmutable(), 1); } public function testConfirmationRequestedAtIsCleared(): void @@ -55,7 +55,7 @@ public function testConfirmationRequestedAtIsCleared(): void $this->confirmUser(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertNull($user->getConfirmationRequestedAt()); + static::assertNull($user->getConfirmationRequestedAt()); } public function testConformationTokenIsCleared(): void @@ -63,6 +63,6 @@ public function testConformationTokenIsCleared(): void $this->confirmUser(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertNull($user->getConfirmationToken()); + static::assertNull($user->getConfirmationToken()); } } diff --git a/tests/MessageHandler/User/CreateUserHandlerTest.php b/tests/MessageHandler/User/CreateUserHandlerTest.php index 470c43f..9c9caae 100644 --- a/tests/MessageHandler/User/CreateUserHandlerTest.php +++ b/tests/MessageHandler/User/CreateUserHandlerTest.php @@ -43,9 +43,9 @@ public function testUserIsCreatedWithCorrectData(): void $this->createUser(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertInstanceOf(User::class, $user); - $this->assertEquals('user@example.com', $user->getEmail()); - $this->assertContains('ROLE_USER', $user->getRoles()); + static::assertInstanceOf(User::class, $user); + static::assertSame('user@example.com', $user->getEmail()); + static::assertContains('ROLE_USER', $user->getRoles()); } public function testUserPasswordResetTokenIsGenerated(): void @@ -53,8 +53,8 @@ public function testUserPasswordResetTokenIsGenerated(): void $this->createUser(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertIsString($user->getPasswordResetToken()); - $this->assertEqualsWithDelta($user->getPasswordRequestedAt(), new \DateTimeImmutable(), 1); + static::assertIsString($user->getPasswordResetToken()); + static::assertEqualsWithDelta($user->getPasswordRequestedAt(), new \DateTimeImmutable(), 1); } public function testUserConfirmationTokenIsGenerated(): void @@ -63,7 +63,7 @@ public function testUserConfirmationTokenIsGenerated(): void $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); // this is actually done by SendConfirmationHandler - $this->assertIsString($user->getConfirmationToken()); - $this->assertEqualsWithDelta($user->getConfirmationRequestedAt(), new \DateTimeImmutable(), 1); + static::assertIsString($user->getConfirmationToken()); + static::assertEqualsWithDelta($user->getConfirmationRequestedAt(), new \DateTimeImmutable(), 1); } } diff --git a/tests/MessageHandler/User/Disable2FaHandlerTest.php b/tests/MessageHandler/User/Disable2FaHandlerTest.php index 97dbfe5..ec1a23f 100644 --- a/tests/MessageHandler/User/Disable2FaHandlerTest.php +++ b/tests/MessageHandler/User/Disable2FaHandlerTest.php @@ -39,7 +39,7 @@ public function testTotpIsNotEnabled(): void $this->disable2fa(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertFalse($user->isTotpAuthenticationEnabled()); + static::assertFalse($user->isTotpAuthenticationEnabled()); } public function testHasNoBackupCodes(): void @@ -47,6 +47,6 @@ public function testHasNoBackupCodes(): void $this->disable2fa(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertEmpty($user->getBackupCodes()); + static::assertEmpty($user->getBackupCodes()); } } diff --git a/tests/MessageHandler/User/DisableUserHandlerTest.php b/tests/MessageHandler/User/DisableUserHandlerTest.php index af41bc4..00ec5d2 100644 --- a/tests/MessageHandler/User/DisableUserHandlerTest.php +++ b/tests/MessageHandler/User/DisableUserHandlerTest.php @@ -37,6 +37,6 @@ public function testUserIsDisabled(): void $this->disableUser(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertFalse($user->isEnabled()); + static::assertFalse($user->isEnabled()); } } diff --git a/tests/MessageHandler/User/Enable2FaHandlerTest.php b/tests/MessageHandler/User/Enable2FaHandlerTest.php index 1b81e22..635659e 100644 --- a/tests/MessageHandler/User/Enable2FaHandlerTest.php +++ b/tests/MessageHandler/User/Enable2FaHandlerTest.php @@ -37,7 +37,7 @@ public function testTotpIsEnabled(): void $this->enable2fa(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertTrue($user->isTotpAuthenticationEnabled()); + static::assertTrue($user->isTotpAuthenticationEnabled()); } public function testHasBackupCodes(): void @@ -45,7 +45,7 @@ public function testHasBackupCodes(): void $this->enable2fa(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertNotEmpty($user->getBackupCodes()); - $this->assertCount(6, $user->getBackupCodes()); + static::assertNotEmpty($user->getBackupCodes()); + static::assertCount(6, $user->getBackupCodes()); } } diff --git a/tests/MessageHandler/User/EnableUserHandlerTest.php b/tests/MessageHandler/User/EnableUserHandlerTest.php index 9901325..2d19209 100644 --- a/tests/MessageHandler/User/EnableUserHandlerTest.php +++ b/tests/MessageHandler/User/EnableUserHandlerTest.php @@ -37,6 +37,6 @@ public function testUserIsEnabled(): void $this->enableUser(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertTrue($user->isEnabled()); + static::assertTrue($user->isEnabled()); } } diff --git a/tests/MessageHandler/User/RegisterUserHandlerTest.php b/tests/MessageHandler/User/RegisterUserHandlerTest.php index 4651232..437345c 100644 --- a/tests/MessageHandler/User/RegisterUserHandlerTest.php +++ b/tests/MessageHandler/User/RegisterUserHandlerTest.php @@ -32,6 +32,7 @@ private function registerUser(): void $message = new RegisterUser(); $message->email = 'user@example.com'; $message->roles = ['ROLE_USER']; + // @mago-expect lint:no-literal-password $message->password = 'password'; $message->locale = 'nl'; @@ -48,9 +49,9 @@ public function testUserIsCreatedWithCorrectData(): void $this->registerUser(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertInstanceOf(User::class, $user); - $this->assertEquals('user@example.com', $user->getEmail()); - $this->assertContains('ROLE_USER', $user->getRoles()); + static::assertInstanceOf(User::class, $user); + static::assertSame('user@example.com', $user->getEmail()); + static::assertContains('ROLE_USER', $user->getRoles()); } public function testUserConfirmationTokenIsGenerated(): void @@ -59,17 +60,17 @@ public function testUserConfirmationTokenIsGenerated(): void $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); // this is actually done by SendConfirmationHandler - $this->assertIsString($user->getConfirmationToken()); - $this->assertEqualsWithDelta($user->getConfirmationRequestedAt(), new \DateTimeImmutable(), 1); + static::assertIsString($user->getConfirmationToken()); + static::assertEqualsWithDelta($user->getConfirmationRequestedAt(), new \DateTimeImmutable(), 1); } public function testEmailIsSent(): void { $this->registerUser(); - $this->assertEmailCount(1); + static::assertEmailCount(1); $email = $this->getMailerMessage(0); - $this->assertEmailHeaderSame( + static::assertEmailHeaderSame( $email, 'To', '"user@example.com" ', @@ -81,9 +82,9 @@ public function testEmailContainsConfirmationToken(): void $this->registerUser(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertEmailCount(1); + static::assertEmailCount(1); $email = $this->getMailerMessage(0); - $this->assertEmailTextBodyContains($email, $user->getConfirmationToken()); - $this->assertEmailHtmlBodyContains($email, $user->getConfirmationToken()); + static::assertEmailTextBodyContains($email, $user->getConfirmationToken()); + static::assertEmailHtmlBodyContains($email, $user->getConfirmationToken()); } } diff --git a/tests/MessageHandler/User/ResetPasswordHandlerTest.php b/tests/MessageHandler/User/ResetPasswordHandlerTest.php index 6d397a3..4b32624 100644 --- a/tests/MessageHandler/User/ResetPasswordHandlerTest.php +++ b/tests/MessageHandler/User/ResetPasswordHandlerTest.php @@ -30,6 +30,7 @@ private function resetPassword(): void $this->userRepository->add($user); $message = new ResetPassword($user->getId()); + // @mago-expect lint:no-literal-password $message->password = 'new_password'; $handler = new ResetPasswordHandler( @@ -44,7 +45,7 @@ public function testPasswordIsChanged(): void $this->resetPassword(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertTrue($this->passwordHasher->isPasswordValid($user, 'new_password')); + static::assertTrue($this->passwordHasher->isPasswordValid($user, 'new_password')); } public function testPasswordResetTokenIsCleared(): void @@ -52,7 +53,7 @@ public function testPasswordResetTokenIsCleared(): void $this->resetPassword(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertNull($user->getPasswordResetToken()); + static::assertNull($user->getPasswordResetToken()); } public function testPasswordRequestedAtIsCleared(): void @@ -60,6 +61,6 @@ public function testPasswordRequestedAtIsCleared(): void $this->resetPassword(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertNull($user->getPasswordRequestedAt()); + static::assertNull($user->getPasswordRequestedAt()); } } diff --git a/tests/MessageHandler/User/SendConfirmationHandlerTest.php b/tests/MessageHandler/User/SendConfirmationHandlerTest.php index 9f7321b..3fb0742 100644 --- a/tests/MessageHandler/User/SendConfirmationHandlerTest.php +++ b/tests/MessageHandler/User/SendConfirmationHandlerTest.php @@ -4,9 +4,7 @@ use App\Entity\User\User; use App\Message\User\SendConfirmation; -use App\Message\User\SendPasswordReset; use App\MessageHandler\User\SendConfirmationHandler; -use App\MessageHandler\User\SendPasswordResetHandler; use App\Repository\User\UserRepository; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\Component\Mailer\MailerInterface; @@ -53,17 +51,17 @@ public function testUserConfirmationTokenIsGenerated(): void $this->sendConfirmation(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertIsString($user->getConfirmationToken()); - $this->assertEqualsWithDelta($user->getConfirmationRequestedAt(), new \DateTimeImmutable(), 1); + static::assertIsString($user->getConfirmationToken()); + static::assertEqualsWithDelta($user->getConfirmationRequestedAt(), new \DateTimeImmutable(), 1); } public function testEmailIsSent(): void { $this->sendConfirmation(); - $this->assertEmailCount(1); + static::assertEmailCount(1); $email = $this->getMailerMessage(0); - $this->assertEmailHeaderSame( + static::assertEmailHeaderSame( $email, 'To', '"user@example.com" ', @@ -75,9 +73,9 @@ public function testEmailContainsConfirmationToken(): void $this->sendConfirmation(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertEmailCount(1); + static::assertEmailCount(1); $email = $this->getMailerMessage(0); - $this->assertEmailTextBodyContains($email, $user->getConfirmationToken()); - $this->assertEmailHtmlBodyContains($email, $user->getConfirmationToken()); + static::assertEmailTextBodyContains($email, $user->getConfirmationToken()); + static::assertEmailHtmlBodyContains($email, $user->getConfirmationToken()); } } diff --git a/tests/MessageHandler/User/SendPasswordResetHandlerTest.php b/tests/MessageHandler/User/SendPasswordResetHandlerTest.php index a72afb8..7f5555d 100644 --- a/tests/MessageHandler/User/SendPasswordResetHandlerTest.php +++ b/tests/MessageHandler/User/SendPasswordResetHandlerTest.php @@ -52,17 +52,17 @@ public function testUserPasswordResetTokenIsGenerated(): void $this->sendPasswordReset(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertIsString($user->getPasswordResetToken()); - $this->assertEqualsWithDelta($user->getPasswordRequestedAt(), new \DateTimeImmutable(), 1); + static::assertIsString($user->getPasswordResetToken()); + static::assertEqualsWithDelta($user->getPasswordRequestedAt(), new \DateTimeImmutable(), 1); } public function testEmailIsSent(): void { $this->sendPasswordReset(); - $this->assertEmailCount(1); + static::assertEmailCount(1); $email = $this->getMailerMessage(0); - $this->assertEmailHeaderSame( + static::assertEmailHeaderSame( $email, 'To', '"user@example.com" ', @@ -74,9 +74,9 @@ public function testEmailContainsResetToken(): void $this->sendPasswordReset(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertEmailCount(1); + static::assertEmailCount(1); $email = $this->getMailerMessage(0); - $this->assertEmailTextBodyContains($email, $user->getPasswordResetToken()); - $this->assertEmailHtmlBodyContains($email, $user->getPasswordResetToken()); + static::assertEmailTextBodyContains($email, $user->getPasswordResetToken()); + static::assertEmailHtmlBodyContains($email, $user->getPasswordResetToken()); } } diff --git a/tests/MessageHandler/User/UpdateUserHandlerTest.php b/tests/MessageHandler/User/UpdateUserHandlerTest.php index d9e9bba..8a77241 100644 --- a/tests/MessageHandler/User/UpdateUserHandlerTest.php +++ b/tests/MessageHandler/User/UpdateUserHandlerTest.php @@ -39,7 +39,7 @@ public function testEmailIsUpdated(): void $this->updateUser(); $user = $this->userRepository->findOneBy(['email' => 'updated@example.com']); - $this->assertEquals('updated@example.com', $user->getEmail()); + static::assertSame('updated@example.com', $user->getEmail()); } public function testRolesAreUpdated(): void @@ -47,7 +47,7 @@ public function testRolesAreUpdated(): void $this->updateUser(); $user = $this->userRepository->findOneBy(['email' => 'updated@example.com']); - $this->assertContains('ROLE_USER', $user->getRoles()); - $this->assertNotContains('ROLE_ADMIN', $user->getRoles()); + static::assertContains('ROLE_USER', $user->getRoles()); + static::assertNotContains('ROLE_ADMIN', $user->getRoles()); } } diff --git a/tests/Repository/User/UserRepositoryTest.php b/tests/Repository/User/UserRepositoryTest.php index d8e07cd..10134a1 100644 --- a/tests/Repository/User/UserRepositoryTest.php +++ b/tests/Repository/User/UserRepositoryTest.php @@ -31,16 +31,16 @@ public function testAddUserWithRoleAdmin(): void $this->userRepository->add($newUser); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); - $this->assertInstanceOf(User::class, $user); - $this->assertSame('user@example.com', $user->getEmail()); - $this->assertContains('ROLE_ADMIN', $user->getRoles()); + static::assertInstanceOf(User::class, $user); + static::assertSame('user@example.com', $user->getEmail()); + static::assertContains('ROLE_ADMIN', $user->getRoles()); } public function testUpgradePasswordWithUserInstance(): void { $newUser = new User('user@example.com', ['ROLE_ADMIN']); $this->userRepository->upgradePassword($newUser, 'super-secret-password'); - $this->assertSame($newUser->getPassword(), 'super-secret-password'); + static::assertSame($newUser->getPassword(), 'super-secret-password'); } public function testUpgradePasswordWithInvalidUserInstance(): void @@ -58,15 +58,15 @@ public function testCheckConfirmationTokenWithValidToken(): void $this->userRepository->save(); $user = $this->userRepository->checkConfirmationToken($newUser->getConfirmationToken()); - $this->assertInstanceOf(User::class, $user); - $this->assertSame('user@example.com', $user->getEmail()); + static::assertInstanceOf(User::class, $user); + static::assertSame('user@example.com', $user->getEmail()); } public function testCheckConfirmationTokenWithInvalidToken(): void { $user = $this->userRepository->checkConfirmationToken('non-existing-token'); - $this->assertNull($user); + static::assertNull($user); } public function testCheckResetTokenWithValidToken(): void @@ -77,16 +77,16 @@ public function testCheckResetTokenWithValidToken(): void $this->userRepository->save(); $user = $this->userRepository->checkResetToken($newUser->getPasswordResetToken()); - $this->assertInstanceOf(User::class, $user); - $this->assertSame('user@example.com', $user->getEmail()); - $this->assertEqualsWithDelta($user->getPasswordRequestedAt(), new \DateTimeImmutable(), 1); + static::assertInstanceOf(User::class, $user); + static::assertSame('user@example.com', $user->getEmail()); + static::assertEqualsWithDelta($user->getPasswordRequestedAt(), new \DateTimeImmutable(), 1); } public function testCheckResetTokenWithInvalidToken(): void { $user = $this->userRepository->checkResetToken('non-existing-token'); - $this->assertNull($user); + static::assertNull($user); } public function testFilterForExistingUser(): void @@ -101,9 +101,9 @@ public function testFilterForExistingUser(): void $paginator = $this->userRepository->getAllFilteredUsers($userFilter); $paginator->paginate(); - $this->assertSame(1, $paginator->count()); - $this->assertInstanceOf(User::class, $paginator->getResults()[0]); - $this->assertSame('user@example.com', $paginator->getResults()[0]->getEmail()); + static::assertSame(1, $paginator->count()); + static::assertInstanceOf(User::class, $paginator->getResults()[0]); + static::assertSame('user@example.com', $paginator->getResults()[0]->getEmail()); } public function testFilterWithoutTerm(): void @@ -117,10 +117,10 @@ public function testFilterWithoutTerm(): void $paginator = $this->userRepository->getAllFilteredUsers($userFilter); $paginator->paginate(); - $this->assertSame(2, $paginator->count()); - $this->assertInstanceOf(User::class, $paginator->getResults()[0]); - $this->assertSame('user@example.com', $paginator->getResults()[0]->getEmail()); - $this->assertInstanceOf(User::class, $paginator->getResults()[1]); - $this->assertSame('other-user@example.com', $paginator->getResults()[1]->getEmail()); + static::assertSame(2, $paginator->count()); + static::assertInstanceOf(User::class, $paginator->getResults()[0]); + static::assertSame('user@example.com', $paginator->getResults()[0]->getEmail()); + static::assertInstanceOf(User::class, $paginator->getResults()[1]); + static::assertSame('other-user@example.com', $paginator->getResults()[1]->getEmail()); } } diff --git a/tests/Security/UserCheckerTest.php b/tests/Security/UserCheckerTest.php index 4a8579c..4881387 100644 --- a/tests/Security/UserCheckerTest.php +++ b/tests/Security/UserCheckerTest.php @@ -53,7 +53,7 @@ public function testPostAuthErasesPasswordResetToken(): void $this->userChecker->checkPostAuth($user); - $this->assertNull($user->getPasswordResetToken()); - $this->assertNull($user->getPasswordRequestedAt()); + static::assertNull($user->getPasswordResetToken()); + static::assertNull($user->getPasswordRequestedAt()); } } diff --git a/tests/Validator/User/UniqueEmailValidatorTest.php b/tests/Validator/User/UniqueEmailValidatorTest.php index 8d5fa78..46ebeb4 100644 --- a/tests/Validator/User/UniqueEmailValidatorTest.php +++ b/tests/Validator/User/UniqueEmailValidatorTest.php @@ -10,11 +10,8 @@ use App\Repository\User\UserRepository; use App\Validator\User\UniqueEmail; use App\Validator\User\UniqueEmailValidator; -use Doctrine\ORM\EntityManager; -use Doctrine\ORM\Tools\SchemaTool; use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; -use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\Validator\Context\ExecutionContext; use Symfony\Component\Validator\Exception\UnexpectedValueException; diff --git a/tests/ValueObject/User/RoleTest.php b/tests/ValueObject/User/RoleTest.php index a3315c6..0162bc0 100644 --- a/tests/ValueObject/User/RoleTest.php +++ b/tests/ValueObject/User/RoleTest.php @@ -14,23 +14,23 @@ public function testToStringReturnsRole(): void { $role = new Role(Role::user()); - $this->assertSame(Role::user(), (string) $role); + static::assertSame(Role::user(), (string) $role); } public function testGetValueReturnsRole(): void { $role = new Role(Role::user()); - $this->assertSame(Role::user(), $role->getValue()); + static::assertSame(Role::user(), $role->getValue()); } public function testGetChoicesReturnsDefinedChoices(): void { $choices = Role::getChoices(); - $this->assertIsArray($choices); - $this->assertArrayHasKey('admin', $choices); - $this->assertSame('ROLE_ADMIN', $choices['admin']); + static::assertIsArray($choices); + static::assertArrayHasKey('admin', $choices); + static::assertSame('ROLE_ADMIN', $choices['admin']); } public function testThrowsExceptionForInvalidRole(): void From d79689639bbb7a0ea572ccb3cc95c99e2b5139c9 Mon Sep 17 00:00:00 2001 From: Tijs Verkoyen Date: Mon, 13 Jul 2026 17:03:19 +0200 Subject: [PATCH 5/8] chore: fix mago analyse issues --- src/Command/User/CreateCommand.php | 3 +- .../User/Admin/EditUserController.php | 1 + .../User/Admin/OverviewController.php | 5 +++- .../User/Ajax/PasswordStrengthController.php | 8 ++++- .../User/ForgotPasswordController.php | 1 + .../User/Profile/EmailController.php | 1 + .../User/Profile/PasswordController.php | 1 + .../User/Profile/TwoFactorController.php | 7 +++-- .../Profile/TwoFactorQrCodeController.php | 4 +-- src/Controller/User/RegisterController.php | 4 +-- .../User/ResetPasswordController.php | 1 + .../User/UserDataTransferObject.php | 5 +++- src/Entity/User/User.php | 30 ++++++++++++++----- src/EventListener/MenuListener.php | 2 +- src/Form/User/Admin/ChangePasswordType.php | 4 +-- src/Form/User/Admin/UserType.php | 4 +-- src/Form/User/LoginType.php | 3 +- src/Message/User/ChangeEmail.php | 5 ++++ src/Security/CustomAuthenticator.php | 2 +- src/Validator/User/UserTotpCodeValidator.php | 4 +-- .../User/ChangePasswordHandlerTest.php | 1 + .../User/ConfirmUserHandlerTest.php | 1 + .../User/CreateUserHandlerTest.php | 1 + .../User/Disable2FaHandlerTest.php | 3 +- .../User/DisableUserHandlerTest.php | 1 + .../User/Enable2FaHandlerTest.php | 2 ++ .../User/EnableUserHandlerTest.php | 1 + .../User/RegisterUserHandlerTest.php | 15 ++++++++-- .../User/ResetPasswordHandlerTest.php | 2 ++ .../User/SendConfirmationHandlerTest.php | 15 ++++++++-- .../User/SendPasswordResetHandlerTest.php | 11 +++++-- .../User/UpdateUserHandlerTest.php | 3 ++ tests/Repository/User/UserRepositoryTest.php | 28 +++++++++++------ .../User/UniqueEmailValidatorTest.php | 2 +- 34 files changed, 136 insertions(+), 45 deletions(-) diff --git a/src/Command/User/CreateCommand.php b/src/Command/User/CreateCommand.php index 02205c7..c329eb1 100644 --- a/src/Command/User/CreateCommand.php +++ b/src/Command/User/CreateCommand.php @@ -22,6 +22,7 @@ public function __construct( } /** + * @param non-empty-string $email * @param array $roles */ public function __invoke( @@ -41,7 +42,7 @@ public function __invoke( $constraints = $this->validator->validate($message); if ($constraints->count() > 0) { foreach ($constraints as $constraint) { - $io->error($constraint->getPropertyPath() . ': ' . $constraint->getMessage()); + $io->error($constraint->getPropertyPath() . ': ' . (string) $constraint->getMessage()); } return Command::FAILURE; diff --git a/src/Controller/User/Admin/EditUserController.php b/src/Controller/User/Admin/EditUserController.php index dfbe13d..ad89c79 100644 --- a/src/Controller/User/Admin/EditUserController.php +++ b/src/Controller/User/Admin/EditUserController.php @@ -44,6 +44,7 @@ public function __invoke( $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { + // @mago-expect analysis:mixed-argument $this->messageBus->dispatch($form->getData()); $this->addFlash( diff --git a/src/Controller/User/Admin/OverviewController.php b/src/Controller/User/Admin/OverviewController.php index 71e2fb1..d763504 100644 --- a/src/Controller/User/Admin/OverviewController.php +++ b/src/Controller/User/Admin/OverviewController.php @@ -29,7 +29,10 @@ public function __invoke(Request $request, #[MapQueryParameter] int $page = 1): ); $form->handleRequest($request); - $paginatedUsers = $this->userRepository->getAllFilteredUsers($form->getData()); + /** @var FilterDataTransferObject $filter */ + $filter = $form->getData(); + + $paginatedUsers = $this->userRepository->getAllFilteredUsers($filter); $paginatedUsers->paginate($page); return $this->render( diff --git a/src/Controller/User/Ajax/PasswordStrengthController.php b/src/Controller/User/Ajax/PasswordStrengthController.php index fa8153b..5d40d84 100644 --- a/src/Controller/User/Ajax/PasswordStrengthController.php +++ b/src/Controller/User/Ajax/PasswordStrengthController.php @@ -17,7 +17,13 @@ final class PasswordStrengthController extends AbstractController { public function __invoke(Request $request): Response { - $password = json_decode($request->getContent(), true)['password'] ?? ''; + try { + // @mago-expect analysis:mixed-assignment + $data = json_decode($request->getContent(), true, 512, JSON_THROW_ON_ERROR); + $password = (string) ($data['password'] ?? ''); + } catch (\JsonException) { + $password = ''; + } return $this->json([ 'strength' => PasswordStrengthValidator::estimateStrength($password), diff --git a/src/Controller/User/ForgotPasswordController.php b/src/Controller/User/ForgotPasswordController.php index fa1cc75..ee09c11 100644 --- a/src/Controller/User/ForgotPasswordController.php +++ b/src/Controller/User/ForgotPasswordController.php @@ -26,6 +26,7 @@ public function __invoke(Request $request): Response $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { + // @mago-expect analysis:mixed-argument $this->messageBus->dispatch($form->getData()); $this->addFlash( diff --git a/src/Controller/User/Profile/EmailController.php b/src/Controller/User/Profile/EmailController.php index 7b93073..9a1abec 100644 --- a/src/Controller/User/Profile/EmailController.php +++ b/src/Controller/User/Profile/EmailController.php @@ -37,6 +37,7 @@ public function __invoke( $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { + // @mago-expect analysis:mixed-argument $this->messageBus->dispatch($form->getData()); $this->addFlash( diff --git a/src/Controller/User/Profile/PasswordController.php b/src/Controller/User/Profile/PasswordController.php index 1f325f4..b662111 100644 --- a/src/Controller/User/Profile/PasswordController.php +++ b/src/Controller/User/Profile/PasswordController.php @@ -33,6 +33,7 @@ public function __invoke( $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { + // @mago-expect analysis:mixed-argument $this->messageBus->dispatch($form->getData()); $this->addFlash( diff --git a/src/Controller/User/Profile/TwoFactorController.php b/src/Controller/User/Profile/TwoFactorController.php index 6f305d1..a201906 100644 --- a/src/Controller/User/Profile/TwoFactorController.php +++ b/src/Controller/User/Profile/TwoFactorController.php @@ -39,11 +39,11 @@ public function __invoke( $showBackupCodes = false; if (!$is2FaEnabled) { - if (!$session->has('2fa_secret')) { + if (!$session->has('2fa_secret') || trim((string) $session->get('2fa_secret')) === '') { $secret = $this->totpAuthenticator->generateSecret(); $session->set('2fa_secret', $secret); } - $secret = $session->get('2fa_secret'); + $secret = (string) $session->get('2fa_secret'); $message = new Enable2Fa($user, $secret); $enable2FaForm = $this->createForm(Enable2FaType::class, $message); @@ -80,7 +80,8 @@ public function __invoke( } if ($session->has('2fa_show_backup_codes')) { - $showBackupCodes = $session->get('2fa_show_backup_codes'); + // @mago-expect analysis:mixed-operand + $showBackupCodes = (bool) $session->get('2fa_show_backup_codes'); $session->remove('2fa_show_backup_codes'); } diff --git a/src/Controller/User/Profile/TwoFactorQrCodeController.php b/src/Controller/User/Profile/TwoFactorQrCodeController.php index 0329ce1..42e07f4 100644 --- a/src/Controller/User/Profile/TwoFactorQrCodeController.php +++ b/src/Controller/User/Profile/TwoFactorQrCodeController.php @@ -29,12 +29,12 @@ public function __invoke( User $user, SessionInterface $session, ): Response { - if (!$session->has('2fa_secret')) { + if (!$session->has('2fa_secret') || trim((string) $session->get('2fa_secret')) === '') { throw new BadRequestException('No secret found in session'); } $clonedUser = clone $user; - $clonedUser->setTotpSecret($session->get('2fa_secret')); + $clonedUser->setTotpSecret((string) $session->get('2fa_secret')); $builder = new Builder( writer: new SvgWriter(), data: $this->totpAuthenticator->getQRContent($clonedUser), diff --git a/src/Controller/User/RegisterController.php b/src/Controller/User/RegisterController.php index c70b60f..4c09acc 100644 --- a/src/Controller/User/RegisterController.php +++ b/src/Controller/User/RegisterController.php @@ -7,7 +7,6 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Routing\Attribute\Route; @@ -19,7 +18,7 @@ public function __construct( ) { } - public function __invoke(Request $request, SessionInterface $session): Response + public function __invoke(Request $request): Response { $registerUser = new RegisterUser(); $registerUser->locale = $request->getLocale(); @@ -27,6 +26,7 @@ public function __invoke(Request $request, SessionInterface $session): Response $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { + // @mago-expect analysis:mixed-argument $this->messageBus->dispatch($form->getData()); return $this->redirectToRoute( diff --git a/src/Controller/User/ResetPasswordController.php b/src/Controller/User/ResetPasswordController.php index a6f1b87..1ce312e 100644 --- a/src/Controller/User/ResetPasswordController.php +++ b/src/Controller/User/ResetPasswordController.php @@ -45,6 +45,7 @@ public function __invoke( $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { + // @mago-expect analysis:mixed-argument $this->messageBus->dispatch($form->getData()); $this->addFlash( diff --git a/src/DataTransferObject/User/UserDataTransferObject.php b/src/DataTransferObject/User/UserDataTransferObject.php index cc4c628..789ce92 100644 --- a/src/DataTransferObject/User/UserDataTransferObject.php +++ b/src/DataTransferObject/User/UserDataTransferObject.php @@ -9,6 +9,9 @@ class UserDataTransferObject { + /** + * @var non-empty-string $email + */ #[Email] #[NotBlank] #[UniqueEmail] @@ -16,7 +19,7 @@ class UserDataTransferObject public string $email; /** - * @var array $roles + * @var array $roles */ public array $roles = []; diff --git a/src/Entity/User/User.php b/src/Entity/User/User.php index 17f8814..dc977cd 100644 --- a/src/Entity/User/User.php +++ b/src/Entity/User/User.php @@ -66,9 +66,12 @@ class User implements private int $trustedVersion = 0; /** - * @param array $roles + * @param array $roles */ public function __construct( + /** + * @var non-empty-string + */ #[ORM\Column(type: 'string', length: 180, unique: true)] private string $email, #[ORM\Column(type: 'json')] @@ -84,7 +87,8 @@ public function __construct( } /** - * @param array $roles + * @param non-empty-string $email + * @param array $roles */ public function update( string $email, @@ -99,6 +103,9 @@ public function getId(): int return $this->id; } + /** + * @return non-empty-string + */ public function getEmail(): string { return $this->email; @@ -113,11 +120,12 @@ public function getUsername(): string } /** + * @return non-empty-string * @see UserInterface */ public function getUserIdentifier(): string { - return $this->email; // @phpstan-ignore-line return.type + return $this->email; } public function getOriginUsername(): string @@ -126,6 +134,7 @@ public function getOriginUsername(): string } /** + * @return array * @see UserInterface */ public function getRoles(): array @@ -139,11 +148,11 @@ public function getRoles(): array } /** - * @return array $roles + * @return array $roles */ public function getDisplayRoles(): array { - return array_map(static fn (string $role) => strtolower(substr($role, 5)), $this->getRoles()); + return array_map(static fn (string $role): string => strtolower(substr($role, 5)), $this->getRoles()); } /** @@ -277,6 +286,10 @@ public function getTotpAuthenticationUsername(): ?string public function getTotpAuthenticationConfiguration(): ?TotpConfigurationInterface { + if ($this->totpSecret === null) { + throw new \RuntimeException('TotpSecret is null'); + } + return new TotpConfiguration( $this->totpSecret, TotpConfiguration::ALGORITHM_SHA1, @@ -298,9 +311,9 @@ public function isBackupCode(string $code): bool return in_array($code, $this->backupCodes, true); } - public function invalidateBackupCode(string $backupCode): void + public function invalidateBackupCode(string $code): void { - $key = array_search($backupCode, $this->backupCodes, true); + $key = array_search($code, $this->backupCodes, true); if ($key !== false) { unset($this->backupCodes[$key]); } @@ -323,6 +336,9 @@ public function getTrustedTokenVersion(): int return $this->trustedVersion; } + /** + * @param non-empty-string $email + */ public function changeEmail(string $email): void { $this->email = $email; diff --git a/src/EventListener/MenuListener.php b/src/EventListener/MenuListener.php index 2f260f6..fca6dfa 100644 --- a/src/EventListener/MenuListener.php +++ b/src/EventListener/MenuListener.php @@ -35,7 +35,7 @@ public function onConfigureMenu(ConfigureMenuEvent $event): void } /** - * @return array + * @return array */ public static function getSubscribedEvents(): array { diff --git a/src/Form/User/Admin/ChangePasswordType.php b/src/Form/User/Admin/ChangePasswordType.php index 4fc916e..3587faa 100644 --- a/src/Form/User/Admin/ChangePasswordType.php +++ b/src/Form/User/Admin/ChangePasswordType.php @@ -3,12 +3,12 @@ namespace App\Form\User\Admin; use App\Form\User\RepeatedPasswordStrengthType; +use App\Message\User\ChangePassword; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; /** - * @template TData of FormBuilderInterface - * @extends AbstractType + * @extends AbstractType */ final class ChangePasswordType extends AbstractType { diff --git a/src/Form/User/Admin/UserType.php b/src/Form/User/Admin/UserType.php index 837d991..1361cea 100644 --- a/src/Form/User/Admin/UserType.php +++ b/src/Form/User/Admin/UserType.php @@ -2,6 +2,7 @@ namespace App\Form\User\Admin; +use App\DataTransferObject\User\UserDataTransferObject; use App\ValueObject\User\Role; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; @@ -9,8 +10,7 @@ use Symfony\Component\Form\FormBuilderInterface; /** - * @template TData of FormBuilderInterface - * @extends AbstractType + * @extends AbstractType */ final class UserType extends AbstractType { diff --git a/src/Form/User/LoginType.php b/src/Form/User/LoginType.php index 889a9e5..7009a0d 100644 --- a/src/Form/User/LoginType.php +++ b/src/Form/User/LoginType.php @@ -10,8 +10,7 @@ use Symfony\Component\Form\FormBuilderInterface; /** - * @template TData of FormBuilderInterface - * @extends AbstractType + * @extends AbstractType> */ final class LoginType extends AbstractType { diff --git a/src/Message/User/ChangeEmail.php b/src/Message/User/ChangeEmail.php index 9b5c23c..62cdc6c 100644 --- a/src/Message/User/ChangeEmail.php +++ b/src/Message/User/ChangeEmail.php @@ -11,9 +11,14 @@ final class ChangeEmail { public function __construct( public readonly int $userId, + /** + * @var non-empty-string $email + */ + // @phpstan-ignore parameter.defaultValue #[Assert\NotBlank] #[Assert\Email] #[UniqueEmail] + // @mago-expect analysis:invalid-parameter-default-value public string $email = '', ) { } diff --git a/src/Security/CustomAuthenticator.php b/src/Security/CustomAuthenticator.php index 304b442..9891922 100644 --- a/src/Security/CustomAuthenticator.php +++ b/src/Security/CustomAuthenticator.php @@ -20,7 +20,7 @@ class CustomAuthenticator extends AbstractLoginFormAuthenticator { use TargetPathTrait; - final public const LOGIN_ROUTE = 'login'; + final public const string LOGIN_ROUTE = 'login'; public function __construct( private readonly UrlGeneratorInterface $urlGenerator, diff --git a/src/Validator/User/UserTotpCodeValidator.php b/src/Validator/User/UserTotpCodeValidator.php index b7d14bb..2de4482 100644 --- a/src/Validator/User/UserTotpCodeValidator.php +++ b/src/Validator/User/UserTotpCodeValidator.php @@ -20,7 +20,7 @@ public function validate(mixed $value, Constraint $constraint): void if (!$constraint instanceof UserTotpCode) { throw new UnexpectedTypeException($constraint, UserTotpCode::class); } - if (null === $value || '' === $value) { + if (null === $value || '' === trim((string) $value)) { return; } @@ -32,7 +32,7 @@ public function validate(mixed $value, Constraint $constraint): void // store it temporarily in the user object so the totpAuthenticator can use it to check the code $user->setTotpSecret($message->secret); - if ($this->totpAuthenticator->checkCode($user, $value)) { + if ($this->totpAuthenticator->checkCode($user, (string) $value)) { return; } diff --git a/tests/MessageHandler/User/ChangePasswordHandlerTest.php b/tests/MessageHandler/User/ChangePasswordHandlerTest.php index e715f92..846fb8f 100644 --- a/tests/MessageHandler/User/ChangePasswordHandlerTest.php +++ b/tests/MessageHandler/User/ChangePasswordHandlerTest.php @@ -19,6 +19,7 @@ protected function setUp(): void { self::bootKernel(); + // @mago-expect analysis:mixed-property-type-coercion,mixed-method-access $this->userRepository = static::getContainer() ->get('doctrine') ->getManager() diff --git a/tests/MessageHandler/User/ConfirmUserHandlerTest.php b/tests/MessageHandler/User/ConfirmUserHandlerTest.php index a5ba870..cc66ce6 100644 --- a/tests/MessageHandler/User/ConfirmUserHandlerTest.php +++ b/tests/MessageHandler/User/ConfirmUserHandlerTest.php @@ -16,6 +16,7 @@ protected function setUp(): void { self::bootKernel(); + // @mago-expect analysis:mixed-property-type-coercion,mixed-method-access $this->userRepository = static::getContainer() ->get('doctrine') ->getManager() diff --git a/tests/MessageHandler/User/CreateUserHandlerTest.php b/tests/MessageHandler/User/CreateUserHandlerTest.php index 9c9caae..60b6724 100644 --- a/tests/MessageHandler/User/CreateUserHandlerTest.php +++ b/tests/MessageHandler/User/CreateUserHandlerTest.php @@ -17,6 +17,7 @@ class CreateUserHandlerTest extends KernelTestCase protected function setUp(): void { self::bootKernel(); + // @mago-expect analysis:mixed-property-type-coercion,mixed-method-access $this->userRepository = static::getContainer() ->get('doctrine') ->getManager() diff --git a/tests/MessageHandler/User/Disable2FaHandlerTest.php b/tests/MessageHandler/User/Disable2FaHandlerTest.php index ec1a23f..91c5125 100644 --- a/tests/MessageHandler/User/Disable2FaHandlerTest.php +++ b/tests/MessageHandler/User/Disable2FaHandlerTest.php @@ -15,6 +15,7 @@ class Disable2FaHandlerTest extends KernelTestCase protected function setUp(): void { self::bootKernel(); + // @mago-expect analysis:mixed-property-type-coercion,mixed-method-access $this->userRepository = static::getContainer() ->get('doctrine') ->getManager() @@ -28,7 +29,7 @@ private function disable2fa(): void $user->addBackupCode('backup-code-1'); $this->userRepository->add($user); - $message = new Disable2Fa($user, 'super-secret-string'); + $message = new Disable2Fa($user); $handler = new Disable2FaHandler($this->userRepository); $handler->__invoke($message); diff --git a/tests/MessageHandler/User/DisableUserHandlerTest.php b/tests/MessageHandler/User/DisableUserHandlerTest.php index 00ec5d2..a44c432 100644 --- a/tests/MessageHandler/User/DisableUserHandlerTest.php +++ b/tests/MessageHandler/User/DisableUserHandlerTest.php @@ -15,6 +15,7 @@ class DisableUserHandlerTest extends KernelTestCase protected function setUp(): void { self::bootKernel(); + // @mago-expect analysis:mixed-property-type-coercion,mixed-method-access $this->userRepository = static::getContainer() ->get('doctrine') ->getManager() diff --git a/tests/MessageHandler/User/Enable2FaHandlerTest.php b/tests/MessageHandler/User/Enable2FaHandlerTest.php index 635659e..7547bfa 100644 --- a/tests/MessageHandler/User/Enable2FaHandlerTest.php +++ b/tests/MessageHandler/User/Enable2FaHandlerTest.php @@ -15,6 +15,7 @@ class Enable2FaHandlerTest extends KernelTestCase protected function setUp(): void { self::bootKernel(); + // @mago-expect analysis:mixed-property-type-coercion,mixed-method-access $this->userRepository = static::getContainer() ->get('doctrine') ->getManager() @@ -46,6 +47,7 @@ public function testHasBackupCodes(): void $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); static::assertNotEmpty($user->getBackupCodes()); + // @mago-expect analysis:mixed-argument static::assertCount(6, $user->getBackupCodes()); } } diff --git a/tests/MessageHandler/User/EnableUserHandlerTest.php b/tests/MessageHandler/User/EnableUserHandlerTest.php index 2d19209..5e0d4f7 100644 --- a/tests/MessageHandler/User/EnableUserHandlerTest.php +++ b/tests/MessageHandler/User/EnableUserHandlerTest.php @@ -15,6 +15,7 @@ class EnableUserHandlerTest extends KernelTestCase protected function setUp(): void { self::bootKernel(); + // @mago-expect analysis:mixed-property-type-coercion,mixed-method-access $this->userRepository = static::getContainer() ->get('doctrine') ->getManager() diff --git a/tests/MessageHandler/User/RegisterUserHandlerTest.php b/tests/MessageHandler/User/RegisterUserHandlerTest.php index 437345c..cde5a8c 100644 --- a/tests/MessageHandler/User/RegisterUserHandlerTest.php +++ b/tests/MessageHandler/User/RegisterUserHandlerTest.php @@ -8,6 +8,7 @@ use App\Repository\User\UserRepository; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Mime\RawMessage; use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; class RegisterUserHandlerTest extends KernelTestCase @@ -19,6 +20,7 @@ class RegisterUserHandlerTest extends KernelTestCase protected function setUp(): void { self::bootKernel(); + // @mago-expect analysis:mixed-property-type-coercion,mixed-method-access $this->userRepository = static::getContainer() ->get('doctrine') ->getManager() @@ -70,6 +72,7 @@ public function testEmailIsSent(): void static::assertEmailCount(1); $email = $this->getMailerMessage(0); + static::assertInstanceOf(RawMessage::class, $email); static::assertEmailHeaderSame( $email, 'To', @@ -81,10 +84,18 @@ public function testEmailContainsConfirmationToken(): void { $this->registerUser(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); + // @mago-expect analysis:mixed-assignment + $confirmationToken = $user->getConfirmationToken(); + if ($confirmationToken === null) { + throw new \RuntimeException('confirmation token not found'); + } static::assertEmailCount(1); $email = $this->getMailerMessage(0); - static::assertEmailTextBodyContains($email, $user->getConfirmationToken()); - static::assertEmailHtmlBodyContains($email, $user->getConfirmationToken()); + static::assertInstanceOf(RawMessage::class, $email); + // @mago-expect analysis:mixed-argument + static::assertEmailTextBodyContains($email, $confirmationToken); + // @mago-expect analysis:mixed-argument + static::assertEmailHtmlBodyContains($email, $confirmationToken); } } diff --git a/tests/MessageHandler/User/ResetPasswordHandlerTest.php b/tests/MessageHandler/User/ResetPasswordHandlerTest.php index 4b32624..0a43795 100644 --- a/tests/MessageHandler/User/ResetPasswordHandlerTest.php +++ b/tests/MessageHandler/User/ResetPasswordHandlerTest.php @@ -17,6 +17,7 @@ class ResetPasswordHandlerTest extends KernelTestCase protected function setUp(): void { self::bootKernel(); + // @mago-expect analysis:mixed-property-type-coercion,mixed-method-access $this->userRepository = static::getContainer() ->get('doctrine') ->getManager() @@ -45,6 +46,7 @@ public function testPasswordIsChanged(): void $this->resetPassword(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); + static::assertInstanceOf(User::class, $user); static::assertTrue($this->passwordHasher->isPasswordValid($user, 'new_password')); } diff --git a/tests/MessageHandler/User/SendConfirmationHandlerTest.php b/tests/MessageHandler/User/SendConfirmationHandlerTest.php index 3fb0742..0502947 100644 --- a/tests/MessageHandler/User/SendConfirmationHandlerTest.php +++ b/tests/MessageHandler/User/SendConfirmationHandlerTest.php @@ -8,6 +8,7 @@ use App\Repository\User\UserRepository; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\Component\Mailer\MailerInterface; +use Symfony\Component\Mime\RawMessage; use Symfony\Component\Routing\RouterInterface; use Symfony\Contracts\Translation\TranslatorInterface; @@ -21,6 +22,7 @@ class SendConfirmationHandlerTest extends KernelTestCase protected function setUp(): void { self::bootKernel(); + // @mago-expect analysis:mixed-property-type-coercion,mixed-method-access $this->userRepository = static::getContainer() ->get('doctrine') ->getManager() @@ -61,6 +63,7 @@ public function testEmailIsSent(): void static::assertEmailCount(1); $email = $this->getMailerMessage(0); + static::assertInstanceOf(RawMessage::class, $email); static::assertEmailHeaderSame( $email, 'To', @@ -72,10 +75,18 @@ public function testEmailContainsConfirmationToken(): void { $this->sendConfirmation(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); + // @mago-expect analysis:mixed-assignment + $confirmationToken = $user->getConfirmationToken(); + if ($confirmationToken === null) { + throw new \RuntimeException('Confirmation token is null'); + } static::assertEmailCount(1); $email = $this->getMailerMessage(0); - static::assertEmailTextBodyContains($email, $user->getConfirmationToken()); - static::assertEmailHtmlBodyContains($email, $user->getConfirmationToken()); + static::assertInstanceOf(RawMessage::class, $email); + // @mago-expect analysis:mixed-argument + static::assertEmailTextBodyContains($email, $confirmationToken); + // @mago-expect analysis:mixed-argument + static::assertEmailHtmlBodyContains($email, $confirmationToken); } } diff --git a/tests/MessageHandler/User/SendPasswordResetHandlerTest.php b/tests/MessageHandler/User/SendPasswordResetHandlerTest.php index 7f5555d..bab6710 100644 --- a/tests/MessageHandler/User/SendPasswordResetHandlerTest.php +++ b/tests/MessageHandler/User/SendPasswordResetHandlerTest.php @@ -8,6 +8,7 @@ use App\Repository\User\UserRepository; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\Component\Mailer\MailerInterface; +use Symfony\Component\Mime\RawMessage; use Symfony\Component\Routing\RouterInterface; use Symfony\Contracts\Translation\TranslatorInterface; @@ -21,6 +22,7 @@ class SendPasswordResetHandlerTest extends KernelTestCase protected function setUp(): void { self::bootKernel(); + // @mago-expect analysis:mixed-property-type-coercion,mixed-method-access $this->userRepository = static::getContainer() ->get('doctrine') ->getManager() @@ -63,6 +65,7 @@ public function testEmailIsSent(): void static::assertEmailCount(1); $email = $this->getMailerMessage(0); static::assertEmailHeaderSame( + // @mago-expect analysis:possibly-null-argument $email, 'To', '"user@example.com" ', @@ -73,10 +76,14 @@ public function testEmailContainsResetToken(): void { $this->sendPasswordReset(); $user = $this->userRepository->findOneBy(['email' => 'user@example.com']); + // @mago-expect analysis:mixed-assignment + $passwordResetToken = $user->getPasswordResetToken(); static::assertEmailCount(1); + static::assertIsString($passwordResetToken); $email = $this->getMailerMessage(0); - static::assertEmailTextBodyContains($email, $user->getPasswordResetToken()); - static::assertEmailHtmlBodyContains($email, $user->getPasswordResetToken()); + static::assertInstanceOf(RawMessage::class, $email); + static::assertEmailTextBodyContains($email, $passwordResetToken); + static::assertEmailHtmlBodyContains($email, $passwordResetToken); } } diff --git a/tests/MessageHandler/User/UpdateUserHandlerTest.php b/tests/MessageHandler/User/UpdateUserHandlerTest.php index 8a77241..063993d 100644 --- a/tests/MessageHandler/User/UpdateUserHandlerTest.php +++ b/tests/MessageHandler/User/UpdateUserHandlerTest.php @@ -15,6 +15,7 @@ class UpdateUserHandlerTest extends KernelTestCase protected function setUp(): void { self::bootKernel(); + // @mago-expect analysis:mixed-property-type-coercion,mixed-method-access $this->userRepository = static::getContainer() ->get('doctrine') ->getManager() @@ -47,7 +48,9 @@ public function testRolesAreUpdated(): void $this->updateUser(); $user = $this->userRepository->findOneBy(['email' => 'updated@example.com']); + // @mago-expect analysis:mixed-argument static::assertContains('ROLE_USER', $user->getRoles()); + // @mago-expect analysis:mixed-argument static::assertNotContains('ROLE_ADMIN', $user->getRoles()); } } diff --git a/tests/Repository/User/UserRepositoryTest.php b/tests/Repository/User/UserRepositoryTest.php index 10134a1..c56d0f4 100644 --- a/tests/Repository/User/UserRepositoryTest.php +++ b/tests/Repository/User/UserRepositoryTest.php @@ -18,7 +18,7 @@ class UserRepositoryTest extends KernelTestCase protected function setUp(): void { self::bootKernel(); - + // @mago-expect analysis:mixed-property-type-coercion,mixed-method-access $this->userRepository = static::getContainer() ->get('doctrine') ->getManager() @@ -56,7 +56,11 @@ public function testCheckConfirmationTokenWithValidToken(): void $this->userRepository->add($newUser); $newUser->requestConfirmation(); $this->userRepository->save(); - $user = $this->userRepository->checkConfirmationToken($newUser->getConfirmationToken()); + $confirmationToken = $newUser->getConfirmationToken(); + if ($confirmationToken === null) { + throw new \RuntimeException('No confirmation token generated for the user.'); + } + $user = $this->userRepository->checkConfirmationToken($confirmationToken); static::assertInstanceOf(User::class, $user); static::assertSame('user@example.com', $user->getEmail()); @@ -75,7 +79,11 @@ public function testCheckResetTokenWithValidToken(): void $this->userRepository->add($newUser); $newUser->requestPassword(); $this->userRepository->save(); - $user = $this->userRepository->checkResetToken($newUser->getPasswordResetToken()); + $passwordResetToken = $newUser->getPasswordResetToken(); + if ($passwordResetToken === null) { + throw new \RuntimeException('No password reset token generated for the user.'); + } + $user = $this->userRepository->checkResetToken($passwordResetToken); static::assertInstanceOf(User::class, $user); static::assertSame('user@example.com', $user->getEmail()); @@ -100,10 +108,11 @@ public function testFilterForExistingUser(): void $userFilter->term = 'user@example.com'; $paginator = $this->userRepository->getAllFilteredUsers($userFilter); $paginator->paginate(); + $results = iterator_to_array($paginator->getResults()); static::assertSame(1, $paginator->count()); - static::assertInstanceOf(User::class, $paginator->getResults()[0]); - static::assertSame('user@example.com', $paginator->getResults()[0]->getEmail()); + static::assertInstanceOf(User::class, $results[0]); + static::assertSame('user@example.com', $results[0]->getEmail()); } public function testFilterWithoutTerm(): void @@ -116,11 +125,12 @@ public function testFilterWithoutTerm(): void $userFilter = new FilterDataTransferObject(); $paginator = $this->userRepository->getAllFilteredUsers($userFilter); $paginator->paginate(); + $results = iterator_to_array($paginator->getResults()); static::assertSame(2, $paginator->count()); - static::assertInstanceOf(User::class, $paginator->getResults()[0]); - static::assertSame('user@example.com', $paginator->getResults()[0]->getEmail()); - static::assertInstanceOf(User::class, $paginator->getResults()[1]); - static::assertSame('other-user@example.com', $paginator->getResults()[1]->getEmail()); + static::assertInstanceOf(User::class, $results[0]); + static::assertSame('user@example.com', $results[0]->getEmail()); + static::assertInstanceOf(User::class, $results[1]); + static::assertSame('other-user@example.com', $results[1]->getEmail()); } } diff --git a/tests/Validator/User/UniqueEmailValidatorTest.php b/tests/Validator/User/UniqueEmailValidatorTest.php index 46ebeb4..1d135c4 100644 --- a/tests/Validator/User/UniqueEmailValidatorTest.php +++ b/tests/Validator/User/UniqueEmailValidatorTest.php @@ -23,7 +23,7 @@ class UniqueEmailValidatorTest extends KernelTestCase protected function setUp(): void { self::bootKernel(); - + // @mago-expect analysis:mixed-property-type-coercion,mixed-method-access $this->userRepository = static::getContainer() ->get('doctrine') ->getManager() From 4c7151813dbfc10c5fa30bfa7fe3349c06c0c273 Mon Sep 17 00:00:00 2001 From: Tijs Verkoyen Date: Mon, 13 Jul 2026 17:05:59 +0200 Subject: [PATCH 6/8] Github actions --- .github/workflows/code-quality.yml | 133 ++++++++++++++++++++++ .github/workflows/dependency-scanning.yml | 42 +++++++ .github/workflows/install.yml | 25 ++++ 3 files changed, 200 insertions(+) create mode 100644 .github/workflows/code-quality.yml create mode 100644 .github/workflows/dependency-scanning.yml create mode 100644 .github/workflows/install.yml diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml new file mode 100644 index 0000000..b3246c9 --- /dev/null +++ b/.github/workflows/code-quality.yml @@ -0,0 +1,133 @@ +name: Code quality + +on: + push: + branches: [master] + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + install: + uses: ./.github/workflows/install.yml + + mago-fmt: + name: Mago - check code styling + needs: install + runs-on: ubuntu-latest + container: ghcr.io/carthage-software/mago:1 + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: vendor + path: vendor + - name: Check formatting + run: mago --config=./mago.dist.toml --colors=always fmt --check + - name: Show formatting diff + if: failure() + run: mago --config=./mago.dist.toml --colors=always fmt --dry-run + + mago-lint: + name: Mago - lint + needs: install + runs-on: ubuntu-latest + continue-on-error: true + container: ghcr.io/carthage-software/mago:1 + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: vendor + path: vendor + - run: mago --config=./mago.dist.toml --colors=always lint --reporting-format=rich --minimum-fail-level=warning + + mago-analyse: + name: Mago - analyse + needs: install + runs-on: ubuntu-latest + container: ghcr.io/carthage-software/mago:1 + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: vendor + path: vendor + - run: mago --config=./mago.dist.toml --colors=always analyse --reporting-format=rich --minimum-fail-level=warning + + mago-guard: + name: Mago - guard + needs: install + runs-on: ubuntu-latest + continue-on-error: true + container: ghcr.io/carthage-software/mago:1 + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: vendor + path: vendor + - run: mago --config=./mago.dist.toml --colors=always guard --reporting-format=rich --minimum-fail-level=warning + + phpcs: + name: PHP_CodeSniffer - check code styling + needs: install + runs-on: ubuntu-latest + container: sumocoders/cli-tools-php85:latest + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: vendor + path: vendor + - run: php vendor/bin/phpcs --colors --report-full -s + + phpstan: + name: PHPStan - check for bugs + needs: install + runs-on: ubuntu-latest + container: sumocoders/cli-tools-php85:latest + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: vendor + path: vendor + - run: php bin/console cache:warmup --env=dev + - run: php vendor/bin/phpstan analyse --memory-limit=-1 --no-progress --no-interaction + + twig-cs-fixer: + name: Twig-CS-Fixer - check code styling + needs: install + runs-on: ubuntu-latest + continue-on-error: true + container: sumocoders/cli-tools-php85:latest + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: vendor + path: vendor + - run: php vendor/bin/twig-cs-fixer --no-interaction lint templates/ + + stylelint: + name: Stylelint - check code styling + needs: install + runs-on: ubuntu-latest + continue-on-error: true + container: sumocoders/stylelint:latest + steps: + - uses: actions/checkout@v4 + - run: stylelint --color . + + standardjs: + name: StandardJS - check code styling + needs: install + runs-on: ubuntu-latest + continue-on-error: true + container: sumocoders/standardjs:latest + steps: + - uses: actions/checkout@v4 + - run: standard . diff --git a/.github/workflows/dependency-scanning.yml b/.github/workflows/dependency-scanning.yml new file mode 100644 index 0000000..7819dd5 --- /dev/null +++ b/.github/workflows/dependency-scanning.yml @@ -0,0 +1,42 @@ +name: Dependency scanning + +on: + push: + branches: [master] + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + install: + uses: ./.github/workflows/install.yml + + composer-audit: + name: PHP packages - composer audit + needs: install + runs-on: ubuntu-latest + continue-on-error: true + container: sumocoders/cli-tools-php85:latest + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: vendor + path: vendor + - run: composer audit --ansi --no-interaction + + composer-outdated: + name: PHP packages - composer outdated + needs: install + runs-on: ubuntu-latest + continue-on-error: true + container: sumocoders/cli-tools-php85:latest + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: vendor + path: vendor + - run: composer outdated --ansi --no-interaction --strict diff --git a/.github/workflows/install.yml b/.github/workflows/install.yml new file mode 100644 index 0000000..061672f --- /dev/null +++ b/.github/workflows/install.yml @@ -0,0 +1,25 @@ +name: Install + +on: + workflow_call: + +jobs: + install: + name: Install dependencies and build assets + runs-on: ubuntu-latest + container: sumocoders/cli-tools-php85:latest + steps: + - uses: actions/checkout@v4 + - id: composer-cache + uses: actions/cache@v4 + with: + path: vendor + key: composer-${{ hashFiles('composer.lock') }} + - name: Install composer dependencies + if: steps.composer-cache.outputs.cache-hit != 'true' + run: COMPOSER_MEMORY_LIMIT=-1 composer install --no-scripts --no-progress + - uses: actions/upload-artifact@v4 + with: + name: vendor + path: vendor + retention-days: 1 From 55e95dace4c19630abfed8eb284f0a6a1cc534c3 Mon Sep 17 00:00:00 2001 From: Tijs Verkoyen Date: Tue, 14 Jul 2026 09:08:32 +0200 Subject: [PATCH 7/8] chore: update packages --- composer.json | 4 +- composer.lock | 673 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 459 insertions(+), 218 deletions(-) diff --git a/composer.json b/composer.json index c226b14..9244f69 100644 --- a/composer.json +++ b/composer.json @@ -29,7 +29,7 @@ "symfony/rate-limiter": "^8.0", "symfony/runtime": "^8.0", "symfony/security-bundle": "^8.0", - "symfony/stimulus-bundle": "^2.22", + "symfony/stimulus-bundle": "^3.2", "symfony/ux-turbo": "^3.0", "symfony/validator": "^8.0", "symfony/web-profiler-bundle": "^8.0", @@ -45,7 +45,7 @@ "micheh/phpcs-gitlab": "^2.0", "phpstan/phpstan-doctrine": "^2.0", "phpstan/phpstan-symfony": "^2.0", - "phpunit/phpunit": "^12.2", + "phpunit/phpunit": "^13.2", "squizlabs/php_codesniffer": "^4.0", "symfony/maker-bundle": "*", "symfony/stopwatch": "^8.0", diff --git a/composer.lock b/composer.lock index 0815f46..500347c 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": "fe3ff28afd315fc45c684d88d9ae1405", + "content-hash": "069d014a6ee96960e56f09c47e0e93c5", "packages": [ { "name": "bacon/bacon-qr-code", @@ -8202,33 +8202,36 @@ }, { "name": "symfony/stimulus-bundle", - "version": "v2.36.0", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/stimulus-bundle.git", - "reference": "377a3d1ec5834631a7db53bd275276ff3c5b49df" + "reference": "3cf8cd35c400f287def6ccd4574c111c07661054" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/377a3d1ec5834631a7db53bd275276ff3c5b49df", - "reference": "377a3d1ec5834631a7db53bd275276ff3c5b49df", + "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/3cf8cd35c400f287def6ccd4574c111c07661054", + "reference": "3cf8cd35c400f287def6ccd4574c111c07661054", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/config": "^5.4|^6.0|^7.0|^8.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0", + "php": ">=8.4", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", "symfony/deprecation-contracts": "^2.0|^3.0", - "symfony/finder": "^5.4|^6.0|^7.0|^8.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", "twig/twig": "^2.15.3|^3.8" }, + "conflict": { + "symfony/asset-mapper": "<6.4" + }, "require-dev": { - "symfony/asset-mapper": "^6.3|^7.0|^8.0", - "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0", - "symfony/phpunit-bridge": "^5.4|^6.0|^7.0|^8.0", - "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0", - "zenstruck/browser": "^1.4" + "phpunit/phpunit": "^11.1|^12.0", + "symfony/asset-mapper": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/twig-bundle": "^7.4|^8.0", + "zenstruck/browser": "^1.9" }, "type": "symfony-bundle", "autoload": { @@ -8251,7 +8254,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/stimulus-bundle/tree/v2.36.0" + "source": "https://github.com/symfony/stimulus-bundle/tree/v3.2.0" }, "funding": [ { @@ -8271,7 +8274,7 @@ "type": "tidelift" } ], - "time": "2026-05-06T04:31:36+00:00" + "time": "2026-06-05T09:42:50+00:00" }, { "name": "symfony/stopwatch", @@ -10982,33 +10985,35 @@ }, { "name": "phpunit/php-code-coverage", - "version": "12.5.7", + "version": "14.2.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "186dab580576598076de6818596d12b61801880e" + "reference": "82f6e49ff224e2cde923d74425e583a883910783" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/186dab580576598076de6818596d12b61801880e", - "reference": "186dab580576598076de6818596d12b61801880e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/82f6e49ff224e2cde923d74425e583a883910783", + "reference": "82f6e49ff224e2cde923d74425e583a883910783", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", + "ext-mbstring": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.7.0", - "php": ">=8.3", - "phpunit/php-text-template": "^5.0", - "sebastian/complexity": "^5.0", - "sebastian/environment": "^8.1.2", - "sebastian/lines-of-code": "^4.0.1", - "sebastian/version": "^6.0", + "nikic/php-parser": "^5.8.0", + "php": ">=8.4", + "phpunit/php-text-template": "^6.0", + "sebastian/complexity": "^6.0", + "sebastian/environment": "^9.3.2", + "sebastian/git-state": "^1.0", + "sebastian/lines-of-code": "^5.0.1", + "sebastian/version": "^7.0", "theseer/tokenizer": "^2.0.1" }, "require-dev": { - "phpunit/phpunit": "^12.5.28" + "phpunit/phpunit": "^13.2.2" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -11017,7 +11022,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "12.5.x-dev" + "dev-main": "14.2.x-dev" } }, "autoload": { @@ -11046,7 +11051,7 @@ "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/12.5.7" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.2.3" }, "funding": [ { @@ -11066,32 +11071,32 @@ "type": "tidelift" } ], - "time": "2026-06-01T13:24:19+00:00" + "time": "2026-07-06T15:04:02+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "6.0.1", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5" + "reference": "6e5aa1fb0a95b1703d83e721299ee18bb4e2de50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", - "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6e5aa1fb0a95b1703d83e721299ee18bb4e2de50", + "reference": "6e5aa1fb0a95b1703d83e721299ee18bb4e2de50", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -11119,7 +11124,7 @@ "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/6.0.1" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/7.0.0" }, "funding": [ { @@ -11139,28 +11144,28 @@ "type": "tidelift" } ], - "time": "2026-02-02T14:04:18+00:00" + "time": "2026-02-06T04:33:26+00:00" }, { "name": "phpunit/php-invoker", - "version": "6.0.0", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" + "reference": "42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", - "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88", + "reference": "42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "suggest": { "ext-pcntl": "*" @@ -11168,7 +11173,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -11195,40 +11200,52 @@ "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/6.0.0" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/7.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-invoker", + "type": "tidelift" } ], - "time": "2025-02-07T04:58:58+00:00" + "time": "2026-02-06T04:34:47+00:00" }, { "name": "phpunit/php-text-template", - "version": "5.0.0", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" + "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", - "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/a47af19f93f76aa3368303d752aa5272ca3299f4", + "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -11255,40 +11272,52 @@ "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/5.0.0" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/6.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-text-template", + "type": "tidelift" } ], - "time": "2025-02-07T04:59:16+00:00" + "time": "2026-02-06T04:36:37+00:00" }, { "name": "phpunit/php-timer", - "version": "8.0.0", + "version": "9.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" + "reference": "a0e12065831f6ab0d83120dc61513eb8d9a966f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", - "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a0e12065831f6ab0d83120dc61513eb8d9a966f6", + "reference": "a0e12065831f6ab0d83120dc61513eb8d9a966f6", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "9.0-dev" } }, "autoload": { @@ -11315,28 +11344,40 @@ "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/8.0.0" + "source": "https://github.com/sebastianbergmann/php-timer/tree/9.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-timer", + "type": "tidelift" } ], - "time": "2025-02-07T04:59:38+00:00" + "time": "2026-02-06T04:37:53+00:00" }, { "name": "phpunit/phpunit", - "version": "12.5.31", + "version": "13.2.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0608d157a284f15cc73b99a3327eff06b66a176d" + "reference": "8f5180f4627fc1978be2f61d8d9979dbe37e0c10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0608d157a284f15cc73b99a3327eff06b66a176d", - "reference": "0608d157a284f15cc73b99a3327eff06b66a176d", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8f5180f4627fc1978be2f61d8d9979dbe37e0c10", + "reference": "8f5180f4627fc1978be2f61d8d9979dbe37e0c10", "shasum": "" }, "require": { @@ -11349,22 +11390,24 @@ "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=8.3", - "phpunit/php-code-coverage": "^12.5.7", - "phpunit/php-file-iterator": "^6.0.1", - "phpunit/php-invoker": "^6.0.0", - "phpunit/php-text-template": "^5.0.0", - "phpunit/php-timer": "^8.0.0", - "sebastian/cli-parser": "^4.2.1", - "sebastian/comparator": "^7.1.8", - "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.1.2", - "sebastian/exporter": "^7.0.3", - "sebastian/global-state": "^8.0.3", - "sebastian/object-enumerator": "^7.0.0", - "sebastian/recursion-context": "^7.0.1", - "sebastian/type": "^6.0.4", - "sebastian/version": "^6.0.0", + "php": ">=8.4.1", + "phpunit/php-code-coverage": "^14.2.3", + "phpunit/php-file-iterator": "^7.0.0", + "phpunit/php-invoker": "^7.0.0", + "phpunit/php-text-template": "^6.0.0", + "phpunit/php-timer": "^9.0.0", + "sebastian/cli-parser": "^5.0.0", + "sebastian/comparator": "^8.3.0", + "sebastian/diff": "^9.0", + "sebastian/environment": "^9.3.2", + "sebastian/exporter": "^8.1.0", + "sebastian/file-filter": "^1.0", + "sebastian/git-state": "^1.0", + "sebastian/global-state": "^9.0.1", + "sebastian/object-enumerator": "^8.0.0", + "sebastian/recursion-context": "^8.0.0", + "sebastian/type": "^7.0.1", + "sebastian/version": "^7.0.0", "staabm/side-effects-detector": "^1.0.5" }, "bin": [ @@ -11373,7 +11416,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "12.5-dev" + "dev-main": "13.2-dev" } }, "autoload": { @@ -11405,7 +11448,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.31" + "source": "https://github.com/sebastianbergmann/phpunit/tree/13.2.4" }, "funding": [ { @@ -11413,32 +11456,32 @@ "type": "other" } ], - "time": "2026-07-06T14:54:16+00:00" + "time": "2026-07-08T08:36:51+00:00" }, { "name": "sebastian/cli-parser", - "version": "4.2.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "7d05781b13f7dec9043a629a21d086ed74582a15" + "reference": "48a4654fa5e48c1c81214e9930048a572d4b23ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/7d05781b13f7dec9043a629a21d086ed74582a15", - "reference": "7d05781b13f7dec9043a629a21d086ed74582a15", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/48a4654fa5e48c1c81214e9930048a572d4b23ca", + "reference": "48a4654fa5e48c1c81214e9930048a572d4b23ca", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.5.25" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.2-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -11462,7 +11505,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/5.0.0" }, "funding": [ { @@ -11482,31 +11525,31 @@ "type": "tidelift" } ], - "time": "2026-05-17T05:29:34+00:00" + "time": "2026-02-06T04:39:44+00:00" }, { "name": "sebastian/comparator", - "version": "7.1.8", + "version": "8.3.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "7c65c1e79836812819705b473a90c12399542485" + "reference": "c025fc7604afab3f195fab7cdaf72327331af241" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/7c65c1e79836812819705b473a90c12399542485", - "reference": "7c65c1e79836812819705b473a90c12399542485", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c025fc7604afab3f195fab7cdaf72327331af241", + "reference": "c025fc7604afab3f195fab7cdaf72327331af241", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.3", - "sebastian/diff": "^7.0", - "sebastian/exporter": "^7.0.3" + "php": ">=8.4", + "sebastian/diff": "^9.0", + "sebastian/exporter": "^8.1.0" }, "require-dev": { - "phpunit/phpunit": "^12.5.25" + "phpunit/phpunit": "^13.2" }, "suggest": { "ext-bcmath": "For comparing BcMath\\Number objects" @@ -11514,7 +11557,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "7.1-dev" + "dev-main": "8.3-dev" } }, "autoload": { @@ -11554,7 +11597,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.8" + "source": "https://github.com/sebastianbergmann/comparator/tree/8.3.0" }, "funding": [ { @@ -11574,33 +11617,33 @@ "type": "tidelift" } ], - "time": "2026-05-21T04:45:25+00:00" + "time": "2026-06-05T03:06:45+00:00" }, { "name": "sebastian/complexity", - "version": "5.0.0", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" + "reference": "c5651c795c98093480df79350cb050813fc7a2f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", - "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c5651c795c98093480df79350cb050813fc7a2f3", + "reference": "c5651c795c98093480df79350cb050813fc7a2f3", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -11624,41 +11667,53 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/6.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/complexity", + "type": "tidelift" } ], - "time": "2025-02-07T04:55:25+00:00" + "time": "2026-02-06T04:41:32+00:00" }, { "name": "sebastian/diff", - "version": "7.0.0", + "version": "9.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "7ab1ea946c012266ca32390913653d844ecd085f" + "reference": "a3fb6a298a265ff487a91bbea46e03cd01dbb226" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", - "reference": "7ab1ea946c012266ca32390913653d844ecd085f", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a3fb6a298a265ff487a91bbea46e03cd01dbb226", + "reference": "a3fb6a298a265ff487a91bbea46e03cd01dbb226", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0", - "symfony/process": "^7.2" + "phpunit/phpunit": "^13.2", + "symfony/process": "^7.4.13" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "9.0-dev" } }, "autoload": { @@ -11691,35 +11746,47 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/diff/tree/9.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/diff", + "type": "tidelift" } ], - "time": "2025-02-07T04:55:46+00:00" + "time": "2026-06-05T03:04:51+00:00" }, { "name": "sebastian/environment", - "version": "8.1.2", + "version": "9.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439" + "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/9d32c685773823b1983e256ae4ecd48a10d6e439", - "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e", + "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.5.26" + "phpunit/phpunit": "^13.1.11" }, "suggest": { "ext-posix": "*" @@ -11727,7 +11794,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "8.1-dev" + "dev-main": "9.3-dev" } }, "autoload": { @@ -11755,7 +11822,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.1.2" + "source": "https://github.com/sebastianbergmann/environment/tree/9.3.2" }, "funding": [ { @@ -11775,34 +11842,34 @@ "type": "tidelift" } ], - "time": "2026-05-25T13:40:20+00:00" + "time": "2026-05-25T13:41:38+00:00" }, { "name": "sebastian/exporter", - "version": "7.0.3", + "version": "8.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23" + "reference": "cfaa77c750dcad6f44c9bac8f62ac486e1c82c26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", - "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/cfaa77c750dcad6f44c9bac8f62ac486e1c82c26", + "reference": "cfaa77c750dcad6f44c9bac8f62ac486e1c82c26", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.3", - "sebastian/recursion-context": "^7.0.1" + "php": ">=8.4", + "sebastian/recursion-context": "^8.0" }, "require-dev": { - "phpunit/phpunit": "^12.5.25" + "phpunit/phpunit": "^13.2.4" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.1-dev" } }, "autoload": { @@ -11845,7 +11912,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.3" + "source": "https://github.com/sebastianbergmann/exporter/tree/8.1.1" }, "funding": [ { @@ -11865,35 +11932,173 @@ "type": "tidelift" } ], - "time": "2026-05-20T04:37:17+00:00" + "time": "2026-07-13T11:35:11+00:00" + }, + { + "name": "sebastian/file-filter", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/file-filter.git", + "reference": "33a26f394330f6faa7684bb9cc73afb7727aae93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/file-filter/zipball/33a26f394330f6faa7684bb9cc73afb7727aae93", + "reference": "33a26f394330f6faa7684bb9cc73afb7727aae93", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.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": "Library for filtering files", + "homepage": "https://github.com/sebastianbergmann/file-filter", + "support": { + "issues": "https://github.com/sebastianbergmann/file-filter/issues", + "security": "https://github.com/sebastianbergmann/file-filter/security/policy", + "source": "https://github.com/sebastianbergmann/file-filter/tree/1.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/file-filter", + "type": "tidelift" + } + ], + "time": "2026-04-22T07:20:04+00:00" + }, + { + "name": "sebastian/git-state", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/git-state.git", + "reference": "792a952e0eba55b6960a48aeceb9f371aad1f76b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/git-state/zipball/792a952e0eba55b6960a48aeceb9f371aad1f76b", + "reference": "792a952e0eba55b6960a48aeceb9f371aad1f76b", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.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": "Library for describing the state of a Git checkout", + "homepage": "https://github.com/sebastianbergmann/git-state", + "support": { + "issues": "https://github.com/sebastianbergmann/git-state/issues", + "security": "https://github.com/sebastianbergmann/git-state/security/policy", + "source": "https://github.com/sebastianbergmann/git-state/tree/1.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/git-state", + "type": "tidelift" + } + ], + "time": "2026-03-21T12:54:28+00:00" }, { "name": "sebastian/global-state", - "version": "8.0.3", + "version": "9.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9" + "reference": "ba68ba79da690cf7eddefd3ce5b78b20b9ba9945" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b164d3274d6537ab462591c5755f76a8f5b1aae9", - "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ba68ba79da690cf7eddefd3ce5b78b20b9ba9945", + "reference": "ba68ba79da690cf7eddefd3ce5b78b20b9ba9945", "shasum": "" }, "require": { - "php": ">=8.3", - "sebastian/object-reflector": "^5.0", - "sebastian/recursion-context": "^7.0.1" + "php": ">=8.4", + "sebastian/object-reflector": "^6.0", + "sebastian/recursion-context": "^8.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^12.5.28" + "phpunit/phpunit": "^13.1.13" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "9.0-dev" } }, "autoload": { @@ -11919,7 +12124,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.3" + "source": "https://github.com/sebastianbergmann/global-state/tree/9.0.1" }, "funding": [ { @@ -11939,33 +12144,33 @@ "type": "tidelift" } ], - "time": "2026-06-01T15:10:33+00:00" + "time": "2026-06-01T15:11:33+00:00" }, { "name": "sebastian/lines-of-code", - "version": "4.0.1", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e" + "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d543b8ef219dcd8da262cbb958639a96bedba10e", - "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d1b6f8fce682505dbd048977f1abedf1b8ad3ff8", + "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8", "shasum": "" }, "require": { - "nikic/php-parser": "^5.7.0", - "php": ">=8.3" + "nikic/php-parser": "^5.8.0", + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.5.25" + "phpunit/phpunit": "^13.2.4" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -11989,7 +12194,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.2" }, "funding": [ { @@ -12009,34 +12214,34 @@ "type": "tidelift" } ], - "time": "2026-05-19T16:22:07+00:00" + "time": "2026-07-09T08:42:34+00:00" }, { "name": "sebastian/object-enumerator", - "version": "7.0.0", + "version": "8.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" + "reference": "b39ab125fd9a7434b0ecbc4202eebce11a98cfc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", - "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/b39ab125fd9a7434b0ecbc4202eebce11a98cfc5", + "reference": "b39ab125fd9a7434b0ecbc4202eebce11a98cfc5", "shasum": "" }, "require": { - "php": ">=8.3", - "sebastian/object-reflector": "^5.0", - "sebastian/recursion-context": "^7.0" + "php": ">=8.4", + "sebastian/object-reflector": "^6.0", + "sebastian/recursion-context": "^8.0" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -12059,40 +12264,52 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/8.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/object-enumerator", + "type": "tidelift" } ], - "time": "2025-02-07T04:57:48+00:00" + "time": "2026-02-06T04:46:36+00:00" }, { "name": "sebastian/object-reflector", - "version": "5.0.0", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "4bfa827c969c98be1e527abd576533293c634f6a" + "reference": "3ca042c2c60b0eab094f8a1b6a7093f4d4c72200" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", - "reference": "4bfa827c969c98be1e527abd576533293c634f6a", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/3ca042c2c60b0eab094f8a1b6a7093f4d4c72200", + "reference": "3ca042c2c60b0eab094f8a1b6a7093f4d4c72200", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -12115,40 +12332,52 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/6.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/object-reflector", + "type": "tidelift" } ], - "time": "2025-02-07T04:58:17+00:00" + "time": "2026-02-06T04:47:13+00:00" }, { "name": "sebastian/recursion-context", - "version": "7.0.1", + "version": "8.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" + "reference": "74c5af21f6a5833e91767ca068c4d3dfec15317e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", - "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/74c5af21f6a5833e91767ca068c4d3dfec15317e", + "reference": "74c5af21f6a5833e91767ca068c4d3dfec15317e", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -12179,7 +12408,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/8.0.0" }, "funding": [ { @@ -12199,32 +12428,32 @@ "type": "tidelift" } ], - "time": "2025-08-13T04:44:59+00:00" + "time": "2026-02-06T04:51:28+00:00" }, { "name": "sebastian/type", - "version": "6.0.4", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "82ff822c2edc46724be9f7411d3163021f602773" + "reference": "fee0309275847fefd7636167085e379c1dbf6990" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/82ff822c2edc46724be9f7411d3163021f602773", - "reference": "82ff822c2edc46724be9f7411d3163021f602773", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fee0309275847fefd7636167085e379c1dbf6990", + "reference": "fee0309275847fefd7636167085e379c1dbf6990", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.5.25" + "phpunit/phpunit": "^13.1.10" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -12248,7 +12477,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/6.0.4" + "source": "https://github.com/sebastianbergmann/type/tree/7.0.1" }, "funding": [ { @@ -12268,29 +12497,29 @@ "type": "tidelift" } ], - "time": "2026-05-20T06:45:45+00:00" + "time": "2026-05-20T06:49:11+00:00" }, { "name": "sebastian/version", - "version": "6.0.0", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" + "reference": "ad37a5552c8e2b88572249fdc19b6da7792e021b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", - "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ad37a5552c8e2b88572249fdc19b6da7792e021b", + "reference": "ad37a5552c8e2b88572249fdc19b6da7792e021b", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -12314,15 +12543,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/version/issues", "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/version/tree/7.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/version", + "type": "tidelift" } ], - "time": "2025-02-07T05:00:38+00:00" + "time": "2026-02-06T04:52:52+00:00" }, { "name": "squizlabs/php_codesniffer", From 29eee4da37e747d2eea6108171e9b4326bbb8447 Mon Sep 17 00:00:00 2001 From: Tijs Verkoyen Date: Tue, 14 Jul 2026 13:56:12 +0200 Subject: [PATCH 8/8] chore: fix deprecation in the Validator tests --- .../User/UniqueEmailValidatorTest.php | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/tests/Validator/User/UniqueEmailValidatorTest.php b/tests/Validator/User/UniqueEmailValidatorTest.php index 1d135c4..00bac8e 100644 --- a/tests/Validator/User/UniqueEmailValidatorTest.php +++ b/tests/Validator/User/UniqueEmailValidatorTest.php @@ -38,9 +38,8 @@ public function testNoViolationWhenEmailIsUniqueForCreateUser(): void ->getMock(); $context->expects(self::never())->method('buildViolation'); $validator = new UniqueEmailValidator($this->userRepository); - $validator->initialize($context); - $validator->validate('user@example.com', new UniqueEmail()); + $validator->validateInContext('user@example.com', new UniqueEmail(), $context); } public function testNoViolationWhenEmailIsBlank(): void @@ -51,10 +50,9 @@ public function testNoViolationWhenEmailIsBlank(): void ->getMock(); $context->expects(self::never())->method('buildViolation'); $validator = new UniqueEmailValidator($this->userRepository); - $validator->initialize($context); - $validator->validate('', new UniqueEmail()); - $validator->validate(null, new UniqueEmail()); + $validator->validateInContext('', new UniqueEmail(), $context); + $validator->validateInContext(null, new UniqueEmail(), $context); } public function testExceptionWhenEmailIsNumber(): void @@ -64,11 +62,10 @@ public function testExceptionWhenEmailIsNumber(): void ->disableOriginalConstructor() ->getMock(); $validator = new UniqueEmailValidator($this->userRepository); - $validator->initialize($context); $this->expectException(UnexpectedValueException::class); - $validator->validate(1, new UniqueEmail()); + $validator->validateInContext(1, new UniqueEmail(), $context); } public function testViolationWhenEmailIsNotUnique(): void @@ -85,9 +82,8 @@ public function testViolationWhenEmailIsNotUnique(): void $context->expects(self::once())->method('getObject')->willReturn($createUser); $context->expects(self::once())->method('buildViolation'); $validator = new UniqueEmailValidator($this->userRepository); - $validator->initialize($context); - $validator->validate('user@example.com', new UniqueEmail()); + $validator->validateInContext('user@example.com', new UniqueEmail(), $context); } public function testNoViolationWhileEditingTheUser(): void @@ -103,9 +99,8 @@ public function testNoViolationWhileEditingTheUser(): void $context->expects(self::once())->method('getObject')->willReturn($updateUser); $context->expects(self::never())->method('buildViolation'); $validator = new UniqueEmailValidator($this->userRepository); - $validator->initialize($context); - $validator->validate('user@example.com', new UniqueEmail()); + $validator->validateInContext('user@example.com', new UniqueEmail(), $context); } public function testViolationWhileEditingTheUserWithExistingEmail(): void @@ -123,8 +118,7 @@ public function testViolationWhileEditingTheUserWithExistingEmail(): void $context->expects(self::once())->method('getObject')->willReturn($updateUser); $context->expects(self::once())->method('buildViolation'); $validator = new UniqueEmailValidator($this->userRepository); - $validator->initialize($context); - $validator->validate('user-existing@example.com', new UniqueEmail()); + $validator->validateInContext('user-existing@example.com', new UniqueEmail(), $context); } }