diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bbe6a51ff..6c0afa498 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -94,6 +94,9 @@ jobs: - name: Run PHPStan run: docker compose exec -T php vendor/bin/phpstan --memory-limit=256M + - + name: Run Rector + run: docker compose exec -T php vendor/bin/rector --dry-run - name: Check OpenAPI run: docker compose exec -T php bin/console api:openapi:export --yaml | docker run --rm -i -v $(pwd)/redocly.yaml:/spec/redocly.yaml redocly/cli lint /dev/stdin @@ -207,34 +210,35 @@ jobs: recursive: true # Lint API - - - name: PHP CS Fixer Cache - uses: actions/cache@v4 - with: - path: api/.php-cs-fixer.cache - key: ${{ runner.OS }}-phpcsfixer-${{ github.sha }} - restore-keys: | - ${{ runner.OS }}-phpcsfixer- - - - name: Get API changed files - id: api-changed-files - uses: tj-actions/changed-files@v46 - with: - files: api/**/*.php - - - name: Get Extra Arguments for PHP-CS-Fixer - id: phpcs-intersection - run: | - CHANGED_FILES=$(echo "${{ steps.api-changed-files.outputs.all_changed_and_modified_files }}" | tr ' ' '\n') - if ! echo "${CHANGED_FILES}" | grep -qE "^api\/(\\.php-cs-fixer(\\.dist)?\\.php|composer\\.lock)$"; then EXTRA_ARGS=$(printf -- '--path-mode=intersection\n--\n%s' "${CHANGED_FILES}"); else EXTRA_ARGS=''; fi - echo "PHPCS_EXTRA_ARGS<> $GITHUB_ENV - echo "$EXTRA_ARGS" >> $GITHUB_ENV - echo "EOF" >> $GITHUB_ENV - - - name: Lint API - uses: docker://oskarstark/php-cs-fixer-ga - with: - args: --config=api/.php-cs-fixer.dist.php -v --dry-run --stop-on-violation --using-cache=no ${{ env.PHPCS_EXTRA_ARGS }}" + # todo Waiting for PHP CS Fixer to support PHP 8.4 +# - +# name: PHP CS Fixer Cache +# uses: actions/cache@v4 +# with: +# path: api/.php-cs-fixer.cache +# key: ${{ runner.OS }}-phpcsfixer-${{ github.sha }} +# restore-keys: | +# ${{ runner.OS }}-phpcsfixer- +# - +# name: Get API changed files +# id: api-changed-files +# uses: tj-actions/changed-files@v46 +# with: +# files: api/**/*.php +# - +# name: Get Extra Arguments for PHP-CS-Fixer +# id: phpcs-intersection +# run: | +# CHANGED_FILES=$(echo "${{ steps.api-changed-files.outputs.all_changed_and_modified_files }}" | tr ' ' '\n') +# if ! echo "${CHANGED_FILES}" | grep -qE "^api\/(\\.php-cs-fixer(\\.dist)?\\.php|composer\\.lock)$"; then EXTRA_ARGS=$(printf -- '--path-mode=intersection\n--\n%s' "${CHANGED_FILES}"); else EXTRA_ARGS=''; fi +# echo "PHPCS_EXTRA_ARGS<> $GITHUB_ENV +# echo "$EXTRA_ARGS" >> $GITHUB_ENV +# echo "EOF" >> $GITHUB_ENV +# - +# name: Lint API +# uses: docker://oskarstark/php-cs-fixer-ga +# with: +# args: --config=api/.php-cs-fixer.dist.php -v --dry-run --stop-on-violation --using-cache=no ${{ env.PHPCS_EXTRA_ARGS }}" # Lint PWA - diff --git a/api/.php-cs-fixer.dist.php b/api/.php-cs-fixer.dist.php index 6db5292eb..27fbe758d 100644 --- a/api/.php-cs-fixer.dist.php +++ b/api/.php-cs-fixer.dist.php @@ -1,11 +1,11 @@ in(__DIR__) ->exclude('var') ; -return (new PhpCsFixer\Config()) +return new PhpCsFixer\Config() ->setRiskyAllowed(true) ->setRules([ '@PhpCsFixer' => true, diff --git a/api/Dockerfile b/api/Dockerfile index bbcd00825..7343f4102 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -4,7 +4,7 @@ # Versions -FROM dunglas/frankenphp:1-php8.3 AS frankenphp_upstream +FROM dunglas/frankenphp:1-php8.4 AS frankenphp_upstream # The different stages of this Dockerfile are meant to be built into separate images diff --git a/api/composer.json b/api/composer.json index 7f26b099e..233d74047 100644 --- a/api/composer.json +++ b/api/composer.json @@ -2,62 +2,63 @@ "type": "project", "license": "MIT", "require": { - "php": ">=8.3", + "php": ">=8.4", "ext-ctype": "*", "ext-iconv": "*", - "api-platform/doctrine-orm": "^4.1.17", - "api-platform/graphql": "^4.1.17", - "api-platform/symfony": "^4.1.17", + "api-platform/doctrine-orm": "^4.1.18", + "api-platform/graphql": "^4.1.18", + "api-platform/symfony": "^4.1.18", "doctrine/common": "^3.5", - "doctrine/doctrine-bundle": "^2.14", + "doctrine/doctrine-bundle": "^2.15", "doctrine/doctrine-fixtures-bundle": "^4.1", - "doctrine/doctrine-migrations-bundle": "^3.4.1", - "doctrine/orm": "^3.3.2", + "doctrine/doctrine-migrations-bundle": "^3.4.2", + "doctrine/orm": "^3.5.0", "doctrine/persistence": "^3.4", "myclabs/php-enum": "^1.8.5", "nelmio/cors-bundle": "^2.5", "runtime/frankenphp-symfony": "^0.2.0", "seld/jsonlint": "^1.11", - "symfony/asset": "7.2.*", - "symfony/clock": "7.2.*", - "symfony/console": "7.2.*", - "symfony/dotenv": "7.2.*", - "symfony/expression-language": "7.2.*", - "symfony/flex": "^2.5", - "symfony/framework-bundle": "7.2.*", - "symfony/http-client": "7.2.*", + "symfony/asset": "7.3.*", + "symfony/clock": "7.3.*", + "symfony/console": "7.3.*", + "symfony/dotenv": "7.3.*", + "symfony/expression-language": "7.3.*", + "symfony/flex": "^2.7.1", + "symfony/framework-bundle": "7.3.*", + "symfony/http-client": "7.3.*", "symfony/mercure-bundle": "^0.3.9", "symfony/monolog-bundle": "^3.10", - "symfony/property-access": "7.2.*", - "symfony/property-info": "7.2.*", - "symfony/runtime": "7.2.*", - "symfony/security-bundle": "7.2.*", - "symfony/serializer": "7.2.*", - "symfony/twig-bundle": "7.2.*", - "symfony/uid": "7.2.*", - "symfony/validator": "7.2.*", - "symfony/yaml": "7.2.*", + "symfony/property-access": "7.3.*", + "symfony/property-info": "7.3.*", + "symfony/runtime": "7.3.*", + "symfony/security-bundle": "7.3.*", + "symfony/serializer": "7.3.*", + "symfony/twig-bundle": "7.3.*", + "symfony/uid": "7.3.*", + "symfony/validator": "7.3.*", + "symfony/yaml": "7.3.*", "web-token/jwt-bundle": "^4.0.4", "webonyx/graphql-php": "^15.20", - "zenstruck/foundry": "^2.3.10" + "zenstruck/foundry": "^2.6.0" }, "require-dev": { "dama/doctrine-test-bundle": "^8.3", - "justinrainbow/json-schema": "^6.4.1", + "justinrainbow/json-schema": "^6.4.2", "phpstan/extension-installer": "^1.4.3", "phpstan/phpdoc-parser": "^2.1", - "phpstan/phpstan": "^2.1.11", - "phpstan/phpstan-doctrine": "^2.0.2", + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-doctrine": "^2.0.3", "phpstan/phpstan-phpunit": "^2.0.6", - "phpstan/phpstan-symfony": "^2.0.4", - "phpunit/phpunit": "^12.1.2", - "symfony/browser-kit": "7.2.*", - "symfony/css-selector": "7.2.*", - "symfony/debug-bundle": "7.2.*", - "symfony/maker-bundle": "^1.62.1", - "symfony/stopwatch": "7.2.*", - "symfony/var-dumper": "7.2.*", - "symfony/web-profiler-bundle": "7.2.*" + "phpstan/phpstan-symfony": "^2.0.6", + "phpunit/phpunit": "^12.2.5", + "rector/rector": "^2.1", + "symfony/browser-kit": "7.3.*", + "symfony/css-selector": "7.3.*", + "symfony/debug-bundle": "7.3.*", + "symfony/maker-bundle": "^1.63.0", + "symfony/stopwatch": "7.3.*", + "symfony/var-dumper": "7.3.*", + "symfony/web-profiler-bundle": "7.3.*" }, "config": { "optimize-autoloader": true, @@ -112,7 +113,7 @@ "extra": { "symfony": { "allow-contrib": false, - "require": "7.2.*", + "require": "7.3.*", "docker": false, "endpoint": [ "https://api.github.com/repos/Spomky-Labs/recipes/contents/index.json?ref=main", diff --git a/api/composer.lock b/api/composer.lock index 673f12dfe..b1bfd5059 100644 --- a/api/composer.lock +++ b/api/composer.lock @@ -4,11 +4,11 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "76098775fdfaf3df0443fa667d4e978a", + "content-hash": "2f38bd519dbd20ec60e15be21922e673", "packages": [ { "name": "api-platform/doctrine-common", - "version": "v4.1.17", + "version": "v4.1.18", "source": { "type": "git", "url": "https://github.com/api-platform/doctrine-common.git", @@ -90,13 +90,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/doctrine-common/tree/v4.1.17" + "source": "https://github.com/api-platform/doctrine-common/tree/v4.1.18" }, "time": "2025-06-06T14:56:47+00:00" }, { "name": "api-platform/doctrine-orm", - "version": "v4.1.17", + "version": "v4.1.18", "source": { "type": "git", "url": "https://github.com/api-platform/doctrine-orm.git", @@ -175,13 +175,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/doctrine-orm/tree/v4.1.17" + "source": "https://github.com/api-platform/doctrine-orm/tree/v4.1.18" }, "time": "2025-06-06T14:56:47+00:00" }, { "name": "api-platform/documentation", - "version": "v4.1.17", + "version": "v4.1.18", "source": { "type": "git", "url": "https://github.com/api-platform/documentation.git", @@ -237,22 +237,22 @@ ], "description": "API Platform documentation controller.", "support": { - "source": "https://github.com/api-platform/documentation/tree/v4.1.17" + "source": "https://github.com/api-platform/documentation/tree/v4.1.18" }, "time": "2025-06-06T14:56:47+00:00" }, { "name": "api-platform/graphql", - "version": "v4.1.17", + "version": "v4.1.18", "source": { "type": "git", "url": "https://github.com/api-platform/graphql.git", - "reference": "966bafa3a5ba2c41e1700699c65fa25581da9484" + "reference": "7125884e7ed88db3d473011f0b41c8e0d0497749" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/graphql/zipball/966bafa3a5ba2c41e1700699c65fa25581da9484", - "reference": "966bafa3a5ba2c41e1700699c65fa25581da9484", + "url": "https://api.github.com/repos/api-platform/graphql/zipball/7125884e7ed88db3d473011f0b41c8e0d0497749", + "reference": "7125884e7ed88db3d473011f0b41c8e0d0497749", "shasum": "" }, "require": { @@ -327,13 +327,13 @@ "graphql" ], "support": { - "source": "https://github.com/api-platform/graphql/tree/v4.1.17" + "source": "https://github.com/api-platform/graphql/tree/v4.1.18" }, - "time": "2025-06-06T14:56:47+00:00" + "time": "2025-07-03T13:00:28+00:00" }, { "name": "api-platform/http-cache", - "version": "v4.1.17", + "version": "v4.1.18", "source": { "type": "git", "url": "https://github.com/api-platform/http-cache.git", @@ -405,13 +405,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/http-cache/tree/v4.1.17" + "source": "https://github.com/api-platform/http-cache/tree/v4.1.18" }, "time": "2025-06-06T14:56:47+00:00" }, { "name": "api-platform/hydra", - "version": "v4.1.17", + "version": "v4.1.18", "source": { "type": "git", "url": "https://github.com/api-platform/hydra.git", @@ -490,22 +490,22 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/hydra/tree/v4.1.17" + "source": "https://github.com/api-platform/hydra/tree/v4.1.18" }, "time": "2025-06-06T14:56:47+00:00" }, { "name": "api-platform/json-schema", - "version": "v4.1.17", + "version": "v4.1.18", "source": { "type": "git", "url": "https://github.com/api-platform/json-schema.git", - "reference": "1081f99a02ef35c42779b0dd9f532ca0bddf2781" + "reference": "1d1c6eaa4841f3989e2bec4cdf8167fb0ca42a8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/json-schema/zipball/1081f99a02ef35c42779b0dd9f532ca0bddf2781", - "reference": "1081f99a02ef35c42779b0dd9f532ca0bddf2781", + "url": "https://api.github.com/repos/api-platform/json-schema/zipball/1d1c6eaa4841f3989e2bec4cdf8167fb0ca42a8f", + "reference": "1d1c6eaa4841f3989e2bec4cdf8167fb0ca42a8f", "shasum": "" }, "require": { @@ -569,22 +569,22 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/json-schema/tree/v4.1.17" + "source": "https://github.com/api-platform/json-schema/tree/v4.1.18" }, - "time": "2025-06-06T14:56:47+00:00" + "time": "2025-06-29T12:24:14+00:00" }, { "name": "api-platform/jsonld", - "version": "v4.1.17", + "version": "v4.1.18", "source": { "type": "git", "url": "https://github.com/api-platform/jsonld.git", - "reference": "f9450e0ed2218a3f7fe32041172135514591c74d" + "reference": "2693aa0cf388e519d1f3b1154df1f6ce2fdcc516" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/jsonld/zipball/f9450e0ed2218a3f7fe32041172135514591c74d", - "reference": "f9450e0ed2218a3f7fe32041172135514591c74d", + "url": "https://api.github.com/repos/api-platform/jsonld/zipball/2693aa0cf388e519d1f3b1154df1f6ce2fdcc516", + "reference": "2693aa0cf388e519d1f3b1154df1f6ce2fdcc516", "shasum": "" }, "require": { @@ -647,22 +647,22 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/jsonld/tree/v4.1.17" + "source": "https://github.com/api-platform/jsonld/tree/v4.1.18" }, - "time": "2025-06-19T10:12:21+00:00" + "time": "2025-07-01T12:31:29+00:00" }, { "name": "api-platform/metadata", - "version": "v4.1.17", + "version": "v4.1.18", "source": { "type": "git", "url": "https://github.com/api-platform/metadata.git", - "reference": "fd11cd8e38d859357a010bb7c31dc5116f1908d7" + "reference": "5df40a760eef56963c151181dc9498bbc260e7ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/metadata/zipball/fd11cd8e38d859357a010bb7c31dc5116f1908d7", - "reference": "fd11cd8e38d859357a010bb7c31dc5116f1908d7", + "url": "https://api.github.com/repos/api-platform/metadata/zipball/5df40a760eef56963c151181dc9498bbc260e7ae", + "reference": "5df40a760eef56963c151181dc9498bbc260e7ae", "shasum": "" }, "require": { @@ -744,22 +744,22 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/metadata/tree/v4.1.17" + "source": "https://github.com/api-platform/metadata/tree/v4.1.18" }, - "time": "2025-06-19T08:33:15+00:00" + "time": "2025-07-03T13:06:55+00:00" }, { "name": "api-platform/openapi", - "version": "v4.1.17", + "version": "v4.1.18", "source": { "type": "git", "url": "https://github.com/api-platform/openapi.git", - "reference": "d60890b47f0a75912cec4ea44a98d181145ae6f3" + "reference": "0153a8090c7726143ec0f14a7d859f45e608216a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/openapi/zipball/d60890b47f0a75912cec4ea44a98d181145ae6f3", - "reference": "d60890b47f0a75912cec4ea44a98d181145ae6f3", + "url": "https://api.github.com/repos/api-platform/openapi/zipball/0153a8090c7726143ec0f14a7d859f45e608216a", + "reference": "0153a8090c7726143ec0f14a7d859f45e608216a", "shasum": "" }, "require": { @@ -831,22 +831,22 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/openapi/tree/v4.1.17" + "source": "https://github.com/api-platform/openapi/tree/v4.1.18" }, - "time": "2025-06-19T08:57:27+00:00" + "time": "2025-07-01T12:34:32+00:00" }, { "name": "api-platform/serializer", - "version": "v4.1.17", + "version": "v4.1.18", "source": { "type": "git", "url": "https://github.com/api-platform/serializer.git", - "reference": "804a421fa27f8c21270937c55ee3fb6d1855697c" + "reference": "6c08faff78730deaf6356412c6b79f0b06cc2bbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/serializer/zipball/804a421fa27f8c21270937c55ee3fb6d1855697c", - "reference": "804a421fa27f8c21270937c55ee3fb6d1855697c", + "url": "https://api.github.com/repos/api-platform/serializer/zipball/6c08faff78730deaf6356412c6b79f0b06cc2bbd", + "reference": "6c08faff78730deaf6356412c6b79f0b06cc2bbd", "shasum": "" }, "require": { @@ -922,31 +922,31 @@ "serializer" ], "support": { - "source": "https://github.com/api-platform/serializer/tree/v4.1.17" + "source": "https://github.com/api-platform/serializer/tree/v4.1.18" }, - "time": "2025-06-19T10:12:21+00:00" + "time": "2025-06-30T16:34:41+00:00" }, { "name": "api-platform/state", - "version": "v4.1.17", + "version": "v4.1.18", "source": { "type": "git", "url": "https://github.com/api-platform/state.git", - "reference": "b6c9510a974bda5a89af43266b7a7d829e0de549" + "reference": "8e6860ca1c581a36541538079c7c411bdcc09d32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/state/zipball/b6c9510a974bda5a89af43266b7a7d829e0de549", - "reference": "b6c9510a974bda5a89af43266b7a7d829e0de549", + "url": "https://api.github.com/repos/api-platform/state/zipball/8e6860ca1c581a36541538079c7c411bdcc09d32", + "reference": "8e6860ca1c581a36541538079c7c411bdcc09d32", "shasum": "" }, "require": { - "api-platform/metadata": "^4.1.11", + "api-platform/metadata": "^4.1.18", "php": ">=8.2", "psr/container": "^1.0 || ^2.0", - "symfony/contracts": "^3.0", "symfony/http-kernel": "^6.4 || ^7.0", - "symfony/serializer": "^6.4 || ^7.0" + "symfony/serializer": "^6.4 || ^7.0", + "symfony/translation-contracts": "^3.0" }, "require-dev": { "api-platform/validator": "^4.1", @@ -1014,22 +1014,22 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/state/tree/v4.1.17" + "source": "https://github.com/api-platform/state/tree/v4.1.18" }, - "time": "2025-06-13T12:04:07+00:00" + "time": "2025-07-03T13:06:55+00:00" }, { "name": "api-platform/symfony", - "version": "v4.1.17", + "version": "v4.1.18", "source": { "type": "git", "url": "https://github.com/api-platform/symfony.git", - "reference": "89a5e6116ac1ecd5ef30017decedf5cb66b5b32c" + "reference": "ad786947491e00cf8efc10810c592e91eabc7e69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/symfony/zipball/89a5e6116ac1ecd5ef30017decedf5cb66b5b32c", - "reference": "89a5e6116ac1ecd5ef30017decedf5cb66b5b32c", + "url": "https://api.github.com/repos/api-platform/symfony/zipball/ad786947491e00cf8efc10810c592e91eabc7e69", + "reference": "ad786947491e00cf8efc10810c592e91eabc7e69", "shasum": "" }, "require": { @@ -1138,22 +1138,22 @@ "symfony" ], "support": { - "source": "https://github.com/api-platform/symfony/tree/v4.1.17" + "source": "https://github.com/api-platform/symfony/tree/v4.1.18" }, - "time": "2025-06-13T12:57:40+00:00" + "time": "2025-07-03T08:18:21+00:00" }, { "name": "api-platform/validator", - "version": "v4.1.17", + "version": "v4.1.18", "source": { "type": "git", "url": "https://github.com/api-platform/validator.git", - "reference": "0f25a9a2a4c75723a2f790177f0c6d83433b575d" + "reference": "269fea70ef84fb120cddba8027143d7bf43baba5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/validator/zipball/0f25a9a2a4c75723a2f790177f0c6d83433b575d", - "reference": "0f25a9a2a4c75723a2f790177f0c6d83433b575d", + "url": "https://api.github.com/repos/api-platform/validator/zipball/269fea70ef84fb120cddba8027143d7bf43baba5", + "reference": "269fea70ef84fb120cddba8027143d7bf43baba5", "shasum": "" }, "require": { @@ -1213,22 +1213,22 @@ "validator" ], "support": { - "source": "https://github.com/api-platform/validator/tree/v4.1.17" + "source": "https://github.com/api-platform/validator/tree/v4.1.18" }, - "time": "2025-06-06T14:56:47+00:00" + "time": "2025-07-03T13:06:55+00:00" }, { "name": "brick/math", - "version": "0.12.3", + "version": "0.13.1", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" + "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", + "url": "https://api.github.com/repos/brick/math/zipball/fc7ed316430118cc7836bf45faff18d5dfc8de04", + "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04", "shasum": "" }, "require": { @@ -1267,7 +1267,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.3" + "source": "https://github.com/brick/math/tree/0.13.1" }, "funding": [ { @@ -1275,7 +1275,7 @@ "type": "github" } ], - "time": "2025-02-28T13:11:00+00:00" + "time": "2025-03-29T13:50:30+00:00" }, { "name": "doctrine/collections", @@ -1456,16 +1456,16 @@ }, { "name": "doctrine/data-fixtures", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "f7f1e12d6bceb58c204b3e77210a103c1c57601e" + "reference": "f65b353922b7ac48f360428e19b22fcce5aba134" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/f7f1e12d6bceb58c204b3e77210a103c1c57601e", - "reference": "f7f1e12d6bceb58c204b3e77210a103c1c57601e", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/f65b353922b7ac48f360428e19b22fcce5aba134", + "reference": "f65b353922b7ac48f360428e19b22fcce5aba134", "shasum": "" }, "require": { @@ -1479,14 +1479,14 @@ "doctrine/phpcr-odm": "<1.3.0" }, "require-dev": { - "doctrine/coding-standard": "^12", + "doctrine/coding-standard": "^13", "doctrine/dbal": "^3.5 || ^4", "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/orm": "^2.14 || ^3", "ext-sqlite3": "*", "fig/log-test": "^1", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5.3", + "phpstan/phpstan": "2.1.17", + "phpunit/phpunit": "10.5.45", "symfony/cache": "^6.4 || ^7", "symfony/var-exporter": "^6.4 || ^7" }, @@ -1519,7 +1519,7 @@ ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/2.0.2" + "source": "https://github.com/doctrine/data-fixtures/tree/2.0.3" }, "funding": [ { @@ -1535,20 +1535,20 @@ "type": "tidelift" } ], - "time": "2025-01-21T13:21:31+00:00" + "time": "2025-06-27T19:59:58+00:00" }, { "name": "doctrine/dbal", - "version": "4.2.3", + "version": "4.2.4", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "33d2d7fe1269b2301640c44cf2896ea607b30e3e" + "reference": "b37d160498ea91a2382a2ebe825c4ea6254fc0ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/33d2d7fe1269b2301640c44cf2896ea607b30e3e", - "reference": "33d2d7fe1269b2301640c44cf2896ea607b30e3e", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/b37d160498ea91a2382a2ebe825c4ea6254fc0ec", + "reference": "b37d160498ea91a2382a2ebe825c4ea6254fc0ec", "shasum": "" }, "require": { @@ -1558,15 +1558,15 @@ "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "12.0.0", + "doctrine/coding-standard": "13.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.2", - "phpstan/phpstan": "2.1.1", - "phpstan/phpstan-phpunit": "2.0.3", + "phpstan/phpstan": "2.1.17", + "phpstan/phpstan-phpunit": "2.0.6", "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "10.5.39", - "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.10.2", + "phpunit/phpunit": "10.5.46", + "slevomat/coding-standard": "8.16.2", + "squizlabs/php_codesniffer": "3.13.1", "symfony/cache": "^6.3.8|^7.0", "symfony/console": "^5.4|^6.3|^7.0" }, @@ -1625,7 +1625,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.2.3" + "source": "https://github.com/doctrine/dbal/tree/4.2.4" }, "funding": [ { @@ -1641,7 +1641,7 @@ "type": "tidelift" } ], - "time": "2025-03-07T18:29:05+00:00" + "time": "2025-06-15T23:15:01+00:00" }, { "name": "doctrine/deprecations", @@ -1693,16 +1693,16 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.14.0", + "version": "2.15.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "ca6a7350b421baf7fbdefbf9f4993292ed18effb" + "reference": "d88294521a1bca943240adca65fa19ca8a7288c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/ca6a7350b421baf7fbdefbf9f4993292ed18effb", - "reference": "ca6a7350b421baf7fbdefbf9f4993292ed18effb", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/d88294521a1bca943240adca65fa19ca8a7288c6", + "reference": "d88294521a1bca943240adca65fa19ca8a7288c6", "shasum": "" }, "require": { @@ -1729,9 +1729,9 @@ "require-dev": { "doctrine/annotations": "^1 || ^2", "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^12", + "doctrine/coding-standard": "^13", "doctrine/deprecations": "^1.0", - "doctrine/orm": "^2.17 || ^3.0", + "doctrine/orm": "^2.17 || ^3.1", "friendsofphp/proxy-manager-lts": "^1.0", "phpstan/phpstan": "2.1.1", "phpstan/phpstan-phpunit": "2.0.3", @@ -1795,7 +1795,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.14.0" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.15.0" }, "funding": [ { @@ -1811,7 +1811,7 @@ "type": "tidelift" } ], - "time": "2025-03-22T17:28:21+00:00" + "time": "2025-06-16T19:53:58+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", @@ -1901,16 +1901,16 @@ }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.4.1", + "version": "3.4.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "e858ce0f5c12b266dce7dce24834448355155da7" + "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/e858ce0f5c12b266dce7dce24834448355155da7", - "reference": "e858ce0f5c12b266dce7dce24834448355155da7", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/5a6ac7120c2924c4c070a869d08b11ccf9e277b9", + "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9", "shasum": "" }, "require": { @@ -1924,7 +1924,6 @@ "composer/semver": "^3.0", "doctrine/coding-standard": "^12", "doctrine/orm": "^2.6 || ^3", - "doctrine/persistence": "^2.0 || ^3", "phpstan/phpstan": "^1.4 || ^2", "phpstan/phpstan-deprecation-rules": "^1 || ^2", "phpstan/phpstan-phpunit": "^1 || ^2", @@ -1967,7 +1966,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.1" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.2" }, "funding": [ { @@ -1983,7 +1982,7 @@ "type": "tidelift" } ], - "time": "2025-01-27T22:48:22+00:00" + "time": "2025-03-11T17:36:26+00:00" }, { "name": "doctrine/event-manager", @@ -2316,16 +2315,16 @@ }, { "name": "doctrine/migrations", - "version": "3.9.0", + "version": "3.9.1", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "325b61e41d032f5f7d7e2d11cbefff656eadc9ab" + "reference": "0f1e0c960ac29866d648a4f50142a74fe1cb6999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/325b61e41d032f5f7d7e2d11cbefff656eadc9ab", - "reference": "325b61e41d032f5f7d7e2d11cbefff656eadc9ab", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/0f1e0c960ac29866d648a4f50142a74fe1cb6999", + "reference": "0f1e0c960ac29866d648a4f50142a74fe1cb6999", "shasum": "" }, "require": { @@ -2399,7 +2398,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.9.0" + "source": "https://github.com/doctrine/migrations/tree/3.9.1" }, "funding": [ { @@ -2415,20 +2414,20 @@ "type": "tidelift" } ], - "time": "2025-03-26T06:48:45+00:00" + "time": "2025-06-27T07:19:23+00:00" }, { "name": "doctrine/orm", - "version": "3.3.2", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "c9557c588b3a70ed93caff069d0aa75737f25609" + "reference": "6deec3655ba3e8f15280aac11e264225854d2369" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/c9557c588b3a70ed93caff069d0aa75737f25609", - "reference": "c9557c588b3a70ed93caff069d0aa75737f25609", + "url": "https://api.github.com/repos/doctrine/orm/zipball/6deec3655ba3e8f15280aac11e264225854d2369", + "reference": "6deec3655ba3e8f15280aac11e264225854d2369", "shasum": "" }, "require": { @@ -2448,7 +2447,7 @@ "symfony/var-exporter": "^6.3.9 || ^7.0" }, "require-dev": { - "doctrine/coding-standard": "^12.0", + "doctrine/coding-standard": "^13.0", "phpbench/phpbench": "^1.0", "phpdocumentor/guides-cli": "^1.4", "phpstan/extension-installer": "^1.4", @@ -2456,7 +2455,7 @@ "phpstan/phpstan-deprecation-rules": "^2", "phpunit/phpunit": "^10.4.0", "psr/log": "^1 || ^2 || ^3", - "squizlabs/php_codesniffer": "3.7.2", + "squizlabs/php_codesniffer": "3.12.0", "symfony/cache": "^5.4 || ^6.2 || ^7.0" }, "suggest": { @@ -2503,9 +2502,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.3.2" + "source": "https://github.com/doctrine/orm/tree/3.5.0" }, - "time": "2025-02-04T19:43:15+00:00" + "time": "2025-07-01T17:40:53+00:00" }, { "name": "doctrine/persistence", @@ -3446,20 +3445,20 @@ }, { "name": "spomky-labs/pki-framework", - "version": "1.2.2", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/pki-framework.git", - "reference": "5ac374c3e295c8b917208ff41b4d30f76668478c" + "reference": "eced5b5ce70518b983ff2be486e902bbd15135ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/5ac374c3e295c8b917208ff41b4d30f76668478c", - "reference": "5ac374c3e295c8b917208ff41b4d30f76668478c", + "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/eced5b5ce70518b983ff2be486e902bbd15135ae", + "reference": "eced5b5ce70518b983ff2be486e902bbd15135ae", "shasum": "" }, "require": { - "brick/math": "^0.10|^0.11|^0.12", + "brick/math": "^0.10|^0.11|^0.12|^0.13", "ext-mbstring": "*", "php": ">=8.1" }, @@ -3474,7 +3473,7 @@ "phpstan/phpstan-deprecation-rules": "^1.0|^2.0", "phpstan/phpstan-phpunit": "^1.1|^2.0", "phpstan/phpstan-strict-rules": "^1.3|^2.0", - "phpunit/phpunit": "^10.1|^11.0", + "phpunit/phpunit": "^10.1|^11.0|^12.0", "rector/rector": "^1.0|^2.0", "roave/security-advisories": "dev-latest", "symfony/string": "^6.4|^7.0", @@ -3539,7 +3538,7 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/pki-framework/issues", - "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.2.2" + "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.3.0" }, "funding": [ { @@ -3551,20 +3550,20 @@ "type": "patreon" } ], - "time": "2025-01-03T09:35:48+00:00" + "time": "2025-06-13T08:35:04+00:00" }, { "name": "symfony/asset", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "cb926cd59fefa1f9b4900b3695f0f846797ba5c0" + "reference": "56c4d9f759247c4e07d8549e3baf7493cb9c3e4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/cb926cd59fefa1f9b4900b3695f0f846797ba5c0", - "reference": "cb926cd59fefa1f9b4900b3695f0f846797ba5c0", + "url": "https://api.github.com/repos/symfony/asset/zipball/56c4d9f759247c4e07d8549e3baf7493cb9c3e4b", + "reference": "56c4d9f759247c4e07d8549e3baf7493cb9c3e4b", "shasum": "" }, "require": { @@ -3604,7 +3603,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/v7.2.0" + "source": "https://github.com/symfony/asset/tree/v7.3.0" }, "funding": [ { @@ -3620,27 +3619,27 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:15:23+00:00" + "time": "2025-03-05T10:15:41+00:00" }, { "name": "symfony/cache", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "9131e3018872d2ebb6fe8a9a4d6631273513d42c" + "reference": "a7c6caa9d6113cebfb3020b427bcb021ebfdfc9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/9131e3018872d2ebb6fe8a9a4d6631273513d42c", - "reference": "9131e3018872d2ebb6fe8a9a4d6631273513d42c", + "url": "https://api.github.com/repos/symfony/cache/zipball/a7c6caa9d6113cebfb3020b427bcb021ebfdfc9e", + "reference": "a7c6caa9d6113cebfb3020b427bcb021ebfdfc9e", "shasum": "" }, "require": { "php": ">=8.2", "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^2.5|^3", + "symfony/cache-contracts": "^3.6", "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/service-contracts": "^2.5|^3", "symfony/var-exporter": "^6.4|^7.0" @@ -3702,7 +3701,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.2.5" + "source": "https://github.com/symfony/cache/tree/v7.3.1" }, "funding": [ { @@ -3718,11 +3717,87 @@ "type": "tidelift" } ], - "time": "2025-03-25T15:54:33+00:00" + "time": "2025-06-27T19:55:54+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/5d68a57d66910405e5c0b63d6f0af941e66fc868", + "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^3.0" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-03-13T15:25:07+00:00" }, { "name": "symfony/clock", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", @@ -3776,7 +3851,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.2.0" + "source": "https://github.com/symfony/clock/tree/v7.3.0" }, "funding": [ { @@ -3796,16 +3871,16 @@ }, { "name": "symfony/config", - "version": "v7.2.3", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "7716594aaae91d9141be080240172a92ecca4d44" + "reference": "ba62ae565f1327c2f6366726312ed828c85853bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/7716594aaae91d9141be080240172a92ecca4d44", - "reference": "7716594aaae91d9141be080240172a92ecca4d44", + "url": "https://api.github.com/repos/symfony/config/zipball/ba62ae565f1327c2f6366726312ed828c85853bc", + "reference": "ba62ae565f1327c2f6366726312ed828c85853bc", "shasum": "" }, "require": { @@ -3851,7 +3926,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/v7.2.3" + "source": "https://github.com/symfony/config/tree/v7.3.0" }, "funding": [ { @@ -3867,27 +3942,28 @@ "type": "tidelift" } ], - "time": "2025-01-22T12:07:01+00:00" + "time": "2025-05-15T09:04:05+00:00" }, { "name": "symfony/console", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "e51498ea18570c062e7df29d05a7003585b19b88" + "reference": "9e27aecde8f506ba0fd1d9989620c04a87697101" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e51498ea18570c062e7df29d05a7003585b19b88", - "reference": "e51498ea18570c062e7df29d05a7003585b19b88", + "url": "https://api.github.com/repos/symfony/console/zipball/9e27aecde8f506ba0fd1d9989620c04a87697101", + "reference": "9e27aecde8f506ba0fd1d9989620c04a87697101", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0" + "symfony/string": "^7.2" }, "conflict": { "symfony/dependency-injection": "<6.4", @@ -3944,7 +4020,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.2.5" + "source": "https://github.com/symfony/console/tree/v7.3.1" }, "funding": [ { @@ -3960,57 +4036,51 @@ "type": "tidelift" } ], - "time": "2025-03-12T08:11:12+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { - "name": "symfony/contracts", - "version": "v3.6.0", + "name": "symfony/dependency-injection", + "version": "v7.3.1", "source": { "type": "git", - "url": "https://github.com/symfony/contracts.git", - "reference": "6e489617c52619f6a4f92986dfd19eb52d83de1f" + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "8656c4848b48784c4bb8c4ae50d2b43f832cead8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/contracts/zipball/6e489617c52619f6a4f92986dfd19eb52d83de1f", - "reference": "6e489617c52619f6a4f92986dfd19eb52d83de1f", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/8656c4848b48784c4bb8c4ae50d2b43f832cead8", + "reference": "8656c4848b48784c4bb8c4ae50d2b43f832cead8", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/cache": "^3.0", + "php": ">=8.2", "psr/container": "^1.1|^2.0", - "psr/event-dispatcher": "^1.0" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^3.5", + "symfony/var-exporter": "^6.4.20|^7.2.5" }, "conflict": { - "ext-psr": "<1.1|>=2" + "ext-psr": "<1.1|>=2", + "symfony/config": "<6.4", + "symfony/finder": "<6.4", + "symfony/yaml": "<6.4" }, - "replace": { - "symfony/cache-contracts": "self.version", - "symfony/deprecation-contracts": "self.version", - "symfony/event-dispatcher-contracts": "self.version", - "symfony/http-client-contracts": "self.version", - "symfony/service-contracts": "self.version", - "symfony/translation-contracts": "self.version" + "provide": { + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" }, "require-dev": { - "symfony/polyfill-intl-idn": "^1.10" + "symfony/config": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.6-dev" - } - }, "autoload": { - "files": [ - "Deprecation/function.php" - ], "psr-4": { - "Symfony\\Contracts\\": "" + "Symfony\\Component\\DependencyInjection\\": "" }, "exclude-from-classmap": [ - "**/Tests/" + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4019,27 +4089,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "A set of abstractions extracted out of the Symfony components", + "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "dev", - "interfaces", - "interoperability", - "standards" - ], "support": { - "source": "https://github.com/symfony/contracts/tree/v3.6.0" + "source": "https://github.com/symfony/dependency-injection/tree/v7.3.1" }, "funding": [ { @@ -4055,51 +4116,38 @@ "type": "tidelift" } ], - "time": "2025-05-01T12:12:53+00:00" + "time": "2025-06-24T04:04:43+00:00" }, { - "name": "symfony/dependency-injection", - "version": "v7.2.5", + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", "source": { "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "58ab71379f14a741755717cece2868bf41ed45d8" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/58ab71379f14a741755717cece2868bf41ed45d8", - "reference": "58ab71379f14a741755717cece2868bf41ed45d8", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { - "php": ">=8.2", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^3.5", - "symfony/var-exporter": "^6.4.20|^7.2.5" - }, - "conflict": { - "ext-psr": "<1.1|>=2", - "symfony/config": "<6.4", - "symfony/finder": "<6.4", - "symfony/yaml": "<6.4" - }, - "provide": { - "psr/container-implementation": "1.1|2.0", - "symfony/service-implementation": "1.1|2.0|3.0" - }, - "require-dev": { - "symfony/config": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0" + "php": ">=8.1" }, "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" }, - "exclude-from-classmap": [ - "/Tests/" + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4108,18 +4156,18 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.2.5" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -4135,20 +4183,20 @@ "type": "tidelift" } ], - "time": "2025-03-13T12:21:46+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "f8a298bbb8eaca08d787bf4d4c74728f1cf98922" + "reference": "6c0acb248c46452ae2c15752dc71e72f3335403f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/f8a298bbb8eaca08d787bf4d4c74728f1cf98922", - "reference": "f8a298bbb8eaca08d787bf4d4c74728f1cf98922", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/6c0acb248c46452ae2c15752dc71e72f3335403f", + "reference": "6c0acb248c46452ae2c15752dc71e72f3335403f", "shasum": "" }, "require": { @@ -4228,7 +4276,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.2.5" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.3.1" }, "funding": [ { @@ -4244,11 +4292,11 @@ "type": "tidelift" } ], - "time": "2025-03-25T15:54:33+00:00" + "time": "2025-06-26T13:02:59+00:00" }, { "name": "symfony/dotenv", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", @@ -4302,7 +4350,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v7.2.0" + "source": "https://github.com/symfony/dotenv/tree/v7.3.0" }, "funding": [ { @@ -4322,16 +4370,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b" + "reference": "35b55b166f6752d6aaf21aa042fc5ed280fce235" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", - "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/35b55b166f6752d6aaf21aa042fc5ed280fce235", + "reference": "35b55b166f6752d6aaf21aa042fc5ed280fce235", "shasum": "" }, "require": { @@ -4344,9 +4392,11 @@ "symfony/http-kernel": "<6.4" }, "require-dev": { + "symfony/console": "^6.4|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0" + "symfony/serializer": "^6.4|^7.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -4377,7 +4427,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/v7.2.5" + "source": "https://github.com/symfony/error-handler/tree/v7.3.1" }, "funding": [ { @@ -4393,20 +4443,20 @@ "type": "tidelift" } ], - "time": "2025-03-03T07:12:39+00:00" + "time": "2025-06-13T07:48:40+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" + "reference": "497f73ac996a598c92409b44ac43b6690c4f666d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d", + "reference": "497f73ac996a598c92409b44ac43b6690c4f666d", "shasum": "" }, "require": { @@ -4457,7 +4507,83 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-04-22T09:11:45+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" }, "funding": [ { @@ -4477,7 +4603,7 @@ }, { "name": "symfony/expression-language", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", @@ -4521,7 +4647,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v7.2.0" + "source": "https://github.com/symfony/expression-language/tree/v7.3.0" }, "funding": [ { @@ -4541,7 +4667,7 @@ }, { "name": "symfony/filesystem", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", @@ -4587,7 +4713,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.2.0" + "source": "https://github.com/symfony/filesystem/tree/v7.3.0" }, "funding": [ { @@ -4607,16 +4733,16 @@ }, { "name": "symfony/finder", - "version": "v7.2.2", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "87a71856f2f56e4100373e92529eed3171695cfb" + "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb", - "reference": "87a71856f2f56e4100373e92529eed3171695cfb", + "url": "https://api.github.com/repos/symfony/finder/zipball/ec2344cf77a48253bbca6939aa3d2477773ea63d", + "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d", "shasum": "" }, "require": { @@ -4651,7 +4777,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.2.2" + "source": "https://github.com/symfony/finder/tree/v7.3.0" }, "funding": [ { @@ -4667,20 +4793,20 @@ "type": "tidelift" } ], - "time": "2024-12-30T19:00:17+00:00" + "time": "2024-12-30T19:00:26+00:00" }, { "name": "symfony/flex", - "version": "v2.5.0", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "8ce1acd9842abe0e9b4c4a0bd3f259859516c018" + "reference": "4ae50d368415a06820739e54d38a4a29d6df9155" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/8ce1acd9842abe0e9b4c4a0bd3f259859516c018", - "reference": "8ce1acd9842abe0e9b4c4a0bd3f259859516c018", + "url": "https://api.github.com/repos/symfony/flex/zipball/4ae50d368415a06820739e54d38a4a29d6df9155", + "reference": "4ae50d368415a06820739e54d38a4a29d6df9155", "shasum": "" }, "require": { @@ -4719,7 +4845,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.5.0" + "source": "https://github.com/symfony/flex/tree/v2.7.1" }, "funding": [ { @@ -4735,20 +4861,20 @@ "type": "tidelift" } ], - "time": "2025-03-03T07:50:46+00:00" + "time": "2025-05-28T14:22:54+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "c1c6ee8946491b698b067df2258e07918c25da02" + "reference": "91905f22f26aa350a33b3b9690bdf94976b0d0ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c1c6ee8946491b698b067df2258e07918c25da02", - "reference": "c1c6ee8946491b698b067df2258e07918c25da02", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/91905f22f26aa350a33b3b9690bdf94976b0d0ab", + "reference": "91905f22f26aa350a33b3b9690bdf94976b0d0ab", "shasum": "" }, "require": { @@ -4756,14 +4882,14 @@ "ext-xml": "*", "php": ">=8.2", "symfony/cache": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", + "symfony/config": "^7.3", "symfony/dependency-injection": "^7.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.4|^7.0", + "symfony/error-handler": "^7.3", "symfony/event-dispatcher": "^6.4|^7.0", "symfony/filesystem": "^7.1", "symfony/finder": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-foundation": "^7.3", "symfony/http-kernel": "^7.2", "symfony/polyfill-mbstring": "~1.0", "symfony/routing": "^6.4|^7.0" @@ -4780,10 +4906,12 @@ "symfony/dotenv": "<6.4", "symfony/form": "<6.4", "symfony/http-client": "<6.4", + "symfony/json-streamer": ">=7.4", "symfony/lock": "<6.4", "symfony/mailer": "<6.4", "symfony/messenger": "<6.4", "symfony/mime": "<6.4", + "symfony/object-mapper": ">=7.4", "symfony/property-access": "<6.4", "symfony/property-info": "<6.4", "symfony/runtime": "<6.4.13|>=7.0,<7.1.6", @@ -4792,13 +4920,13 @@ "symfony/security-csrf": "<7.2", "symfony/serializer": "<7.2.5", "symfony/stopwatch": "<6.4", - "symfony/translation": "<6.4", + "symfony/translation": "<7.3", "symfony/twig-bridge": "<6.4", "symfony/twig-bundle": "<6.4", "symfony/validator": "<6.4", "symfony/web-profiler-bundle": "<6.4", "symfony/webhook": "<7.2", - "symfony/workflow": "<6.4" + "symfony/workflow": "<7.3.0-beta2" }, "require-dev": { "doctrine/persistence": "^1.3|^2|^3", @@ -4817,11 +4945,13 @@ "symfony/form": "^6.4|^7.0", "symfony/html-sanitizer": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0", + "symfony/json-streamer": "7.3.*", "symfony/lock": "^6.4|^7.0", "symfony/mailer": "^6.4|^7.0", "symfony/messenger": "^6.4|^7.0", "symfony/mime": "^6.4|^7.0", "symfony/notifier": "^6.4|^7.0", + "symfony/object-mapper": "^v7.3.0-beta2", "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0", @@ -4832,14 +4962,14 @@ "symfony/serializer": "^7.2.5", "symfony/stopwatch": "^6.4|^7.0", "symfony/string": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", + "symfony/translation": "^7.3", "symfony/twig-bundle": "^6.4|^7.0", "symfony/type-info": "^7.1", "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/web-link": "^6.4|^7.0", "symfony/webhook": "^7.2", - "symfony/workflow": "^6.4|^7.0", + "symfony/workflow": "^7.3", "symfony/yaml": "^6.4|^7.0", "twig/twig": "^3.12" }, @@ -4869,7 +4999,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/v7.2.5" + "source": "https://github.com/symfony/framework-bundle/tree/v7.3.1" }, "funding": [ { @@ -4885,20 +5015,20 @@ "type": "tidelift" } ], - "time": "2025-03-24T12:37:32+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/http-client", - "version": "v7.2.4", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "78981a2ffef6437ed92d4d7e2a86a82f256c6dc6" + "reference": "4403d87a2c16f33345dca93407a8714ee8c05a64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/78981a2ffef6437ed92d4d7e2a86a82f256c6dc6", - "reference": "78981a2ffef6437ed92d4d7e2a86a82f256c6dc6", + "url": "https://api.github.com/repos/symfony/http-client/zipball/4403d87a2c16f33345dca93407a8714ee8c05a64", + "reference": "4403d87a2c16f33345dca93407a8714ee8c05a64", "shasum": "" }, "require": { @@ -4910,6 +5040,7 @@ }, "conflict": { "amphp/amp": "<2.5", + "amphp/socket": "<1.1", "php-http/discovery": "<1.15", "symfony/http-foundation": "<6.4" }, @@ -4922,7 +5053,6 @@ "require-dev": { "amphp/http-client": "^4.2.1|^5.0", "amphp/http-tunnel": "^1.0|^2.0", - "amphp/socket": "^1.1", "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", @@ -4938,10 +5068,83 @@ "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\HttpClient\\": "" + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v7.3.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-28T07:58:39+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "75d7043853a42837e68111812f4d964b01e5101c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", + "reference": "75d7043853a42837e68111812f4d964b01e5101c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4958,13 +5161,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "description": "Generic abstractions related to HTTP clients", "homepage": "https://symfony.com", "keywords": [ - "http" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.2.4" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" }, "funding": [ { @@ -4980,20 +5188,20 @@ "type": "tidelift" } ], - "time": "2025-02-13T10:27:23+00:00" + "time": "2025-04-29T11:18:49+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "371272aeb6286f8135e028ca535f8e4d6f114126" + "reference": "23dd60256610c86a3414575b70c596e5deff6ed9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/371272aeb6286f8135e028ca535f8e4d6f114126", - "reference": "371272aeb6286f8135e028ca535f8e4d6f114126", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/23dd60256610c86a3414575b70c596e5deff6ed9", + "reference": "23dd60256610c86a3414575b70c596e5deff6ed9", "shasum": "" }, "require": { @@ -5010,6 +5218,7 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "symfony/cache": "^6.4.12|^7.1.5", + "symfony/clock": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/expression-language": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", @@ -5042,7 +5251,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.2.5" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.1" }, "funding": [ { @@ -5058,20 +5267,20 @@ "type": "tidelift" } ], - "time": "2025-03-25T15:54:33+00:00" + "time": "2025-06-23T15:07:14+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54" + "reference": "1644879a66e4aa29c36fe33dfa6c54b450ce1831" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b1fe91bc1fa454a806d3f98db4ba826eb9941a54", - "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1644879a66e4aa29c36fe33dfa6c54b450ce1831", + "reference": "1644879a66e4aa29c36fe33dfa6c54b450ce1831", "shasum": "" }, "require": { @@ -5079,8 +5288,8 @@ "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/event-dispatcher": "^7.3", + "symfony/http-foundation": "^7.3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -5156,7 +5365,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/v7.2.5" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.1" }, "funding": [ { @@ -5172,7 +5381,7 @@ "type": "tidelift" } ], - "time": "2025-03-28T13:32:50+00:00" + "time": "2025-06-28T08:24:55+00:00" }, { "name": "symfony/mercure", @@ -5343,16 +5552,16 @@ }, { "name": "symfony/monolog-bridge", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "bbae784f0456c5a87c89d7c1a3fcc9cbee976c1d" + "reference": "1b188c8abbbef25b111da878797514b7a8d33990" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/bbae784f0456c5a87c89d7c1a3fcc9cbee976c1d", - "reference": "bbae784f0456c5a87c89d7c1a3fcc9cbee976c1d", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/1b188c8abbbef25b111da878797514b7a8d33990", + "reference": "1b188c8abbbef25b111da878797514b7a8d33990", "shasum": "" }, "require": { @@ -5401,7 +5610,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v7.2.0" + "source": "https://github.com/symfony/monolog-bridge/tree/v7.3.0" }, "funding": [ { @@ -5417,7 +5626,7 @@ "type": "tidelift" } ], - "time": "2024-10-14T18:16:08+00:00" + "time": "2025-03-21T12:17:46+00:00" }, { "name": "symfony/monolog-bundle", @@ -5502,16 +5711,16 @@ }, { "name": "symfony/password-hasher", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "d8bd3d66d074c0acba1214a0d42f5941a8e1e94d" + "reference": "31fbe66af859582a20b803f38be96be8accdf2c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/d8bd3d66d074c0acba1214a0d42f5941a8e1e94d", - "reference": "d8bd3d66d074c0acba1214a0d42f5941a8e1e94d", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/31fbe66af859582a20b803f38be96be8accdf2c3", + "reference": "31fbe66af859582a20b803f38be96be8accdf2c3", "shasum": "" }, "require": { @@ -5554,7 +5763,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v7.2.0" + "source": "https://github.com/symfony/password-hasher/tree/v7.3.0" }, "funding": [ { @@ -5570,11 +5779,11 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-02-04T08:22:58+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", @@ -5630,7 +5839,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0" }, "funding": [ { @@ -5650,16 +5859,16 @@ }, { "name": "symfony/polyfill-php84", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd" + "reference": "000df7860439609837bbe28670b0be15783b7fbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/e5493eb51311ab0b1cc2243416613f06ed8f18bd", - "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/000df7860439609837bbe28670b0be15783b7fbf", + "reference": "000df7860439609837bbe28670b0be15783b7fbf", "shasum": "" }, "require": { @@ -5706,7 +5915,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.32.0" }, "funding": [ { @@ -5722,11 +5931,11 @@ "type": "tidelift" } ], - "time": "2024-09-09T12:04:04+00:00" + "time": "2025-02-20T12:04:08+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", @@ -5785,7 +5994,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.32.0" }, "funding": [ { @@ -5805,16 +6014,16 @@ }, { "name": "symfony/property-access", - "version": "v7.2.3", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "b28732e315d81fbec787f838034de7d6c9b2b902" + "reference": "518d15c8cca726ebe665dcd7154074584cf862e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/b28732e315d81fbec787f838034de7d6c9b2b902", - "reference": "b28732e315d81fbec787f838034de7d6c9b2b902", + "url": "https://api.github.com/repos/symfony/property-access/zipball/518d15c8cca726ebe665dcd7154074584cf862e8", + "reference": "518d15c8cca726ebe665dcd7154074584cf862e8", "shasum": "" }, "require": { @@ -5861,7 +6070,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.2.3" + "source": "https://github.com/symfony/property-access/tree/v7.3.1" }, "funding": [ { @@ -5877,26 +6086,27 @@ "type": "tidelift" } ], - "time": "2025-01-17T10:56:55+00:00" + "time": "2025-06-24T04:04:43+00:00" }, { "name": "symfony/property-info", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "f00fd9685ecdbabe82ca25c7b739ce7bba99302c" + "reference": "90586acbf2a6dd13bee4f09f09111c8bd4773970" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/f00fd9685ecdbabe82ca25c7b739ce7bba99302c", - "reference": "f00fd9685ecdbabe82ca25c7b739ce7bba99302c", + "url": "https://api.github.com/repos/symfony/property-info/zipball/90586acbf2a6dd13bee4f09f09111c8bd4773970", + "reference": "90586acbf2a6dd13bee4f09f09111c8bd4773970", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/string": "^6.4|^7.0", - "symfony/type-info": "~7.1.9|^7.2.2" + "symfony/type-info": "~7.2.8|^7.3.1" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2", @@ -5946,7 +6156,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.2.5" + "source": "https://github.com/symfony/property-info/tree/v7.3.1" }, "funding": [ { @@ -5962,20 +6172,20 @@ "type": "tidelift" } ], - "time": "2025-03-06T16:27:19+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/routing", - "version": "v7.2.3", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996" + "reference": "8e213820c5fea844ecea29203d2a308019007c15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/ee9a67edc6baa33e5fae662f94f91fd262930996", - "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996", + "url": "https://api.github.com/repos/symfony/routing/zipball/8e213820c5fea844ecea29203d2a308019007c15", + "reference": "8e213820c5fea844ecea29203d2a308019007c15", "shasum": "" }, "require": { @@ -6027,7 +6237,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.2.3" + "source": "https://github.com/symfony/routing/tree/v7.3.0" }, "funding": [ { @@ -6043,20 +6253,20 @@ "type": "tidelift" } ], - "time": "2025-01-17T10:56:55+00:00" + "time": "2025-05-24T20:43:28+00:00" }, { "name": "symfony/runtime", - "version": "v7.2.3", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "8e8d09bd69b7f6c0260dd3d58f37bd4fbdeab5ad" + "reference": "9516056d432f8acdac9458eb41b80097da7a05c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/8e8d09bd69b7f6c0260dd3d58f37bd4fbdeab5ad", - "reference": "8e8d09bd69b7f6c0260dd3d58f37bd4fbdeab5ad", + "url": "https://api.github.com/repos/symfony/runtime/zipball/9516056d432f8acdac9458eb41b80097da7a05c9", + "reference": "9516056d432f8acdac9458eb41b80097da7a05c9", "shasum": "" }, "require": { @@ -6106,7 +6316,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v7.2.3" + "source": "https://github.com/symfony/runtime/tree/v7.3.1" }, "funding": [ { @@ -6122,20 +6332,20 @@ "type": "tidelift" } ], - "time": "2024-12-29T21:39:47+00:00" + "time": "2025-06-13T07:48:40+00:00" }, { "name": "symfony/security-bundle", - "version": "v7.2.3", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "721de227035c6e4c322fb7dd4839586d58bc0cf5" + "reference": "428a281fd66c8358adc2259c8578e6d81fbb7079" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/721de227035c6e4c322fb7dd4839586d58bc0cf5", - "reference": "721de227035c6e4c322fb7dd4839586d58bc0cf5", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/428a281fd66c8358adc2259c8578e6d81fbb7079", + "reference": "428a281fd66c8358adc2259c8578e6d81fbb7079", "shasum": "" }, "require": { @@ -6143,15 +6353,15 @@ "ext-xml": "*", "php": ">=8.2", "symfony/clock": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", + "symfony/config": "^7.3", "symfony/dependency-injection": "^6.4.11|^7.1.4", "symfony/event-dispatcher": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/password-hasher": "^6.4|^7.0", - "symfony/security-core": "^7.2", + "symfony/security-core": "^7.3", "symfony/security-csrf": "^6.4|^7.0", - "symfony/security-http": "^7.2", + "symfony/security-http": "^7.3", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -6212,7 +6422,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/v7.2.3" + "source": "https://github.com/symfony/security-bundle/tree/v7.3.1" }, "funding": [ { @@ -6228,20 +6438,20 @@ "type": "tidelift" } ], - "time": "2025-01-07T09:39:55+00:00" + "time": "2025-06-24T04:04:43+00:00" }, { "name": "symfony/security-core", - "version": "v7.2.3", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "466784ffcd0b5a16e05394335897f790b17d07e4" + "reference": "fafab1003a31e51506e1a0a83e81c072211d81ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/466784ffcd0b5a16e05394335897f790b17d07e4", - "reference": "466784ffcd0b5a16e05394335897f790b17d07e4", + "url": "https://api.github.com/repos/symfony/security-core/zipball/fafab1003a31e51506e1a0a83e81c072211d81ba", + "reference": "fafab1003a31e51506e1a0a83e81c072211d81ba", "shasum": "" }, "require": { @@ -6299,7 +6509,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v7.2.3" + "source": "https://github.com/symfony/security-core/tree/v7.3.1" }, "funding": [ { @@ -6315,11 +6525,11 @@ "type": "tidelift" } ], - "time": "2025-01-27T11:08:17+00:00" + "time": "2025-06-23T07:28:50+00:00" }, { "name": "symfony/security-csrf", - "version": "v7.2.3", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", @@ -6369,7 +6579,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v7.2.3" + "source": "https://github.com/symfony/security-csrf/tree/v7.3.0" }, "funding": [ { @@ -6389,16 +6599,16 @@ }, { "name": "symfony/security-http", - "version": "v7.2.4", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "8478e95e273f8daa23bf4860dbad2a09d3fb3722" + "reference": "b7182ed0fd2359297f78ff6d407265168255ea84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/8478e95e273f8daa23bf4860dbad2a09d3fb3722", - "reference": "8478e95e273f8daa23bf4860dbad2a09d3fb3722", + "url": "https://api.github.com/repos/symfony/security-http/zipball/b7182ed0fd2359297f78ff6d407265168255ea84", + "reference": "b7182ed0fd2359297f78ff6d407265168255ea84", "shasum": "" }, "require": { @@ -6408,7 +6618,7 @@ "symfony/http-kernel": "^6.4|^7.0", "symfony/polyfill-mbstring": "~1.0", "symfony/property-access": "^6.4|^7.0", - "symfony/security-core": "^7.2", + "symfony/security-core": "^7.3", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -6457,7 +6667,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v7.2.4" + "source": "https://github.com/symfony/security-http/tree/v7.3.1" }, "funding": [ { @@ -6473,20 +6683,20 @@ "type": "tidelift" } ], - "time": "2025-02-11T16:46:20+00:00" + "time": "2025-06-24T04:04:43+00:00" }, { "name": "symfony/serializer", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "d8b75b2c8144c29ac43b235738411f7cca6d584d" + "reference": "feaf837cedbbc8287986602223175d3fd639922d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/d8b75b2c8144c29ac43b235738411f7cca6d584d", - "reference": "d8b75b2c8144c29ac43b235738411f7cca6d584d", + "url": "https://api.github.com/repos/symfony/serializer/zipball/feaf837cedbbc8287986602223175d3fd639922d", + "reference": "feaf837cedbbc8287986602223175d3fd639922d", "shasum": "" }, "require": { @@ -6555,7 +6765,90 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.2.5" + "source": "https://github.com/symfony/serializer/tree/v7.3.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-27T19:55:54+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" }, "funding": [ { @@ -6571,11 +6864,11 @@ "type": "tidelift" } ], - "time": "2025-03-24T12:37:32+00:00" + "time": "2025-04-25T09:37:31+00:00" }, { "name": "symfony/stopwatch", - "version": "v7.2.4", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", @@ -6617,7 +6910,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.2.4" + "source": "https://github.com/symfony/stopwatch/tree/v7.3.0" }, "funding": [ { @@ -6637,16 +6930,16 @@ }, { "name": "symfony/string", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" + "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", + "url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125", + "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125", "shasum": "" }, "require": { @@ -6704,7 +6997,85 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.2.0" + "source": "https://github.com/symfony/string/tree/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-04-20T20:19:01+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" }, "funding": [ { @@ -6720,27 +7091,27 @@ "type": "tidelift" } ], - "time": "2024-11-13T13:31:26+00:00" + "time": "2024-09-27T08:32:26+00:00" }, { "name": "symfony/twig-bridge", - "version": "v7.2.5", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "b1942d5515b7f0a18e16fd668a04ea952db2b0f2" + "reference": "082eb15d8a4f9afee0acc4709fbe3aaf26d48891" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/b1942d5515b7f0a18e16fd668a04ea952db2b0f2", - "reference": "b1942d5515b7f0a18e16fd668a04ea952db2b0f2", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/082eb15d8a4f9afee0acc4709fbe3aaf26d48891", + "reference": "082eb15d8a4f9afee0acc4709fbe3aaf26d48891", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/translation-contracts": "^2.5|^3", - "twig/twig": "^3.12" + "twig/twig": "^3.21" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.2.2", @@ -6767,7 +7138,7 @@ "symfony/finder": "^6.4|^7.0", "symfony/form": "^6.4.20|^7.2.5", "symfony/html-sanitizer": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-foundation": "^7.3", "symfony/http-kernel": "^6.4|^7.0", "symfony/intl": "^6.4|^7.0", "symfony/mime": "^6.4|^7.0", @@ -6781,12 +7152,13 @@ "symfony/serializer": "^6.4.3|^7.0.3", "symfony/stopwatch": "^6.4|^7.0", "symfony/translation": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", "symfony/web-link": "^6.4|^7.0", "symfony/workflow": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", - "twig/cssinliner-extra": "^2.12|^3", - "twig/inky-extra": "^2.12|^3", - "twig/markdown-extra": "^2.12|^3" + "twig/cssinliner-extra": "^3", + "twig/inky-extra": "^3", + "twig/markdown-extra": "^3" }, "type": "symfony-bridge", "autoload": { @@ -6814,7 +7186,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.2.5" + "source": "https://github.com/symfony/twig-bridge/tree/v7.3.0" }, "funding": [ { @@ -6830,30 +7202,30 @@ "type": "tidelift" } ], - "time": "2025-03-28T13:15:09+00:00" + "time": "2025-05-19T13:28:56+00:00" }, { "name": "symfony/twig-bundle", - "version": "v7.2.0", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "cd2be4563afaef5285bb6e0a06c5445e644a5c01" + "reference": "bc23c11d9716fc2261ee26a32e654b0e8b1b1896" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/cd2be4563afaef5285bb6e0a06c5445e644a5c01", - "reference": "cd2be4563afaef5285bb6e0a06c5445e644a5c01", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/bc23c11d9716fc2261ee26a32e654b0e8b1b1896", + "reference": "bc23c11d9716fc2261ee26a32e654b0e8b1b1896", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "php": ">=8.2", - "symfony/config": "^6.4|^7.0", + "symfony/config": "^7.3", "symfony/dependency-injection": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", - "symfony/twig-bridge": "^6.4|^7.0", + "symfony/twig-bridge": "^7.3", "twig/twig": "^3.12" }, "conflict": { @@ -6898,7 +7270,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/v7.2.0" + "source": "https://github.com/symfony/twig-bundle/tree/v7.3.1" }, "funding": [ { @@ -6914,28 +7286,32 @@ "type": "tidelift" } ], - "time": "2024-10-23T08:11:15+00:00" + "time": "2025-06-24T04:04:43+00:00" }, { "name": "symfony/type-info", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "c4824a6b658294c828e609d3d8dbb4e87f6a375d" + "reference": "5fa6e25e4195e73ce9e457b521ac5e61ec271150" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/c4824a6b658294c828e609d3d8dbb4e87f6a375d", - "reference": "c4824a6b658294c828e609d3d8dbb4e87f6a375d", + "url": "https://api.github.com/repos/symfony/type-info/zipball/5fa6e25e4195e73ce9e457b521ac5e61ec271150", + "reference": "5fa6e25e4195e73ce9e457b521ac5e61ec271150", "shasum": "" }, "require": { "php": ">=8.2", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.30" }, "require-dev": { - "phpstan/phpdoc-parser": "^1.0|^2.0" + "phpstan/phpdoc-parser": "^1.30|^2.0" }, "type": "library", "autoload": { @@ -6973,7 +7349,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.2.5" + "source": "https://github.com/symfony/type-info/tree/v7.3.1" }, "funding": [ { @@ -6989,20 +7365,20 @@ "type": "tidelift" } ], - "time": "2025-03-24T09:03:36+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/uid", - "version": "v7.2.0", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "2d294d0c48df244c71c105a169d0190bfb080426" + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426", - "reference": "2d294d0c48df244c71c105a169d0190bfb080426", + "url": "https://api.github.com/repos/symfony/uid/zipball/a69f69f3159b852651a6bf45a9fdd149520525bb", + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb", "shasum": "" }, "require": { @@ -7047,7 +7423,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.2.0" + "source": "https://github.com/symfony/uid/tree/v7.3.1" }, "funding": [ { @@ -7063,20 +7439,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/validator", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "d7edd7f44defbc4e0230512f929b5f4c067bb93e" + "reference": "e2f2497c869fc57446f735fbf00cff4de32ae8c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/d7edd7f44defbc4e0230512f929b5f4c067bb93e", - "reference": "d7edd7f44defbc4e0230512f929b5f4c067bb93e", + "url": "https://api.github.com/repos/symfony/validator/zipball/e2f2497c869fc57446f735fbf00cff4de32ae8c3", + "reference": "e2f2497c869fc57446f735fbf00cff4de32ae8c3", "shasum": "" }, "require": { @@ -7113,6 +7489,7 @@ "symfony/mime": "^6.4|^7.0", "symfony/property-access": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0", + "symfony/string": "^6.4|^7.0", "symfony/translation": "^6.4.3|^7.0.3", "symfony/type-info": "^7.1", "symfony/yaml": "^6.4|^7.0" @@ -7144,7 +7521,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v7.2.5" + "source": "https://github.com/symfony/validator/tree/v7.3.1" }, "funding": [ { @@ -7160,24 +7537,25 @@ "type": "tidelift" } ], - "time": "2025-03-21T15:05:21+00:00" + "time": "2025-06-26T13:22:23+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.2.3", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a" + "reference": "6e209fbe5f5a7b6043baba46fe5735a4b85d0d42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6e209fbe5f5a7b6043baba46fe5735a4b85d0d42", + "reference": "6e209fbe5f5a7b6043baba46fe5735a4b85d0d42", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -7227,7 +7605,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.2.3" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.1" }, "funding": [ { @@ -7243,24 +7621,25 @@ "type": "tidelift" } ], - "time": "2025-01-17T11:39:41+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.2.5", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "c37b301818bd7288715d40de634f05781b686ace" + "reference": "c9a1168891b5aaadfd6332ef44393330b3498c4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/c37b301818bd7288715d40de634f05781b686ace", - "reference": "c37b301818bd7288715d40de634f05781b686ace", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/c9a1168891b5aaadfd6332ef44393330b3498c4c", + "reference": "c9a1168891b5aaadfd6332ef44393330b3498c4c", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { "symfony/property-access": "^6.4|^7.0", @@ -7303,7 +7682,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.2.5" + "source": "https://github.com/symfony/var-exporter/tree/v7.3.0" }, "funding": [ { @@ -7319,20 +7698,20 @@ "type": "tidelift" } ], - "time": "2025-03-13T12:21:46+00:00" + "time": "2025-05-15T09:04:05+00:00" }, { "name": "symfony/web-link", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/web-link.git", - "reference": "f537556a885e14a1d28f6c759d41e57e93d0a532" + "reference": "7697f74fce67555665339423ce453cc8216a98ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-link/zipball/f537556a885e14a1d28f6c759d41e57e93d0a532", - "reference": "f537556a885e14a1d28f6c759d41e57e93d0a532", + "url": "https://api.github.com/repos/symfony/web-link/zipball/7697f74fce67555665339423ce453cc8216a98ff", + "reference": "7697f74fce67555665339423ce453cc8216a98ff", "shasum": "" }, "require": { @@ -7386,7 +7765,7 @@ "push" ], "support": { - "source": "https://github.com/symfony/web-link/tree/v7.2.0" + "source": "https://github.com/symfony/web-link/tree/v7.3.0" }, "funding": [ { @@ -7402,20 +7781,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-05-19T13:28:18+00:00" }, { "name": "symfony/yaml", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912" + "reference": "0c3555045a46ab3cd4cc5a69d161225195230edb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912", - "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912", + "url": "https://api.github.com/repos/symfony/yaml/zipball/0c3555045a46ab3cd4cc5a69d161225195230edb", + "reference": "0c3555045a46ab3cd4cc5a69d161225195230edb", "shasum": "" }, "require": { @@ -7458,7 +7837,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.5" + "source": "https://github.com/symfony/yaml/tree/v7.3.1" }, "funding": [ { @@ -7474,20 +7853,20 @@ "type": "tidelift" } ], - "time": "2025-03-03T07:12:39+00:00" + "time": "2025-06-03T06:57:57+00:00" }, { "name": "twig/twig", - "version": "v3.20.0", + "version": "v3.21.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "3468920399451a384bef53cf7996965f7cd40183" + "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/3468920399451a384bef53cf7996965f7cd40183", - "reference": "3468920399451a384bef53cf7996965f7cd40183", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/285123877d4dd97dd7c11842ac5fb7e86e60d81d", + "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d", "shasum": "" }, "require": { @@ -7541,7 +7920,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.20.0" + "source": "https://github.com/twigphp/Twig/tree/v3.21.1" }, "funding": [ { @@ -7553,7 +7932,7 @@ "type": "tidelift" } ], - "time": "2025-02-13T08:34:43+00:00" + "time": "2025-05-03T07:21:55+00:00" }, { "name": "web-token/jwt-bundle", @@ -7919,28 +8298,31 @@ }, { "name": "zenstruck/foundry", - "version": "v2.3.10", + "version": "v2.6.0", "source": { "type": "git", "url": "https://github.com/zenstruck/foundry.git", - "reference": "76c2d4ac9d9c08fd80ca2cb216b42abef46ae3f3" + "reference": "830d5a5243b5b81e79b2b91b67654836490ed833" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zenstruck/foundry/zipball/76c2d4ac9d9c08fd80ca2cb216b42abef46ae3f3", - "reference": "76c2d4ac9d9c08fd80ca2cb216b42abef46ae3f3", + "url": "https://api.github.com/repos/zenstruck/foundry/zipball/830d5a5243b5b81e79b2b91b67654836490ed833", + "reference": "830d5a5243b5b81e79b2b91b67654836490ed833", "shasum": "" }, "require": { - "doctrine/persistence": "^2.0|^3.0|^4.0", "fakerphp/faker": "^1.23", "php": ">=8.1", "symfony/deprecation-contracts": "^2.2|^3.0", - "symfony/framework-bundle": "^6.4|^7.0", "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", "symfony/var-exporter": "^6.4.9|~7.0.9|^7.1.2", "zenstruck/assert": "^1.4" }, + "conflict": { + "doctrine/persistence": "<2.0", + "symfony/framework-bundle": "<6.4" + }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8", "brianium/paratest": "^6|^7", @@ -7952,9 +8334,11 @@ "doctrine/mongodb-odm": "^2.4", "doctrine/mongodb-odm-bundle": "^4.6|^5.0", "doctrine/orm": "^2.16|^3.0", - "phpunit/phpunit": "^9.5.0 || ^10.0 || ^11.0", + "doctrine/persistence": "^2.0|^3.0|^4.0", + "phpunit/phpunit": "^9.5.0 || ^10.0 || ^11.0 || ^12.0", "symfony/console": "^6.4|^7.0", "symfony/dotenv": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", "symfony/maker-bundle": "^1.55", "symfony/phpunit-bridge": "^6.4|^7.0", "symfony/runtime": "^6.4|^7.0", @@ -8012,7 +8396,7 @@ ], "support": { "issues": "https://github.com/zenstruck/foundry/issues", - "source": "https://github.com/zenstruck/foundry/tree/v2.3.10" + "source": "https://github.com/zenstruck/foundry/tree/v2.6.0" }, "funding": [ { @@ -8020,7 +8404,7 @@ "type": "github" } ], - "time": "2025-03-31T09:53:36+00:00" + "time": "2025-06-05T08:34:41+00:00" } ], "packages-dev": [ @@ -8095,16 +8479,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "6.4.1", + "version": "6.4.2", "source": { "type": "git", "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "35d262c94959571e8736db1e5c9bc36ab94ae900" + "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/35d262c94959571e8736db1e5c9bc36ab94ae900", - "reference": "35d262c94959571e8736db1e5c9bc36ab94ae900", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ce1fd2d47799bb60668643bc6220f6278a4c1d02", + "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02", "shasum": "" }, "require": { @@ -8164,9 +8548,9 @@ ], "support": { "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/6.4.1" + "source": "https://github.com/jsonrainbow/json-schema/tree/6.4.2" }, - "time": "2025-04-04T13:08:07+00:00" + "time": "2025-06-03T18:27:04+00:00" }, { "name": "marc-mabe/php-enum", @@ -8310,16 +8694,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.13.0", + "version": "1.13.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414" + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", "shasum": "" }, "require": { @@ -8358,7 +8742,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" }, "funding": [ { @@ -8366,20 +8750,20 @@ "type": "tidelift" } ], - "time": "2025-02-12T12:17:51+00:00" + "time": "2025-04-29T12:36:36+00:00" }, { "name": "nikic/php-parser", - "version": "v5.4.0", + "version": "v5.5.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + "reference": "ae59794362fe85e051a58ad36b289443f57be7a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9", + "reference": "ae59794362fe85e051a58ad36b289443f57be7a9", "shasum": "" }, "require": { @@ -8422,9 +8806,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0" }, - "time": "2024-12-30T11:07:19+00:00" + "time": "2025-05-31T08:24:38+00:00" }, { "name": "phar-io/manifest", @@ -8641,16 +9025,16 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.11", + "version": "2.1.17", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "8ca5f79a8f63c49b2359065832a654e1ec70ac30" + "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8ca5f79a8f63c49b2359065832a654e1ec70ac30", - "reference": "8ca5f79a8f63c49b2359065832a654e1ec70ac30", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/89b5ef665716fa2a52ecd2633f21007a6a349053", + "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053", "shasum": "" }, "require": { @@ -8695,25 +9079,25 @@ "type": "github" } ], - "time": "2025-03-24T13:45:00+00:00" + "time": "2025-05-21T20:55:28+00:00" }, { "name": "phpstan/phpstan-doctrine", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-doctrine.git", - "reference": "a61a04a361b60014ec04881ccb87252d3bf02e94" + "reference": "4497663eb17b9d29211830df5aceaa3a4d256a35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/a61a04a361b60014ec04881ccb87252d3bf02e94", - "reference": "a61a04a361b60014ec04881ccb87252d3bf02e94", + "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/4497663eb17b9d29211830df5aceaa3a4d256a35", + "reference": "4497663eb17b9d29211830df5aceaa3a4d256a35", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.0.3" + "phpstan/phpstan": "^2.1.13" }, "conflict": { "doctrine/collections": "<1.0", @@ -8737,6 +9121,7 @@ "gedmo/doctrine-extensions": "^3.8", "nesbot/carbon": "^2.49", "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-deprecation-rules": "^2.0.2", "phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^9.6.20", @@ -8764,9 +9149,9 @@ "description": "Doctrine extensions for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-doctrine/issues", - "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.2" + "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.3" }, - "time": "2025-03-03T09:29:16+00:00" + "time": "2025-05-05T15:28:52+00:00" }, { "name": "phpstan/phpstan-phpunit", @@ -8823,22 +9208,22 @@ }, { "name": "phpstan/phpstan-symfony", - "version": "2.0.4", + "version": "2.0.6", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "648087fb4dd865a09b1828a3b0396eb447665f2e" + "reference": "5005288e07583546ea00b52de4a9ac412eb869d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/648087fb4dd865a09b1828a3b0396eb447665f2e", - "reference": "648087fb4dd865a09b1828a3b0396eb447665f2e", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/5005288e07583546ea00b52de4a9ac412eb869d7", + "reference": "5005288e07583546ea00b52de4a9ac412eb869d7", "shasum": "" }, "require": { "ext-simplexml": "*", "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.1.2" + "phpstan/phpstan": "^2.1.13" }, "conflict": { "symfony/framework-bundle": "<3.0" @@ -8848,7 +9233,7 @@ "phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^9.6", - "psr/container": "1.0 || 1.1.1", + "psr/container": "1.1.2", "symfony/config": "^5.4 || ^6.1", "symfony/console": "^5.4 || ^6.1", "symfony/dependency-injection": "^5.4 || ^6.1", @@ -8888,22 +9273,22 @@ "description": "Symfony Framework extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.4" + "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.6" }, - "time": "2025-03-28T12:02:03+00:00" + "time": "2025-05-14T07:00:05+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "12.1.2", + "version": "12.3.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "05c33d01a856f9f62488d144bafddc3d7b7a4ebb" + "reference": "ddec29dfc128eba9c204389960f2063f3b7fa170" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/05c33d01a856f9f62488d144bafddc3d7b7a4ebb", - "reference": "05c33d01a856f9f62488d144bafddc3d7b7a4ebb", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ddec29dfc128eba9c204389960f2063f3b7fa170", + "reference": "ddec29dfc128eba9c204389960f2063f3b7fa170", "shasum": "" }, "require": { @@ -8921,7 +9306,7 @@ "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^12.1" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -8930,7 +9315,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "12.1.x-dev" + "dev-main": "12.3.x-dev" } }, "autoload": { @@ -8959,15 +9344,27 @@ "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.1.2" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.3.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/phpunit/php-code-coverage", + "type": "tidelift" } ], - "time": "2025-04-03T14:34:39+00:00" + "time": "2025-06-18T08:58:13+00:00" }, { "name": "phpunit/php-file-iterator", @@ -9216,16 +9613,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.1.2", + "version": "12.2.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "6f2775cc4b7b19ba5a411c188e855eb0cc78a711" + "reference": "b71849b29f7a8d7574e4401873cb8b539896613f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6f2775cc4b7b19ba5a411c188e855eb0cc78a711", - "reference": "6f2775cc4b7b19ba5a411c188e855eb0cc78a711", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b71849b29f7a8d7574e4401873cb8b539896613f", + "reference": "b71849b29f7a8d7574e4401873cb8b539896613f", "shasum": "" }, "require": { @@ -9235,19 +9632,19 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.0", + "myclabs/deep-copy": "^1.13.1", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", - "phpunit/php-code-coverage": "^12.1.2", + "phpunit/php-code-coverage": "^12.3.1", "phpunit/php-file-iterator": "^6.0.0", "phpunit/php-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", "phpunit/php-timer": "^8.0.0", "sebastian/cli-parser": "^4.0.0", - "sebastian/comparator": "^7.0.1", + "sebastian/comparator": "^7.1.0", "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.0.0", + "sebastian/environment": "^8.0.2", "sebastian/exporter": "^7.0.0", "sebastian/global-state": "^8.0.0", "sebastian/object-enumerator": "^7.0.0", @@ -9261,7 +9658,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "12.1-dev" + "dev-main": "12.2-dev" } }, "autoload": { @@ -9293,7 +9690,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.1.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.2.5" }, "funding": [ { @@ -9304,12 +9701,80 @@ "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" } ], - "time": "2025-04-08T08:05:27+00:00" + "time": "2025-06-27T04:37:55+00:00" + }, + { + "name": "rector/rector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "d513dea45a94394b660e15c155d1fa27826f8e30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/d513dea45a94394b660e15c155d1fa27826f8e30", + "reference": "d513dea45a94394b660e15c155d1fa27826f8e30", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "phpstan/phpstan": "^2.1.17" + }, + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "suggest": { + "ext-dom": "To manipulate phpunit.xml via the custom-rule command" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "homepage": "https://getrector.com/", + "keywords": [ + "automation", + "dev", + "migration", + "refactoring" + ], + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2025-06-24T20:26:57+00:00" }, { "name": "sebastian/cli-parser", @@ -9370,16 +9835,16 @@ }, { "name": "sebastian/comparator", - "version": "7.0.1", + "version": "7.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "b478f34614f934e0291598d0c08cbaba9644bee5" + "reference": "03d905327dccc0851c9a08d6a979dfc683826b6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/b478f34614f934e0291598d0c08cbaba9644bee5", - "reference": "b478f34614f934e0291598d0c08cbaba9644bee5", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/03d905327dccc0851c9a08d6a979dfc683826b6f", + "reference": "03d905327dccc0851c9a08d6a979dfc683826b6f", "shasum": "" }, "require": { @@ -9390,7 +9855,7 @@ "sebastian/exporter": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^12.2" }, "suggest": { "ext-bcmath": "For comparing BcMath\\Number objects" @@ -9398,7 +9863,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "7.1-dev" } }, "autoload": { @@ -9438,15 +9903,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/7.0.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.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/comparator", + "type": "tidelift" } ], - "time": "2025-03-07T07:00:32+00:00" + "time": "2025-06-17T07:41:58+00:00" }, { "name": "sebastian/complexity", @@ -9575,16 +10052,16 @@ }, { "name": "sebastian/environment", - "version": "8.0.0", + "version": "8.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8afe311eca49171bf95405cc0078be9a3821f9f2" + "reference": "d364b9e5d0d3b18a2573351a1786fbf96b7e0792" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8afe311eca49171bf95405cc0078be9a3821f9f2", - "reference": "8afe311eca49171bf95405cc0078be9a3821f9f2", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d364b9e5d0d3b18a2573351a1786fbf96b7e0792", + "reference": "d364b9e5d0d3b18a2573351a1786fbf96b7e0792", "shasum": "" }, "require": { @@ -9627,15 +10104,27 @@ "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.0" + "source": "https://github.com/sebastianbergmann/environment/tree/8.0.2" }, "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/environment", + "type": "tidelift" } ], - "time": "2025-02-07T04:56:08+00:00" + "time": "2025-05-21T15:05:44+00:00" }, { "name": "sebastian/exporter", @@ -10178,16 +10667,16 @@ }, { "name": "symfony/browser-kit", - "version": "v7.2.4", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "8ce0ee23857d87d5be493abba2d52d1f9e49da61" + "reference": "5384291845e74fd7d54f3d925c4a86ce12336593" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/8ce0ee23857d87d5be493abba2d52d1f9e49da61", - "reference": "8ce0ee23857d87d5be493abba2d52d1f9e49da61", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/5384291845e74fd7d54f3d925c4a86ce12336593", + "reference": "5384291845e74fd7d54f3d925c4a86ce12336593", "shasum": "" }, "require": { @@ -10226,7 +10715,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v7.2.4" + "source": "https://github.com/symfony/browser-kit/tree/v7.3.0" }, "funding": [ { @@ -10242,11 +10731,11 @@ "type": "tidelift" } ], - "time": "2025-02-14T14:27:24+00:00" + "time": "2025-03-05T10:15:41+00:00" }, { "name": "symfony/css-selector", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", @@ -10291,7 +10780,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.2.0" + "source": "https://github.com/symfony/css-selector/tree/v7.3.0" }, "funding": [ { @@ -10311,32 +10800,29 @@ }, { "name": "symfony/debug-bundle", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "2dade0d1415c08b627379b5ec214ec8424cb2e32" + "reference": "781acc90f31f5fe18915f9276890864ebbbe3da8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/2dade0d1415c08b627379b5ec214ec8424cb2e32", - "reference": "2dade0d1415c08b627379b5ec214ec8424cb2e32", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/781acc90f31f5fe18915f9276890864ebbbe3da8", + "reference": "781acc90f31f5fe18915f9276890864ebbbe3da8", "shasum": "" }, "require": { + "composer-runtime-api": ">=2.1", "ext-xml": "*", "php": ">=8.2", + "symfony/config": "^7.3", "symfony/dependency-injection": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/twig-bridge": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0" }, - "conflict": { - "symfony/config": "<6.4", - "symfony/dependency-injection": "<6.4" - }, "require-dev": { - "symfony/config": "^6.4|^7.0", "symfony/web-profiler-bundle": "^6.4|^7.0" }, "type": "symfony-bundle", @@ -10365,7 +10851,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/v7.2.0" + "source": "https://github.com/symfony/debug-bundle/tree/v7.3.0" }, "funding": [ { @@ -10381,20 +10867,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-05-04T13:21:13+00:00" }, { "name": "symfony/dom-crawler", - "version": "v7.2.4", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "19cc7b08efe9ad1ab1b56e0948e8d02e15ed3ef7" + "reference": "8b2ee2e06ab99fa5f067b6699296d4e35c156bb9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/19cc7b08efe9ad1ab1b56e0948e8d02e15ed3ef7", - "reference": "19cc7b08efe9ad1ab1b56e0948e8d02e15ed3ef7", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/8b2ee2e06ab99fa5f067b6699296d4e35c156bb9", + "reference": "8b2ee2e06ab99fa5f067b6699296d4e35c156bb9", "shasum": "" }, "require": { @@ -10432,7 +10918,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v7.2.4" + "source": "https://github.com/symfony/dom-crawler/tree/v7.3.1" }, "funding": [ { @@ -10448,25 +10934,25 @@ "type": "tidelift" } ], - "time": "2025-02-17T15:53:07+00:00" + "time": "2025-06-15T10:07:06+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.62.1", + "version": "v1.63.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "468ff2708200c95ebc0d85d3174b6c6711b8a590" + "reference": "69478ab39bc303abfbe3293006a78b09a8512425" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/468ff2708200c95ebc0d85d3174b6c6711b8a590", - "reference": "468ff2708200c95ebc0d85d3174b6c6711b8a590", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/69478ab39bc303abfbe3293006a78b09a8512425", + "reference": "69478ab39bc303abfbe3293006a78b09a8512425", "shasum": "" }, "require": { "doctrine/inflector": "^2.0", - "nikic/php-parser": "^4.18|^5.0", + "nikic/php-parser": "^5.0", "php": ">=8.1", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", @@ -10524,7 +11010,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.62.1" + "source": "https://github.com/symfony/maker-bundle/tree/v1.63.0" }, "funding": [ { @@ -10540,20 +11026,20 @@ "type": "tidelift" } ], - "time": "2025-01-15T00:21:40+00:00" + "time": "2025-04-26T01:41:37+00:00" }, { "name": "symfony/process", - "version": "v7.2.5", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "87b7c93e57df9d8e39a093d32587702380ff045d" + "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d", - "reference": "87b7c93e57df9d8e39a093d32587702380ff045d", + "url": "https://api.github.com/repos/symfony/process/zipball/40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", + "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", "shasum": "" }, "require": { @@ -10585,7 +11071,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.2.5" + "source": "https://github.com/symfony/process/tree/v7.3.0" }, "funding": [ { @@ -10601,25 +11087,27 @@ "type": "tidelift" } ], - "time": "2025-03-13T12:21:46+00:00" + "time": "2025-04-17T09:11:12+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v7.2.4", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "4ffde1c860a100533b02697d9aaf5f45759ec26a" + "reference": "47c994d8f08817122ffb48bf2ea4fb97b7e00d51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/4ffde1c860a100533b02697d9aaf5f45759ec26a", - "reference": "4ffde1c860a100533b02697d9aaf5f45759ec26a", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/47c994d8f08817122ffb48bf2ea4fb97b7e00d51", + "reference": "47c994d8f08817122ffb48bf2ea4fb97b7e00d51", "shasum": "" }, "require": { + "composer-runtime-api": ">=2.1", "php": ">=8.2", - "symfony/config": "^6.4|^7.0", + "symfony/config": "^7.3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/framework-bundle": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/routing": "^6.4|^7.0", @@ -10630,7 +11118,8 @@ "symfony/form": "<6.4", "symfony/mailer": "<6.4", "symfony/messenger": "<6.4", - "symfony/serializer": "<7.2" + "symfony/serializer": "<7.2", + "symfony/workflow": "<7.3" }, "require-dev": { "symfony/browser-kit": "^6.4|^7.0", @@ -10667,7 +11156,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.2.4" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.3.1" }, "funding": [ { @@ -10683,7 +11172,7 @@ "type": "tidelift" } ], - "time": "2025-02-14T14:27:24+00:00" + "time": "2025-06-05T09:30:41+00:00" }, { "name": "theseer/tokenizer", @@ -10742,7 +11231,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=8.3", + "php": ">=8.4", "ext-ctype": "*", "ext-iconv": "*" }, diff --git a/api/config/bootstrap.php b/api/config/bootstrap.php index 30095b122..10449ed62 100644 --- a/api/config/bootstrap.php +++ b/api/config/bootstrap.php @@ -13,13 +13,13 @@ // Load cached env vars if the .env.local.php file exists // Run "composer dump-env prod" to create it (requires symfony/flex >=1.2) if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') && (!isset($env['APP_ENV']) || ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'])) { - (new Dotenv())->usePutenv(false)->populate($env); + new Dotenv()->usePutenv(false)->populate($env); } else { // load all the .env files - (new Dotenv())->usePutenv(false)->loadEnv(dirname(__DIR__) . '/.env'); + new Dotenv()->usePutenv(false)->loadEnv(dirname(__DIR__) . '/.env'); } $_SERVER += $_ENV; $_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; -$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; +$_SERVER['APP_DEBUG'] ??= $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; $_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], \FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; diff --git a/api/config/packages/api_platform.yaml b/api/config/packages/api_platform.yaml index 856a95d11..51ea68a66 100644 --- a/api/config/packages/api_platform.yaml +++ b/api/config/packages/api_platform.yaml @@ -9,8 +9,6 @@ api_platform: # Mercure integration, remove if unwanted mercure: include_type: true - graphql: - graphql_playground: false formats: jsonld: ['application/ld+json'] json: ['application/json'] diff --git a/api/migrations/Version20230906094949.php b/api/migrations/Version20230906094949.php index 376622441..3c468ccfb 100644 --- a/api/migrations/Version20230906094949.php +++ b/api/migrations/Version20230906094949.php @@ -12,6 +12,7 @@ */ final class Version20230906094949 extends AbstractMigration { + #[\Override] public function getDescription(): string { return ''; @@ -22,25 +23,25 @@ public function up(Schema $schema): void // this up() migration is auto-generated, please modify it to your needs $this->addSql('CREATE TABLE book (id UUID NOT NULL, book VARCHAR(255) NOT NULL, title TEXT NOT NULL, author VARCHAR(255) DEFAULT NULL, "condition" VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE UNIQUE INDEX UNIQ_CBE5A331CBE5A331 ON book (book)'); - $this->addSql('COMMENT ON COLUMN book.id IS \'(DC2Type:uuid)\''); + $this->addSql("COMMENT ON COLUMN book.id IS '(DC2Type:uuid)'"); $this->addSql('CREATE TABLE bookmark (id UUID NOT NULL, user_id UUID NOT NULL, book_id UUID NOT NULL, bookmarked_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE INDEX IDX_DA62921DA76ED395 ON bookmark (user_id)'); $this->addSql('CREATE INDEX IDX_DA62921D16A2B381 ON bookmark (book_id)'); $this->addSql('CREATE UNIQUE INDEX UNIQ_DA62921DA76ED39516A2B381 ON bookmark (user_id, book_id)'); - $this->addSql('COMMENT ON COLUMN bookmark.id IS \'(DC2Type:uuid)\''); - $this->addSql('COMMENT ON COLUMN bookmark.user_id IS \'(DC2Type:uuid)\''); - $this->addSql('COMMENT ON COLUMN bookmark.book_id IS \'(DC2Type:uuid)\''); - $this->addSql('COMMENT ON COLUMN bookmark.bookmarked_at IS \'(DC2Type:datetime_immutable)\''); + $this->addSql("COMMENT ON COLUMN bookmark.id IS '(DC2Type:uuid)'"); + $this->addSql("COMMENT ON COLUMN bookmark.user_id IS '(DC2Type:uuid)'"); + $this->addSql("COMMENT ON COLUMN bookmark.book_id IS '(DC2Type:uuid)'"); + $this->addSql("COMMENT ON COLUMN bookmark.bookmarked_at IS '(DC2Type:datetime_immutable)'"); $this->addSql('CREATE TABLE parchment (id UUID NOT NULL, title VARCHAR(255) NOT NULL, description VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('COMMENT ON COLUMN parchment.id IS \'(DC2Type:uuid)\''); + $this->addSql("COMMENT ON COLUMN parchment.id IS '(DC2Type:uuid)'"); $this->addSql('CREATE TABLE review (id UUID NOT NULL, user_id UUID NOT NULL, book_id UUID NOT NULL, published_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, body TEXT NOT NULL, rating SMALLINT NOT NULL, letter VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE INDEX IDX_794381C6A76ED395 ON review (user_id)'); $this->addSql('CREATE INDEX IDX_794381C616A2B381 ON review (book_id)'); $this->addSql('CREATE UNIQUE INDEX UNIQ_794381C6A76ED39516A2B381 ON review (user_id, book_id)'); - $this->addSql('COMMENT ON COLUMN review.id IS \'(DC2Type:uuid)\''); - $this->addSql('COMMENT ON COLUMN review.user_id IS \'(DC2Type:uuid)\''); - $this->addSql('COMMENT ON COLUMN review.book_id IS \'(DC2Type:uuid)\''); - $this->addSql('COMMENT ON COLUMN review.published_at IS \'(DC2Type:datetime_immutable)\''); + $this->addSql("COMMENT ON COLUMN review.id IS '(DC2Type:uuid)'"); + $this->addSql("COMMENT ON COLUMN review.user_id IS '(DC2Type:uuid)'"); + $this->addSql("COMMENT ON COLUMN review.book_id IS '(DC2Type:uuid)'"); + $this->addSql("COMMENT ON COLUMN review.published_at IS '(DC2Type:datetime_immutable)'"); $this->addSql('CREATE TABLE "user" (id UUID NOT NULL, email VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE UNIQUE INDEX UNIQ_8D93D649E7927C74 ON "user" (email)'); $this->addSql('COMMENT ON COLUMN "user".id IS \'(DC2Type:uuid)\''); @@ -50,6 +51,7 @@ public function up(Schema $schema): void $this->addSql('ALTER TABLE review ADD CONSTRAINT FK_794381C616A2B381 FOREIGN KEY (book_id) REFERENCES book (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); } + #[\Override] public function down(Schema $schema): void { // this down() migration is auto-generated, please modify it to your needs diff --git a/api/public/index.php b/api/public/index.php index 635f037ca..7bf3ee927 100644 --- a/api/public/index.php +++ b/api/public/index.php @@ -9,9 +9,7 @@ // Support CloudFlare Flexible SSL // https://developers.cloudflare.com/fundamentals/reference/http-request-headers/#cf-visitor if ($_SERVER['HTTP_CF_VISITOR'] ?? false) { - $_SERVER['HTTP_X_FORWARDED_PROTO'] = json_decode($_SERVER['HTTP_CF_VISITOR'], true)['scheme']; + $_SERVER['HTTP_X_FORWARDED_PROTO'] = json_decode((string) $_SERVER['HTTP_CF_VISITOR'], true)['scheme']; } -return static function (array $context) { - return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); -}; +return static fn (array $context): Kernel => new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); diff --git a/api/rector.php b/api/rector.php new file mode 100644 index 000000000..ba9167e48 --- /dev/null +++ b/api/rector.php @@ -0,0 +1,43 @@ +withPaths([ + __DIR__ . '/config', + __DIR__ . '/migrations', + __DIR__ . '/public', + __DIR__ . '/src', + __DIR__ . '/tests', + ]) + ->withRootFiles() + ->withPhpSets() // empty means use the version from composer.json + ->withSets([ + SetList::CODE_QUALITY, + SetList::CODING_STYLE, + SetList::DEAD_CODE, + SetList::INSTANCEOF, + SetList::PRIVATIZATION, + SetList::TYPE_DECLARATION, + SetList::STRICT_BOOLEANS, + ]) + ->withAttributesSets() + ->withComposerBased(doctrine: true, phpunit: true) + ->withSkip([ + __DIR__ . '/config/bundles.php', + DisallowedEmptyRuleFixerRector::class, + SimplifyEmptyCheckOnEmptyArrayRector::class, + ]) +; + +$kernelFilename = __DIR__ . '/var/cache/dev/App_KernelDevDebugContainer.xml'; +if (is_file($kernelFilename)) { + $rector->withSymfonyContainerXml($kernelFilename); +} + +return $rector; diff --git a/api/src/DataFixtures/Factory/BookFactory.php b/api/src/DataFixtures/Factory/BookFactory.php index fcfae171e..5428d596e 100644 --- a/api/src/DataFixtures/Factory/BookFactory.php +++ b/api/src/DataFixtures/Factory/BookFactory.php @@ -78,6 +78,7 @@ protected function defaults(): array /** * @see https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#initialization */ + #[\Override] protected function initialize(): static { return $this @@ -95,10 +96,8 @@ protected function initialize(): static } // An Open Library book URI has been specified: try to find it in the array of books - $data = array_filter($this->data, static function (array $datum) use ($book) { - return $book->book === $datum['book']; - }); - if ($data) { + $data = array_filter($this->data, static fn (array $datum): bool => $book->book === $datum['book']); + if ([] !== $data) { $datum = current($data); $book->title ??= $datum['title']; // A book can have no author diff --git a/api/src/DataFixtures/Factory/BookmarkFactory.php b/api/src/DataFixtures/Factory/BookmarkFactory.php index 5bdb27b06..4be15b1a0 100644 --- a/api/src/DataFixtures/Factory/BookmarkFactory.php +++ b/api/src/DataFixtures/Factory/BookmarkFactory.php @@ -59,8 +59,8 @@ final class BookmarkFactory extends PersistentProxyObjectFactory protected function defaults(): array { return [ - 'user' => lazy(static fn () => UserFactory::new()), - 'book' => lazy(static fn () => BookFactory::new()), + 'user' => lazy(static fn (): UserFactory => UserFactory::new()), + 'book' => lazy(static fn (): BookFactory => BookFactory::new()), 'bookmarkedAt' => \DateTimeImmutable::createFromMutable(self::faker()->dateTime()), ]; } diff --git a/api/src/DataFixtures/Factory/ReviewFactory.php b/api/src/DataFixtures/Factory/ReviewFactory.php index cd967172d..38dd18509 100644 --- a/api/src/DataFixtures/Factory/ReviewFactory.php +++ b/api/src/DataFixtures/Factory/ReviewFactory.php @@ -69,8 +69,8 @@ public function __construct( protected function defaults(): array { return [ - 'user' => lazy(static fn () => UserFactory::new()), - 'book' => lazy(static fn () => BookFactory::new()), + 'user' => lazy(static fn (): UserFactory => UserFactory::new()), + 'book' => lazy(static fn (): BookFactory => BookFactory::new()), 'publishedAt' => \DateTimeImmutable::createFromMutable(self::faker()->dateTime('-1 week')), 'body' => self::faker()->text(), 'rating' => self::faker()->numberBetween(0, 5), @@ -80,12 +80,13 @@ protected function defaults(): array /** * @see https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#initialization */ + #[\Override] protected function initialize(): static { return $this // create the resource on the OIDC server ->afterPersist(function (Review $object): void { - if (!$this->resourceHandler) { + if (!$this->resourceHandler instanceof ResourceHandlerInterface) { return; } diff --git a/api/src/DataFixtures/Story/DefaultStory.php b/api/src/DataFixtures/Story/DefaultStory.php index 345d9e72e..eab08782d 100644 --- a/api/src/DataFixtures/Story/DefaultStory.php +++ b/api/src/DataFixtures/Story/DefaultStory.php @@ -45,7 +45,7 @@ public function build(): void ]); // Optionally add reviews to it (create new users) - if ($number = random_int(0, 5)) { + if (($number = random_int(0, 5)) !== 0) { ReviewFactory::createMany($number, [ 'book' => $book, 'publishedAt' => \DateTimeImmutable::createFromMutable(faker()->dateTime('-1 week')), diff --git a/api/src/Doctrine/Orm/Extension/BookmarkQueryCollectionExtension.php b/api/src/Doctrine/Orm/Extension/BookmarkQueryCollectionExtension.php index 6018c9cf8..6dca7103b 100644 --- a/api/src/Doctrine/Orm/Extension/BookmarkQueryCollectionExtension.php +++ b/api/src/Doctrine/Orm/Extension/BookmarkQueryCollectionExtension.php @@ -25,7 +25,7 @@ public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGenerator if ( Bookmark::class !== $resourceClass || '_api_/bookmarks{._format}_get_collection' !== $operation->getName() - || !$user = $this->security->getUser() + || !($user = $this->security->getUser()) instanceof \Symfony\Component\Security\Core\User\UserInterface ) { return; } diff --git a/api/src/Doctrine/Orm/Filter/NameFilter.php b/api/src/Doctrine/Orm/Filter/NameFilter.php index c13ed7f06..becb40a06 100644 --- a/api/src/Doctrine/Orm/Filter/NameFilter.php +++ b/api/src/Doctrine/Orm/Filter/NameFilter.php @@ -44,20 +44,21 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB $alias = $queryBuilder->getRootAliases()[0]; $expressions = []; foreach ($values as $key => $value) { - $parameterName = $queryNameGenerator->generateParameterName("name{$key}"); - $queryBuilder->setParameter($parameterName, "%{$value}%"); + $parameterName = $queryNameGenerator->generateParameterName('name' . $key); + $queryBuilder->setParameter($parameterName, \sprintf('%%%s%%', $value)); $expressions[] = $queryBuilder->expr()->orX( - $queryBuilder->expr()->like(\sprintf('%s.firstName', $alias), ":{$parameterName}"), - $queryBuilder->expr()->like(\sprintf('%s.lastName', $alias), ":{$parameterName}") + $queryBuilder->expr()->like(\sprintf('%s.firstName', $alias), ':' . $parameterName), + $queryBuilder->expr()->like(\sprintf('%s.lastName', $alias), ':' . $parameterName) ); } + $queryBuilder->andWhere($queryBuilder->expr()->andX(...$expressions)); } /** * @param string|null $value */ - protected function normalizeValues($value, string $property): ?array + private function normalizeValues($value, string $property): ?array { if (!\is_string($value) || empty(trim($value))) { return null; diff --git a/api/src/Security/Core/UserProvider.php b/api/src/Security/Core/UserProvider.php index a07c85ddc..916cb0497 100644 --- a/api/src/Security/Core/UserProvider.php +++ b/api/src/Security/Core/UserProvider.php @@ -48,11 +48,13 @@ public function loadUserByIdentifier(string $identifier, array $attributes = []) if (!isset($attributes['given_name'])) { throw new UnsupportedUserException('Property "given_name" is missing in token attributes.'); } + $user->firstName = $attributes['given_name']; if (!isset($attributes['family_name'])) { throw new UnsupportedUserException('Property "family_name" is missing in token attributes.'); } + $user->lastName = $attributes['family_name']; $this->repository->save($user); diff --git a/api/src/Security/Http/AccessToken/Oidc/OidcDiscoveryTokenHandler.php b/api/src/Security/Http/AccessToken/Oidc/OidcDiscoveryTokenHandler.php index 77dfb17a2..bd12b38c2 100644 --- a/api/src/Security/Http/AccessToken/Oidc/OidcDiscoveryTokenHandler.php +++ b/api/src/Security/Http/AccessToken/Oidc/OidcDiscoveryTokenHandler.php @@ -55,13 +55,13 @@ public function getUserBadgeFrom(string $accessToken): UserBadge return $response->getContent(); }), true, 512, \JSON_THROW_ON_ERROR); - } catch (\Throwable $e) { + } catch (\Throwable $throwable) { $this->logger?->error('An error occurred while requesting OIDC configuration.', [ - 'error' => $e->getMessage(), - 'trace' => $e->getTraceAsString(), + 'error' => $throwable->getMessage(), + 'trace' => $throwable->getTraceAsString(), ]); - throw new BadCredentialsException('Invalid credentials.', $e->getCode(), $e); + throw new BadCredentialsException('Invalid credentials.', $throwable->getCode(), $throwable); } try { @@ -70,18 +70,18 @@ public function getUserBadgeFrom(string $accessToken): UserBadge $item->expiresAfter($this->ttl); $response = $this->securityAuthorizationClient->request('GET', $oidcConfiguration['jwks_uri']); // we only need signature key - $keys = array_filter($response->toArray()['keys'], static fn (array $key) => 'sig' === $key['use']); + $keys = array_filter($response->toArray()['keys'], static fn (array $key): bool => 'sig' === $key['use']); return json_encode(['keys' => $keys]); }) ); - } catch (\Throwable $e) { + } catch (\Throwable $throwable) { $this->logger?->error('An error occurred while requesting OIDC certs.', [ - 'error' => $e->getMessage(), - 'trace' => $e->getTraceAsString(), + 'error' => $throwable->getMessage(), + 'trace' => $throwable->getTraceAsString(), ]); - throw new BadCredentialsException('Invalid credentials.', $e->getCode(), $e); + throw new BadCredentialsException('Invalid credentials.', $throwable->getCode(), $throwable); } try { @@ -93,19 +93,19 @@ public function getUserBadgeFrom(string $accessToken): UserBadge signature: $signature, ); - $claims = json_decode($jws->getPayload(), true); + $claims = json_decode((string) $jws->getPayload(), true); $this->claimCheckerManager->check(claims: $claims, mandatoryClaims: [$this->claim]); $this->headerCheckerManager->check(jwt: $jws, index: 0); // UserLoader argument can be overridden by a UserProvider on AccessTokenAuthenticator::authenticate - return new UserBadge($claims[$this->claim], new FallbackUserLoader(fn () => $this->createUser($claims)), $claims); - } catch (\Throwable $e) { + return new UserBadge($claims[$this->claim], new FallbackUserLoader(fn (): \Symfony\Component\Security\Core\User\OidcUser => $this->createUser($claims)), $claims); + } catch (\Throwable $throwable) { $this->logger?->error('An error occurred while decoding and validating the token.', [ - 'error' => $e->getMessage(), - 'trace' => $e->getTraceAsString(), + 'error' => $throwable->getMessage(), + 'trace' => $throwable->getTraceAsString(), ]); - throw new BadCredentialsException('Invalid credentials.', $e->getCode(), $e); + throw new BadCredentialsException('Invalid credentials.', $throwable->getCode(), $throwable); } } } diff --git a/api/src/Security/Http/Protection/ResourceResourceHandler.php b/api/src/Security/Http/Protection/ResourceResourceHandler.php index 9e79f05bd..e1c6f2b47 100644 --- a/api/src/Security/Http/Protection/ResourceResourceHandler.php +++ b/api/src/Security/Http/Protection/ResourceResourceHandler.php @@ -30,7 +30,7 @@ public function create(object $resource, UserInterface $owner, array $context = operationName: $context['operation_name'] ?? null, httpOperation: true, ); - $shortName = strtolower(preg_replace('~(?<=\w)([A-Z])~', '-$1', $operation->getShortName())); + $shortName = strtolower((string) preg_replace('~(?<=\w)([A-Z])~', '-$1', (string) $operation->getShortName())); $resourceIri = $this->iriConverter->getIriFromResource( resource: $resource, referenceType: UrlGeneratorInterface::ABS_PATH, @@ -56,7 +56,7 @@ public function delete(object $resource, UserInterface $owner, array $context = operationName: $context['operation_name'] ?? null, httpOperation: true, ); - $shortName = strtolower(preg_replace('~(?<=\w)([A-Z])~', '-$1', $operation->getShortName())); + $shortName = strtolower((string) preg_replace('~(?<=\w)([A-Z])~', '-$1', (string) $operation->getShortName())); $resourceIri = $this->iriConverter->getIriFromResource( resource: $resource, referenceType: UrlGeneratorInterface::ABS_PATH, diff --git a/api/src/Security/Voter/OidcRoleVoter.php b/api/src/Security/Voter/OidcRoleVoter.php index 771990d53..c663913db 100644 --- a/api/src/Security/Voter/OidcRoleVoter.php +++ b/api/src/Security/Voter/OidcRoleVoter.php @@ -45,13 +45,13 @@ protected function voteOnAttribute(string $attribute, mixed $subject, TokenInter } $accessToken = $this->getToken(); - if (!$accessToken) { + if ('' === $accessToken || '0' === $accessToken) { return false; } // OIDC server doesn't seem to answer: check roles in token (if present) $jws = $this->jwsSerializerManager->unserialize($accessToken); - $claims = json_decode($jws->getPayload(), true); + $claims = json_decode((string) $jws->getPayload(), true); $roles = array_map(static fn (string $role): string => strtolower($role), $claims['realm_access']['roles'] ?? []); return \in_array(strtolower(substr($attribute, 5)), $roles, true); diff --git a/api/src/Security/Voter/OidcTokenIntrospectRoleVoter.php b/api/src/Security/Voter/OidcTokenIntrospectRoleVoter.php index e8a3ff275..e0a1fb359 100644 --- a/api/src/Security/Voter/OidcTokenIntrospectRoleVoter.php +++ b/api/src/Security/Voter/OidcTokenIntrospectRoleVoter.php @@ -30,7 +30,7 @@ public function __construct( #[Autowire('%env(OIDC_API_CLIENT_SECRET)%')] private readonly string $oidcClientSecret, private readonly HttpClientInterface $securityAuthorizationClient, - private ?LoggerInterface $logger = null, + private readonly ?LoggerInterface $logger = null, ) { parent::__construct($requestStack, $accessTokenExtractor); } @@ -52,7 +52,7 @@ protected function voteOnAttribute(string $attribute, mixed $subject, TokenInter } $accessToken = $this->getToken(); - if (!$accessToken) { + if ('' === $accessToken || '0' === $accessToken) { return false; } diff --git a/api/src/Security/Voter/OidcTokenPermissionVoter.php b/api/src/Security/Voter/OidcTokenPermissionVoter.php index c6f3490ca..4db65a131 100644 --- a/api/src/Security/Voter/OidcTokenPermissionVoter.php +++ b/api/src/Security/Voter/OidcTokenPermissionVoter.php @@ -30,7 +30,7 @@ public function __construct( private readonly string $oidcClientId, private readonly HttpClientInterface $securityAuthorizationClient, private readonly IriConverterInterface $iriConverter, - private ?LoggerInterface $logger = null, + private readonly ?LoggerInterface $logger = null, ) { parent::__construct($requestStack, $accessTokenExtractor); } @@ -56,7 +56,7 @@ protected function voteOnAttribute(string $attribute, mixed $subject, TokenInter } $accessToken = $this->getToken(); - if (!$accessToken) { + if ('' === $accessToken || '0' === $accessToken) { return false; } @@ -69,7 +69,7 @@ protected function voteOnAttribute(string $attribute, mixed $subject, TokenInter 'response_mode' => 'decision', 'permission_resource_format' => 'uri', 'permission_resource_matching_uri' => true, - 'permission' => \sprintf('%s', $subject), + 'permission' => $subject, ], ]); diff --git a/api/src/Security/Voter/OidcVoter.php b/api/src/Security/Voter/OidcVoter.php index e908d4cfe..ff9f4e06d 100644 --- a/api/src/Security/Voter/OidcVoter.php +++ b/api/src/Security/Voter/OidcVoter.php @@ -11,7 +11,7 @@ use Symfony\Component\Security\Http\AccessToken\AccessTokenExtractorInterface; /** - * @extends Voter + * @extends Voter */ abstract class OidcVoter extends Voter { @@ -31,7 +31,7 @@ protected function getToken(): string // user is authenticated, its token should be valid (validated through AccessTokenAuthenticator) $accessToken = $this->accessTokenExtractor->extractAccessToken($request); - if (!$accessToken) { + if (null === $accessToken || '' === $accessToken || '0' === $accessToken) { throw new TokenNotFoundException(); } diff --git a/api/src/Serializer/IriTransformerNormalizer.php b/api/src/Serializer/IriTransformerNormalizer.php index 1f2ac7ee6..a67c66c9a 100644 --- a/api/src/Serializer/IriTransformerNormalizer.php +++ b/api/src/Serializer/IriTransformerNormalizer.php @@ -16,7 +16,7 @@ final class IriTransformerNormalizer implements NormalizerInterface, NormalizerA { use NormalizerAwareTrait; - public const CONTEXT_KEY = 'iris_transform'; + public const string CONTEXT_KEY = 'iris_transform'; public function __construct( private readonly IriConverterInterface $iriConverter, @@ -35,7 +35,7 @@ public function normalize(mixed $object, ?string $format = null, array $context } foreach ($value as $property => $uriTemplate) { - if (!isset($data[$property]) || !(\is_string($data[$property]) || isset($data[$property]['@id']))) { + if (!isset($data[$property]) || !\is_string($data[$property]) && !isset($data[$property]['@id'])) { continue; } diff --git a/api/src/State/Processor/ReviewPersistProcessor.php b/api/src/State/Processor/ReviewPersistProcessor.php index 125550ac3..bb1935504 100644 --- a/api/src/State/Processor/ReviewPersistProcessor.php +++ b/api/src/State/Processor/ReviewPersistProcessor.php @@ -55,13 +55,11 @@ public function process(mixed $data, Operation $operation, array $uriVariables = $data = $this->persistProcessor->process($data, $operation, $uriVariables, $context); // create resource on OIDC server - if ($operation instanceof Post) { - // project specification: only create resource on OIDC server for known users (john.doe and chuck.norris) - if (\in_array($data->user->email, ['john.doe@example.com', 'chuck.norris@example.com'], true)) { - $this->resourceHandler->create($data, $data->user, [ - 'operation_name' => '/books/{bookId}/reviews/{id}{._format}', - ]); - } + // project specification: only create resource on OIDC server for known users (john.doe and chuck.norris) + if ($operation instanceof Post && \in_array($data->user->email, ['john.doe@example.com', 'chuck.norris@example.com'], true)) { + $this->resourceHandler->create($data, $data->user, [ + 'operation_name' => '/books/{bookId}/reviews/{id}{._format}', + ]); } return $data; diff --git a/api/src/Validator/BookUrl.php b/api/src/Validator/BookUrl.php index a6b3f20eb..b9a88b63f 100644 --- a/api/src/Validator/BookUrl.php +++ b/api/src/Validator/BookUrl.php @@ -18,6 +18,7 @@ public function __construct(?array $options = null, ?string $message = null, ?ar $this->message = $message ?? $this->message; } + #[\Override] public function getTargets(): string { return self::PROPERTY_CONSTRAINT; diff --git a/api/src/Validator/BookUrlValidator.php b/api/src/Validator/BookUrlValidator.php index 6a8a7bccb..ec4cb4cd7 100644 --- a/api/src/Validator/BookUrlValidator.php +++ b/api/src/Validator/BookUrlValidator.php @@ -29,7 +29,7 @@ public function validate($value, Constraint $constraint): void return; } - if (!$this->bookRepository->find($value)) { + if (!$this->bookRepository->find($value) instanceof \App\Entity\Book) { $this->context->buildViolation($constraint->message)->addViolation(); } } diff --git a/api/src/Validator/UniqueUserBook.php b/api/src/Validator/UniqueUserBook.php index 11349681b..97eeb5052 100644 --- a/api/src/Validator/UniqueUserBook.php +++ b/api/src/Validator/UniqueUserBook.php @@ -18,6 +18,7 @@ public function __construct(?array $options = null, ?string $message = null, ?ar $this->message = $message ?? $this->message; } + #[\Override] public function getTargets(): string { return self::CLASS_CONSTRAINT; diff --git a/api/src/Validator/UniqueUserBookValidator.php b/api/src/Validator/UniqueUserBookValidator.php index 6e9f74ec8..1c9f736d4 100644 --- a/api/src/Validator/UniqueUserBookValidator.php +++ b/api/src/Validator/UniqueUserBookValidator.php @@ -36,7 +36,7 @@ public function validate($value, Constraint $constraint): void } $user = $this->security->getUser(); - if (!$value || !$user || !($book = $this->propertyAccessor->getValue($value, 'book'))) { + if (!$value || !$user instanceof \Symfony\Component\Security\Core\User\UserInterface || !($book = $this->propertyAccessor->getValue($value, 'book'))) { return; } diff --git a/api/tests/Api/Admin/BookTest.php b/api/tests/Api/Admin/BookTest.php index c4b1209d0..d3489b081 100644 --- a/api/tests/Api/Admin/BookTest.php +++ b/api/tests/Api/Admin/BookTest.php @@ -41,7 +41,7 @@ protected function setup(): void public function asNonAdminUserICannotGetACollectionOfBooks(int $expectedCode, string $hydraDescription, ?UserFactory $userFactory): void { $options = []; - if ($userFactory) { + if ($userFactory instanceof UserFactory) { $token = self::getContainer()->get(TokenGenerator::class)->generateToken([ 'email' => $userFactory->create()->email, ]); @@ -120,7 +120,7 @@ public static function getUrls(): iterable BookFactory::new()->sequence(static function () { foreach (range(1, 100) as $i) { // 33% of books are damaged - yield ['condition' => $i % 3 ? BookCondition::NewCondition : BookCondition::DamagedCondition]; + yield ['condition' => 0 !== $i % 3 ? BookCondition::NewCondition : BookCondition::DamagedCondition]; } }), '/admin/books?condition=' . BookCondition::DamagedCondition->value, @@ -157,7 +157,7 @@ public function asAnyUserICannotGetAnInvalidBook(?UserFactory $userFactory): voi BookFactory::createOne(); $options = []; - if ($userFactory) { + if ($userFactory instanceof UserFactory) { $token = self::getContainer()->get(TokenGenerator::class)->generateToken([ 'email' => $userFactory->create()->email, ]); @@ -183,7 +183,7 @@ public function asNonAdminUserICannotGetABook(int $expectedCode, string $hydraDe $book = BookFactory::createOne(); $options = []; - if ($userFactory) { + if ($userFactory instanceof UserFactory) { $token = self::getContainer()->get(TokenGenerator::class)->generateToken([ 'email' => $userFactory->create()->email, ]); @@ -203,7 +203,6 @@ public function asNonAdminUserICannotGetABook(int $expectedCode, string $hydraDe } #[Test] - #[DataProvider(methodName: 'getNonAdminUsers')] public function asAdminUserICanGetABook(): void { $book = BookFactory::createOne(); @@ -232,7 +231,7 @@ public function asAdminUserICanGetABook(): void public function asNonAdminUserICannotCreateABook(int $expectedCode, string $hydraDescription, ?UserFactory $userFactory): void { $options = []; - if ($userFactory) { + if ($userFactory instanceof UserFactory) { $token = self::getContainer()->get(TokenGenerator::class)->generateToken([ 'email' => $userFactory->create()->email, ]); @@ -363,11 +362,9 @@ public static function getInvalidData(): iterable ]; } - /** - * @group apiCall - * @group mercure - */ #[Test] + #[\PHPUnit\Framework\Attributes\Group('apiCall')] + #[\PHPUnit\Framework\Attributes\Group('mercure')] public function asAdminUserICanCreateABook(): void { $token = self::getContainer()->get(TokenGenerator::class)->generateToken([ @@ -396,7 +393,7 @@ public function asAdminUserICanCreateABook(): void 'author' => 'Asimov, Isaac', ]); self::assertMatchesJsonSchema(file_get_contents(__DIR__ . '/schemas/Book/item.json')); - $id = preg_replace('/^.*\/(.+)$/', '$1', $response->toArray()['@id']); + $id = preg_replace('/^.*\/(.+)$/', '$1', (string) $response->toArray()['@id']); /** @var Book $book */ $book = self::getContainer()->get(BookRepository::class)->find($id); self::assertCount(1, self::getMercureMessages()); @@ -420,7 +417,7 @@ public function asNonAdminUserICannotUpdateBook(int $expectedCode, string $hydra $book = BookFactory::createOne(); $options = []; - if ($userFactory) { + if ($userFactory instanceof UserFactory) { $token = self::getContainer()->get(TokenGenerator::class)->generateToken([ 'email' => $userFactory->create()->email, ]); @@ -496,11 +493,9 @@ public function asAdminUserICannotUpdateABookWithInvalidData(array $data, int $s self::assertJsonContains($expected); } - /** - * @group apiCall - * @group mercure - */ #[Test] + #[\PHPUnit\Framework\Attributes\Group('apiCall')] + #[\PHPUnit\Framework\Attributes\Group('mercure')] public function asAdminUserICanUpdateABook(): void { $book = BookFactory::createOne([ @@ -557,7 +552,7 @@ public function asNonAdminUserICannotDeleteABook(int $expectedCode, string $hydr $book = BookFactory::createOne(); $options = []; - if ($userFactory) { + if ($userFactory instanceof UserFactory) { $token = self::getContainer()->get(TokenGenerator::class)->generateToken([ 'email' => $userFactory->create()->email, ]); @@ -590,10 +585,8 @@ public function asAdminUserICannotDeleteAnInvalidBook(): void self::assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND); } - /** - * @group mercure - */ #[Test] + #[\PHPUnit\Framework\Attributes\Group('mercure')] public function asAdminUserICanDeleteABook(): void { $book = BookFactory::createOne(['title' => 'Hyperion']); diff --git a/api/tests/Api/Admin/ReviewTest.php b/api/tests/Api/Admin/ReviewTest.php index b8b87ec3d..d3250ff3b 100644 --- a/api/tests/Api/Admin/ReviewTest.php +++ b/api/tests/Api/Admin/ReviewTest.php @@ -42,7 +42,7 @@ protected function setup(): void public function asNonAdminUserICannotGetACollectionOfReviews(int $expectedCode, string $hydraDescription, ?UserFactory $userFactory): void { $options = []; - if ($userFactory) { + if ($userFactory instanceof UserFactory) { $token = self::getContainer()->get(TokenGenerator::class)->generateToken([ 'email' => $userFactory->create()->email, ]); @@ -104,7 +104,7 @@ public static function getAdminUrls(): iterable ReviewFactory::new()->sequence(static function () { foreach (range(1, 100) as $i) { // 33% of reviews are rated 5 - yield ['rating' => $i % 3 ? 3 : 5]; + yield ['rating' => 0 !== $i % 3 ? 3 : 5]; } }), '/admin/reviews?rating=5', @@ -150,7 +150,7 @@ public function asNonAdminUserICannotGetAReview(int $expectedCode, string $hydra $review = ReviewFactory::createOne(); $options = []; - if ($userFactory) { + if ($userFactory instanceof UserFactory) { $token = self::getContainer()->get(TokenGenerator::class)->generateToken([ 'email' => $userFactory->create()->email, ]); @@ -205,7 +205,7 @@ public function asNonAdminUserICannotUpdateAReview(int $expectedCode, string $hy $review = ReviewFactory::createOne(); $options = []; - if ($userFactory) { + if ($userFactory instanceof UserFactory) { $token = self::getContainer()->get(TokenGenerator::class)->generateToken([ 'email' => $userFactory->create()->email, ]); @@ -255,10 +255,8 @@ public function asAdminUserICannotUpdateAnInvalidReview(): void self::assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND); } - /** - * @group mercure - */ #[Test] + #[\PHPUnit\Framework\Attributes\Group('mercure')] public function asAdminUserICanUpdateAReview(): void { $book = BookFactory::createOne(); @@ -321,7 +319,7 @@ public function asNonAdminUserICannotDeleteAReview(int $expectedCode, string $hy $review = ReviewFactory::createOne(); $options = []; - if ($userFactory) { + if ($userFactory instanceof UserFactory) { $token = self::getContainer()->get(TokenGenerator::class)->generateToken([ 'email' => $userFactory->create()->email, ]); @@ -352,10 +350,8 @@ public function asAdminUserICannotDeleteAnInvalidReview(): void self::assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND); } - /** - * @group mercure - */ #[Test] + #[\PHPUnit\Framework\Attributes\Group('mercure')] public function asAdminUserICanDeleteAReview(): void { $review = ReviewFactory::createOne(['body' => 'Best book ever!']); diff --git a/api/tests/Api/Admin/UserTest.php b/api/tests/Api/Admin/UserTest.php index cc5825d53..0c2c40e6e 100644 --- a/api/tests/Api/Admin/UserTest.php +++ b/api/tests/Api/Admin/UserTest.php @@ -34,7 +34,7 @@ protected function setup(): void public function asNonAdminUserICannotGetACollectionOfUsers(int $expectedCode, string $hydraDescription, ?UserFactory $userFactory): void { $options = []; - if ($userFactory) { + if ($userFactory instanceof UserFactory) { $token = self::getContainer()->get(TokenGenerator::class)->generateToken([ 'email' => $userFactory->create()->email, ]); @@ -110,7 +110,7 @@ public function asNonAdminUserICannotGetAUser(int $expectedCode, string $hydraDe $user = UserFactory::createOne(); $options = []; - if ($userFactory) { + if ($userFactory instanceof UserFactory) { $token = self::getContainer()->get(TokenGenerator::class)->generateToken([ 'email' => $userFactory->create()->email, ]); @@ -138,7 +138,7 @@ public function asAdminUserICanGetAUser(): void 'email' => UserFactory::createOneAdmin()->email, ]); - $response = $this->client->request('GET', '/admin/users/' . $user->getId(), ['auth_bearer' => $token]); + $this->client->request('GET', '/admin/users/' . $user->getId(), ['auth_bearer' => $token]); self::assertResponseIsSuccessful(); self::assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8'); diff --git a/api/tests/Api/BookTest.php b/api/tests/Api/BookTest.php index 584f27879..f99fa0b44 100644 --- a/api/tests/Api/BookTest.php +++ b/api/tests/Api/BookTest.php @@ -78,7 +78,7 @@ public static function getUrls(): iterable BookFactory::new()->sequence(static function () { foreach (range(1, 100) as $i) { // 33% of books are damaged - yield ['condition' => $i % 3 ? BookCondition::NewCondition : BookCondition::DamagedCondition]; + yield ['condition' => 0 !== $i % 3 ? BookCondition::NewCondition : BookCondition::DamagedCondition]; } }), '/books?condition=' . BookCondition::DamagedCondition->value, diff --git a/api/tests/Api/BookmarkTest.php b/api/tests/Api/BookmarkTest.php index 5db40b822..cf6bbb164 100644 --- a/api/tests/Api/BookmarkTest.php +++ b/api/tests/Api/BookmarkTest.php @@ -139,10 +139,8 @@ public function asAUserICannotCreateABookmarkWithInvalidData(): void ]); } - /** - * @group mercure - */ #[Test] + #[\PHPUnit\Framework\Attributes\Group('mercure')] public function asAUserICanCreateABookmark(): void { $book = BookFactory::createOne(['book' => 'https://openlibrary.org/books/OL2055137M.json']); @@ -174,7 +172,7 @@ public function asAUserICanCreateABookmark(): void ], ]); self::assertMatchesJsonSchema(file_get_contents(__DIR__ . '/schemas/Bookmark/item.json')); - $id = preg_replace('/^.*\/(.+)$/', '$1', $response->toArray()['@id']); + $id = preg_replace('/^.*\/(.+)$/', '$1', (string) $response->toArray()['@id']); $object = self::getContainer()->get(BookmarkRepository::class)->find($id); self::assertCount(1, self::getMercureMessages()); self::assertEquals( @@ -278,10 +276,8 @@ public function asAUserICannotDeleteAnInvalidBookmark(): void self::assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND); } - /** - * @group mercure - */ #[Test] + #[\PHPUnit\Framework\Attributes\Group('mercure')] public function asAUserICanDeleteMyBookmark(): void { $book = BookFactory::createOne(['title' => 'Hyperion']); diff --git a/api/tests/Api/ReviewTest.php b/api/tests/Api/ReviewTest.php index dc0d8b20c..5974b8bb2 100644 --- a/api/tests/Api/ReviewTest.php +++ b/api/tests/Api/ReviewTest.php @@ -99,7 +99,7 @@ static function (): string { $book = BookFactory::createOne(['title' => 'Hyperion']); foreach (range(1, 100) as $i) { // 33% of reviews are rated 5 - yield ['book' => $book, 'rating' => $i % 3 ? 3 : 5]; + yield ['book' => $book, 'rating' => 0 !== $i % 3 ? 3 : 5]; } }), static function (): string { @@ -237,10 +237,8 @@ public function asAUserICannotAddAReviewWithValidDataOnAnInvalidBook(): void ]); } - /** - * @group mercure - */ #[Test] + #[\PHPUnit\Framework\Attributes\Group('mercure')] public function asAUserICanAddAReviewOnABook(): void { $book = BookFactory::createOne(); @@ -280,7 +278,7 @@ public function asAUserICanAddAReviewOnABook(): void // if I add a review on a book with reviews, it doesn't erase the existing reviews $reviews = self::getContainer()->get(ReviewRepository::class)->findBy(['book' => $book->_real()]); self::assertCount(6, $reviews); - $id = preg_replace('/^.*\/(.+)$/', '$1', $response->toArray()['@id']); + $id = preg_replace('/^.*\/(.+)$/', '$1', (string) $response->toArray()['@id']); /** @var Review $review */ $review = self::getContainer()->get(ReviewRepository::class)->find($id); self::assertCount(1, self::getMercureMessages()); @@ -444,10 +442,8 @@ public function asAUserICannotUpdateAnInvalidBookReview(): void self::assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND); } - /** - * @group mercure - */ #[Test] + #[\PHPUnit\Framework\Attributes\Group('mercure')] public function asAUserICanUpdateMyBookReview(): void { $review = ReviewFactory::createOne(); @@ -547,10 +543,8 @@ public function asAUserICannotDeleteAnInvalidBookReview(): void self::assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND); } - /** - * @group mercure - */ #[Test] + #[\PHPUnit\Framework\Attributes\Group('mercure')] public function asAUserICanDeleteMyBookReview(): void { $review = ReviewFactory::createOne(['body' => 'Best book ever!']); diff --git a/api/tests/Api/Security/TokenGenerator.php b/api/tests/Api/Security/TokenGenerator.php index 4c28a5669..915ae3575 100644 --- a/api/tests/Api/Security/TokenGenerator.php +++ b/api/tests/Api/Security/TokenGenerator.php @@ -47,15 +47,19 @@ public function generateToken(array $claims): string if (empty($claims['sub'])) { $claims['sub'] = $sub; } + if (empty($claims['iat'])) { $claims['iat'] = $time; } + if (empty($claims['nbf'])) { $claims['nbf'] = $time; } + if (empty($claims['exp'])) { $claims['exp'] = $time + 3600; } + if (empty($claims['realm_access']) || empty($claims['realm_access']['roles'])) { $claims['realm_access']['roles'] = ['chuck.norris@example.com' === ($claims['email'] ?? null) ? 'admin' : 'user']; } diff --git a/api/tests/Api/Security/Voter/Mock/KeycloakProtocolOpenIdConnectTokenIntrospectMock.php b/api/tests/Api/Security/Voter/Mock/KeycloakProtocolOpenIdConnectTokenIntrospectMock.php index 2accd186f..d6c62427b 100644 --- a/api/tests/Api/Security/Voter/Mock/KeycloakProtocolOpenIdConnectTokenIntrospectMock.php +++ b/api/tests/Api/Security/Voter/Mock/KeycloakProtocolOpenIdConnectTokenIntrospectMock.php @@ -43,7 +43,7 @@ private function handleRequest(string $method, string $url, array $options): Res $serializerManager = new JWSSerializerManager([new CompactSerializer()]); $jws = $serializerManager->unserialize($body['token']); - $claims = json_decode($jws->getPayload(), true); + $claims = json_decode((string) $jws->getPayload(), true); // "authorize" custom claim set in the test if (\array_key_exists('authorize', $claims)) { diff --git a/api/tests/Api/Security/Voter/Mock/KeycloakProtocolOpenIdConnectTokenMock.php b/api/tests/Api/Security/Voter/Mock/KeycloakProtocolOpenIdConnectTokenMock.php index bc4e151b5..9346b35a4 100644 --- a/api/tests/Api/Security/Voter/Mock/KeycloakProtocolOpenIdConnectTokenMock.php +++ b/api/tests/Api/Security/Voter/Mock/KeycloakProtocolOpenIdConnectTokenMock.php @@ -38,7 +38,7 @@ private function handleRequest(string $method, string $url, array $options): Res $accessToken = preg_replace('/^Authorization: Bearer (.*)$/', '$1', $options['normalized_headers']['authorization'][0]); $serializerManager = new JWSSerializerManager([new CompactSerializer()]); $jws = $serializerManager->unserialize($accessToken); - $claims = json_decode($jws->getPayload(), true); + $claims = json_decode((string) $jws->getPayload(), true); // "authorize" custom claim set in the test if (\array_key_exists('authorize', $claims)) { @@ -46,7 +46,7 @@ private function handleRequest(string $method, string $url, array $options): Res } // no "authorize" custom claim set, try to detect permission from body - parse_str($options['body'], $body); + parse_str((string) $options['body'], $body); if (!isset($body['permission'])) { return $this->getInvalidMock(); } diff --git a/api/tests/Api/Security/Voter/Mock/NotImplementedMock.php b/api/tests/Api/Security/Voter/Mock/NotImplementedMock.php index 8057952d6..ea0f34513 100644 --- a/api/tests/Api/Security/Voter/Mock/NotImplementedMock.php +++ b/api/tests/Api/Security/Voter/Mock/NotImplementedMock.php @@ -18,8 +18,8 @@ public function __construct( parent::__construct($this->handleRequest(...), $baseUri); } - public function handleRequest(string $method, string $url): void + public function handleRequest(string $method, string $url): never { - throw new \UnexpectedValueException("Mock not implemented: {$method}/{$url}"); + throw new \UnexpectedValueException(\sprintf('Mock not implemented: %s/%s', $method, $url)); } } diff --git a/api/tests/Api/Trait/SerializerTrait.php b/api/tests/Api/Trait/SerializerTrait.php index d9ee0144f..e5a477cc6 100644 --- a/api/tests/Api/Trait/SerializerTrait.php +++ b/api/tests/Api/Trait/SerializerTrait.php @@ -24,7 +24,7 @@ public static function getOperationNormalizationContext(string $resourceClass, ? if ($resourceMetadataFactoryCollection = static::getContainer()->get('api_platform.metadata.resource.metadata_collection_factory')) { $operation = $resourceMetadataFactoryCollection->create($resourceClass)->getOperation($operationName); } else { - $operation = $operationName ? (new Get())->withName($operationName) : new Get(); + $operation = null !== $operationName && '' !== $operationName && '0' !== $operationName ? new Get()->withName($operationName) : new Get(); } return ($operation->getNormalizationContext() ?? []) + ['item_uri_template' => $operation->getUriTemplate()]; diff --git a/api/tests/Doctrine/Orm/Extension/BookmarkQueryCollectionExtensionTest.php b/api/tests/Doctrine/Orm/Extension/BookmarkQueryCollectionExtensionTest.php index 597b855cb..dfb7643af 100644 --- a/api/tests/Doctrine/Orm/Extension/BookmarkQueryCollectionExtensionTest.php +++ b/api/tests/Doctrine/Orm/Extension/BookmarkQueryCollectionExtensionTest.php @@ -17,11 +17,16 @@ final class BookmarkQueryCollectionExtensionTest extends TestCase { - private MockObject|Security $securityMock; - private MockObject|UserInterface $userMock; - private MockObject|QueryBuilder $queryBuilderMock; - private MockObject|QueryNameGeneratorInterface $queryNameGeneratorMock; - private MockObject|Operation $operationMock; + private MockObject $securityMock; + + private MockObject $userMock; + + private MockObject $queryBuilderMock; + + private MockObject $queryNameGeneratorMock; + + private MockObject $operationMock; + private BookmarkQueryCollectionExtension $extension; protected function setUp(): void diff --git a/api/tests/Security/Core/UserProviderTest.php b/api/tests/Security/Core/UserProviderTest.php index 6e26887ab..617b09140 100644 --- a/api/tests/Security/Core/UserProviderTest.php +++ b/api/tests/Security/Core/UserProviderTest.php @@ -18,10 +18,14 @@ final class UserProviderTest extends TestCase { - private ManagerRegistry|MockObject $registryMock; - private MockObject|ObjectManager $managerMock; - private MockObject|UserRepository $repositoryMock; - private MockObject|User $userMock; + private MockObject $registryMock; + + private MockObject $managerMock; + + private MockObject $repositoryMock; + + private MockObject $userMock; + private UserProvider $provider; protected function setUp(): void diff --git a/api/tests/Serializer/BookNormalizerTest.php b/api/tests/Serializer/BookNormalizerTest.php index 05cc01f4b..fb1b9e85b 100644 --- a/api/tests/Serializer/BookNormalizerTest.php +++ b/api/tests/Serializer/BookNormalizerTest.php @@ -15,9 +15,12 @@ final class BookNormalizerTest extends TestCase { - private MockObject|NormalizerInterface $normalizerMock; - private MockObject|ReviewRepository $repositoryMock; - private Book|MockObject $objectMock; + private MockObject $normalizerMock; + + private MockObject $repositoryMock; + + private MockObject $objectMock; + private BookNormalizer $normalizer; protected function setUp(): void diff --git a/api/tests/Serializer/IriTransformerNormalizerTest.php b/api/tests/Serializer/IriTransformerNormalizerTest.php index d96dea61e..1daacc8b4 100644 --- a/api/tests/Serializer/IriTransformerNormalizerTest.php +++ b/api/tests/Serializer/IriTransformerNormalizerTest.php @@ -16,11 +16,16 @@ final class IriTransformerNormalizerTest extends TestCase { - private MockObject|NormalizerInterface $normalizerMock; - private IriConverterInterface|MockObject $iriConverterMock; - private MockObject|OperationMetadataFactoryInterface $operationMetadataFactoryMock; - private MockObject|Operation $operationMock; + private MockObject $normalizerMock; + + private MockObject $iriConverterMock; + + private MockObject $operationMetadataFactoryMock; + + private MockObject $operationMock; + private MockObject|\stdClass $objectMock; + private IriTransformerNormalizer $normalizer; protected function setUp(): void diff --git a/api/tests/State/Processor/BookPersistProcessorTest.php b/api/tests/State/Processor/BookPersistProcessorTest.php index 1c1d57f82..20b33e4c4 100644 --- a/api/tests/State/Processor/BookPersistProcessorTest.php +++ b/api/tests/State/Processor/BookPersistProcessorTest.php @@ -15,10 +15,14 @@ final class BookPersistProcessorTest extends TestCase { - private MockObject|ProcessorInterface $persistProcessorMock; - private MockObject|BookRepositoryInterface $bookRepositoryMock; - private Book|MockObject $objectMock; - private MockObject|Operation $operationMock; + private MockObject $persistProcessorMock; + + private MockObject $bookRepositoryMock; + + private MockObject $objectMock; + + private MockObject $operationMock; + private BookPersistProcessor $processor; protected function setUp(): void @@ -27,6 +31,7 @@ protected function setUp(): void $this->bookRepositoryMock = $this->createMock(BookRepositoryInterface::class); $this->objectMock = $this->createMock(Book::class); $this->objectMock->book = 'https://openlibrary.org/books/OL2055137M.json'; + $this->operationMock = $this->createMock(Operation::class); $this->processor = new BookPersistProcessor( diff --git a/api/tests/State/Processor/BookRemoveProcessorTest.php b/api/tests/State/Processor/BookRemoveProcessorTest.php index ff416a094..7408259ff 100644 --- a/api/tests/State/Processor/BookRemoveProcessorTest.php +++ b/api/tests/State/Processor/BookRemoveProcessorTest.php @@ -4,10 +4,7 @@ namespace App\Tests\State\Processor; -use ApiPlatform\Metadata\ApiResource; -use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\Operation; -use ApiPlatform\Metadata\Resource\ResourceMetadataCollection; use ApiPlatform\State\ProcessorInterface; use App\Entity\Book; use App\State\Processor\BookRemoveProcessor; @@ -17,19 +14,17 @@ final class BookRemoveProcessorTest extends TestCase { - private MockObject|ProcessorInterface $removeProcessorMock; - private ResourceMetadataCollection $resourceMetadataCollection; - private Book|MockObject $objectMock; - private MockObject|Operation $operationMock; + private MockObject $removeProcessorMock; + + private MockObject $objectMock; + + private MockObject $operationMock; + private BookRemoveProcessor $processor; protected function setUp(): void { $this->removeProcessorMock = $this->createMock(ProcessorInterface::class); - $this->resourceMetadataCollection = new ResourceMetadataCollection(Book::class, [ - new ApiResource(operations: [new Get('/admin/books/{id}{._format}')]), - new ApiResource(operations: [new Get('/books/{id}{._format}')]), - ]); $this->objectMock = $this->createMock(Book::class); $this->operationMock = $this->createMock(Operation::class); diff --git a/api/tests/State/Processor/BookmarkPersistProcessorTest.php b/api/tests/State/Processor/BookmarkPersistProcessorTest.php index a88790852..b792868a9 100644 --- a/api/tests/State/Processor/BookmarkPersistProcessorTest.php +++ b/api/tests/State/Processor/BookmarkPersistProcessorTest.php @@ -18,12 +18,18 @@ final class BookmarkPersistProcessorTest extends TestCase { - private MockObject|ProcessorInterface $persistProcessorMock; - private MockObject|Security $securityMock; - private MockObject|User $userMock; - private Bookmark|MockObject $objectMock; - private MockObject|Operation $operationMock; + private MockObject $persistProcessorMock; + + private MockObject $securityMock; + + private MockObject $userMock; + + private MockObject $objectMock; + + private MockObject $operationMock; + private ClockInterface|MockObject $clockMock; + private BookmarkPersistProcessor $processor; protected function setUp(): void diff --git a/api/tests/State/Processor/ReviewPersistProcessorTest.php b/api/tests/State/Processor/ReviewPersistProcessorTest.php index 734e56d67..901aff01f 100644 --- a/api/tests/State/Processor/ReviewPersistProcessorTest.php +++ b/api/tests/State/Processor/ReviewPersistProcessorTest.php @@ -20,12 +20,18 @@ final class ReviewPersistProcessorTest extends TestCase { - private MockObject|ProcessorInterface $persistProcessorMock; - private MockObject|Security $securityMock; - private MockObject|User $userMock; - private MockObject|Review $objectMock; + private MockObject $persistProcessorMock; + + private MockObject $securityMock; + + private MockObject $userMock; + + private MockObject $objectMock; + private ClockInterface|MockObject $clockMock; - private ResourceHandlerInterface|MockObject $resourceHandlerMock; + + private MockObject $resourceHandlerMock; + private ReviewPersistProcessor $processor; protected function setUp(): void diff --git a/api/tests/State/Processor/ReviewRemoveProcessorTest.php b/api/tests/State/Processor/ReviewRemoveProcessorTest.php index b78207816..20bf1fdf8 100644 --- a/api/tests/State/Processor/ReviewRemoveProcessorTest.php +++ b/api/tests/State/Processor/ReviewRemoveProcessorTest.php @@ -4,10 +4,7 @@ namespace App\Tests\State\Processor; -use ApiPlatform\Metadata\ApiResource; -use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\Operation; -use ApiPlatform\Metadata\Resource\ResourceMetadataCollection; use ApiPlatform\State\ProcessorInterface; use App\Entity\Review; use App\Entity\User; @@ -19,21 +16,20 @@ final class ReviewRemoveProcessorTest extends TestCase { - private MockObject|ProcessorInterface $removeProcessorMock; - private ResourceMetadataCollection $resourceMetadataCollection; - private MockObject|Review $objectMock; - private MockObject|Operation $operationMock; - private ResourceHandlerInterface|MockObject $resourceHandlerMock; + private MockObject $removeProcessorMock; + + private MockObject $objectMock; + + private MockObject $operationMock; + + private MockObject $resourceHandlerMock; + private ReviewRemoveProcessor $processor; protected function setUp(): void { $this->removeProcessorMock = $this->createMock(ProcessorInterface::class); $this->resourceHandlerMock = $this->createMock(ResourceHandlerInterface::class); - $this->resourceMetadataCollection = new ResourceMetadataCollection(Review::class, [ - new ApiResource(operations: [new Get('/admin/reviews/{id}{._format}')]), - new ApiResource(operations: [new Get('/books/{bookId}/reviews/{id}{._format}')]), - ]); $this->objectMock = $this->createMock(Review::class); $this->operationMock = $this->createMock(Operation::class); diff --git a/api/tests/bootstrap.php b/api/tests/bootstrap.php index bc032e910..879655fa7 100644 --- a/api/tests/bootstrap.php +++ b/api/tests/bootstrap.php @@ -13,7 +13,7 @@ if (file_exists(dirname(__DIR__) . '/config/bootstrap.php')) { require dirname(__DIR__) . '/config/bootstrap.php'; } elseif (method_exists(Dotenv::class, 'bootEnv')) { - (new Dotenv())->bootEnv(dirname(__DIR__) . '/.env'); + new Dotenv()->bootEnv(dirname(__DIR__) . '/.env'); } if ($_SERVER['APP_DEBUG']) { diff --git a/helm/api-platform/Chart.yaml b/helm/api-platform/Chart.yaml index 49ffd8858..21835c0ac 100644 --- a/helm/api-platform/Chart.yaml +++ b/helm/api-platform/Chart.yaml @@ -17,12 +17,12 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 4.1.17 +version: 4.1.18 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. -appVersion: 4.1.17 +appVersion: 4.1.18 dependencies: - name: postgresql