diff --git a/.docker/data/.gitignore b/.docker/data/.gitignore index 80a9dc9..4ce1020 100644 --- a/.docker/data/.gitignore +++ b/.docker/data/.gitignore @@ -1,5 +1,5 @@ # Ignore everything in this directory * -# Except this file +# Except !.gitignore -!Readme.md +!README.md diff --git a/.docker/nginx.conf b/.docker/nginx.conf index 8fe03db..ec278a5 100644 --- a/.docker/nginx.conf +++ b/.docker/nginx.conf @@ -17,9 +17,7 @@ http { include /etc/nginx/mime.types; default_type application/octet-stream; - set_real_ip_from 172.16.0.0/16; - real_ip_recursive on; - real_ip_header X-Forwarded-For; + # Note: set_real_ip_from is set in the server block log_format main '$http_x_real_ip - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' diff --git a/.docker/templates/default.conf.template b/.docker/templates/default.conf.template index 36f49cb..69b9694 100644 --- a/.docker/templates/default.conf.template +++ b/.docker/templates/default.conf.template @@ -6,17 +6,24 @@ server { client_max_body_size ${NGINX_MAX_BODY_SIZE}; - # This also needs to be set in the single server tag and not only in http. set_real_ip_from 172.16.0.0/16; + set_real_ip_from 192.168.39.0/24; real_ip_recursive on; real_ip_header X-Forwarded-For; - location / { - # We are co-hosting with the legacy EventDB, so this app is hosted under '/api/v2/' (.env::APP_PATH_PREFIX) - # This is configured for Symfony in both 'api_platform.prefix' and 'framework.assets.base_path'. However - # Symfony still installs assets in the root path so we need to rewrite the uri to remove '/api/v2/'. - rewrite ^${APP_PATH_PREFIX}/(.*) /$1 break; + location = /cron-metrics { + # Proxy to supercronic metrics + proxy_pass http://${NGINX_CRON_METRICS}/metrics; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + # Project-specific server config (.docker/templates/server.d/*.conf.template). + include /etc/nginx/conf.d/server.d/*.conf; + + location / { # try to serve file directly, fallback to index.php try_files $uri /index.php$is_args$args; } diff --git a/.docker/templates/server.d/app-path-prefix.conf.template b/.docker/templates/server.d/app-path-prefix.conf.template new file mode 100644 index 0000000..97f4641 --- /dev/null +++ b/.docker/templates/server.d/app-path-prefix.conf.template @@ -0,0 +1,4 @@ +# This app shares the domain with event-database-imports, so this app is served under '/api/v2/' (.env::APP_PATH_PREFIX). +# This is configured for Symfony in both 'api_platform.prefix' and 'framework.assets.base_path'. However +# Symfony still installs assets in the root path so we need to rewrite the uri to remove '/api/v2/'. +rewrite ^${APP_PATH_PREFIX}/(.*) /$1 break; diff --git a/.env b/.env index 61dd506..77e9740 100644 --- a/.env +++ b/.env @@ -21,6 +21,7 @@ ITKDEV_TEMPLATE=symfony-6 ###> symfony/framework-bundle ### APP_ENV=dev APP_SECRET= +APP_SHARE_DIR=var/share ###< symfony/framework-bundle ### ###> app ### @@ -53,3 +54,9 @@ INDEX_ORGANIZATION_ALIAS=organization ###> nelmio/cors-bundle ### CORS_ALLOW_ORIGIN='*' ###< nelmio/cors-bundle ### + +###> symfony/routing ### +# Configure how to generate URLs in non-HTTP contexts, such as CLI commands. +# See https://symfony.com/doc/current/routing.html#generating-urls-in-commands +DEFAULT_URI=https://${COMPOSE_DOMAIN} +###< symfony/routing ### diff --git a/.github/workflows/api-spec.yml b/.github/workflows/api-spec.yml index 7dd51eb..93e3072 100644 --- a/.github/workflows/api-spec.yml +++ b/.github/workflows/api-spec.yml @@ -31,14 +31,14 @@ jobs: uses: actions/cache@v5 with: path: vendor - key: vendor-php8.4-${{ hashFiles('composer.lock') }} - restore-keys: vendor-php8.4- + key: vendor-php8.5-${{ hashFiles('composer.lock') }} + restore-keys: vendor-php8.5- - name: Install dependencies run: | docker network create frontend # The spec export only needs PHP — pull phpfpm alone and run it as a - # one-off (--no-deps skips mariadb/rabbit), not the whole stack. + # one-off (--no-deps skips mariadb), not the whole stack. docker compose pull --quiet phpfpm docker compose run --rm --no-deps phpfpm composer install --no-interaction diff --git a/.github/workflows/changelog.yaml b/.github/workflows/changelog.yaml index 71da908..54b9acb 100644 --- a/.github/workflows/changelog.yaml +++ b/.github/workflows/changelog.yaml @@ -14,8 +14,6 @@ on: jobs: changelog: runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - name: Checkout uses: actions/checkout@v7 @@ -26,4 +24,6 @@ jobs: run: git fetch - name: Check that changelog has been updated. - run: git diff --exit-code origin/${{ github.base_ref }} -- CHANGELOG.md && exit 1 || exit 0 + env: + BASE_REF: ${{ github.base_ref }} + run: git diff --exit-code "origin/$BASE_REF" -- CHANGELOG.md && exit 1 || exit 0 diff --git a/.github/workflows/composer.yaml b/.github/workflows/composer.yaml index def97d2..b50dadb 100644 --- a/.github/workflows/composer.yaml +++ b/.github/workflows/composer.yaml @@ -26,20 +26,23 @@ name: Composer env: - COMPOSE_USER: root + COMPOSE_USER: runner on: pull_request: + paths: &paths + - "composer.json" + - "composer.lock" + - "docker-compose.yml" push: branches: - main - develop + paths: *paths jobs: composer-validate: runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - uses: actions/checkout@v7 @@ -52,8 +55,6 @@ jobs: composer-normalized: runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - uses: actions/checkout@v7 @@ -67,8 +68,6 @@ jobs: composer-audit: runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - uses: actions/checkout@v7 diff --git a/.github/workflows/markdown.yaml b/.github/workflows/markdown.yaml index b0f74c5..ac0fc21 100644 --- a/.github/workflows/markdown.yaml +++ b/.github/workflows/markdown.yaml @@ -22,16 +22,17 @@ name: Markdown on: pull_request: + paths: &paths + - "**/*.md" push: branches: - main - develop + paths: *paths jobs: markdown-lint: runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - name: Checkout uses: actions/checkout@v7 diff --git a/.github/workflows/php.yaml b/.github/workflows/php.yaml index 5188018..6326d8e 100644 --- a/.github/workflows/php.yaml +++ b/.github/workflows/php.yaml @@ -34,14 +34,20 @@ name: Symfony PHP env: - COMPOSE_USER: root + COMPOSE_USER: runner on: pull_request: + paths: &paths + - "**/*.php" + - "composer.json" + - "composer.lock" + - "docker-compose.yml" push: branches: - main - develop + paths: *paths jobs: coding-standards: diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index b83d147..16e48a2 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -17,14 +17,14 @@ jobs: uses: actions/cache@v5 with: path: vendor - key: vendor-php8.4-${{ hashFiles('composer.lock') }} - restore-keys: vendor-php8.4- + key: vendor-php8.5-${{ hashFiles('composer.lock') }} + restore-keys: vendor-php8.5- - name: Start docker compose setup and install site run: | docker network create frontend - # API tests need PHP + Elasticsearch only (not mariadb/rabbit/nginx/mail); - # --no-deps keeps phpfpm's mariadb/rabbit dependencies from starting. + # API tests need PHP + Elasticsearch only (not mariadb/nginx/mail); + # --no-deps keeps phpfpm's mariadb dependency from starting. docker compose pull --quiet phpfpm elasticsearch docker compose up --detach --wait --no-deps phpfpm elasticsearch docker compose exec -T phpfpm composer install --no-interaction @@ -57,8 +57,8 @@ jobs: uses: actions/cache@v5 with: path: vendor - key: vendor-php8.4-${{ hashFiles('composer.lock') }} - restore-keys: vendor-php8.4- + key: vendor-php8.5-${{ hashFiles('composer.lock') }} + restore-keys: vendor-php8.5- - name: Install dependencies run: | @@ -81,8 +81,8 @@ jobs: uses: actions/cache@v5 with: path: vendor - key: vendor-php8.4-${{ hashFiles('composer.lock') }} - restore-keys: vendor-php8.4- + key: vendor-php8.5-${{ hashFiles('composer.lock') }} + restore-keys: vendor-php8.5- - name: Install dependencies run: | diff --git a/.github/workflows/twig.yaml b/.github/workflows/twig.yaml index 047d881..ffb7055 100644 --- a/.github/workflows/twig.yaml +++ b/.github/workflows/twig.yaml @@ -24,20 +24,24 @@ name: Twig env: - COMPOSE_USER: root + COMPOSE_USER: runner on: pull_request: + paths: &paths + - "**/*.twig" + - "composer.json" + - "composer.lock" + - "docker-compose.yml" push: branches: - main - develop + paths: *paths jobs: twig-lint: runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - name: Checkout uses: actions/checkout@v7 diff --git a/.github/workflows/yaml.yaml b/.github/workflows/yaml.yaml index 80d0a23..c54cf8e 100644 --- a/.github/workflows/yaml.yaml +++ b/.github/workflows/yaml.yaml @@ -22,10 +22,14 @@ name: YAML on: pull_request: + paths: &paths + - "**/*.yml" + - "**/*.yaml" push: branches: - main - develop + paths: *paths jobs: yaml-lint: @@ -38,4 +42,4 @@ jobs: docker network create frontend - run: | - docker compose run --rm prettier '**/*.{yml,yaml}' --check + docker compose run --rm prettier --no-editorconfig '**/*.{yml,yaml}' --check diff --git a/.gitignore b/.gitignore index 82d4029..fcb71d2 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ ###< symfony/phpunit-bridge ### ###> vincentlanglet/twig-cs-fixer ### +/.twig-cs-fixer.php /.twig-cs-fixer.cache ###< vincentlanglet/twig-cs-fixer ### diff --git a/.markdownlintignore b/.markdownlintignore index d143ace..14323f9 100644 --- a/.markdownlintignore +++ b/.markdownlintignore @@ -5,6 +5,8 @@ vendor/ node_modules/ LICENSE.md +# Python +.venv/ # Drupal web/*.md web/core/ diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index e9d23a8..18f6586 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -1,4 +1,5 @@ setFinder($finder); $config->setRules([ - '@Symfony' => true, - 'phpdoc_align' => false, + '@Symfony' => true, + 'phpdoc_align' => false, ]); return $config; diff --git a/.prettierrc.yaml b/.prettierrc.yaml index 12e0898..b1d7be1 100644 --- a/.prettierrc.yaml +++ b/.prettierrc.yaml @@ -3,6 +3,13 @@ # https://prettier.io/docs/configuration overrides: + # https://taskfile.dev/docs/styleguide + - files: + - "Taskfile.{yml,yaml}" + options: + tabWidth: 2 + singleQuote: true + # Symfony config - files: - "config/**/*.{yml,yaml}" diff --git a/CHANGELOG.md b/CHANGELOG.md index a5462b0..5b322e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,27 @@ See [keep a changelog] for information about writing changes to this log. ## [Unreleased] +## [1.4.0] - 2026-11-08 + +- [PR-78](https://github.com/itk-dev/event-database-api/pull/78) + Add PHPStan deprecation rules (ignore the API Platform 4.4 `#[ApiFilter]` deprecations) +- [PR-77](https://github.com/itk-dev/event-database-api/pull/77) + Update Symfony Flex recipes +- [PR-76](https://github.com/itk-dev/event-database-api/pull/76) + Update API Platform to 4.4 (OpenAPI 3.2.0, no `charset` in the `application/ld+json` content type) +- [PR-75](https://github.com/itk-dev/event-database-api/pull/75) + Update Rector (2.8) and PHPStan (2.3) and apply the new Rector rules +- [PR-74](https://github.com/itk-dev/event-database-api/pull/74) + Update dependencies in-constraint (Symfony 7.4.23 security release, API Platform 4.3.21, PHPUnit 13.4) +- [PR-73](https://github.com/itk-dev/event-database-api/pull/73) + Require all directly used packages in `composer.json`, checked by PHPStan (`pb30/phpstan-composer-analysis`) +- [PR-72](https://github.com/itk-dev/event-database-api/pull/72) + Update Elasticsearch to 8.19.23 and remove the unused RabbitMQ service +- [PR-71](https://github.com/itk-dev/event-database-api/pull/71) + Require PHP 8.5 and apply the Rector PHP 8.5 rules +- [PR-70](https://github.com/itk-dev/event-database-api/pull/70) + Update the docker compose template (itk-version 3.2.4) and the PHP 8.5 image + ## [1.3.0] - 2026-11-04 - [PR-62](https://github.com/itk-dev/event-database-api/pull/62) @@ -179,7 +200,8 @@ See [keep a changelog] for information about writing changes to this log. - Added multi-value filtering for Lactions and Organizations [keep a changelog]: https://keepachangelog.com/en/1.1.0/ -[Unreleased]: https://github.com/itk-dev/event-database-api/compare/1.3.0...HEAD +[Unreleased]: https://github.com/itk-dev/event-database-api/compare/1.4.0...HEAD +[1.4.0]: https://github.com/itk-dev/event-database-api/compare/1.3.0...1.4.0 [1.3.0]: https://github.com/itk-dev/event-database-api/compare/1.2.6...1.3.0 [1.2.6]: https://github.com/itk-dev/event-database-api/compare/1.2.5...1.2.6 [1.2.5]: https://github.com/itk-dev/event-database-api/compare/1.2.4...1.2.5 diff --git a/CLAUDE.md b/CLAUDE.md index d94f409..7cc162e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -10,8 +10,8 @@ API platform front-end for the Danish event database used by the municipality of `docker-compose.yml` is part of the standard ITK Dev Symfony image but is **not used for domain data** (the `migrations/` and `src/Entity/` directories are empty). -Stack: PHP 8.3+, Symfony 7.4, API Platform 4.3, Elasticsearch 8.x. Runs entirely in Docker via -`itkdev/php8.4-fpm` + nginx. +Stack: PHP 8.5+, Symfony 7.4, API Platform 4.3, Elasticsearch 8.x. Runs entirely in Docker via +`itkdev/php8.5-fpm` + nginx. ## Common commands diff --git a/Taskfile.yml b/Taskfile.yml index b63cd08..b437714 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -1,9 +1,9 @@ # https://taskfile.dev -version: "3" +version: '3' # https://taskfile.dev/usage/#env-files -dotenv: [".env.local", ".env"] +dotenv: ['.env.local', '.env'] vars: # https://taskfile.dev/reference/templating/ @@ -57,20 +57,20 @@ tasks: COMPOSE_ARGS: exec phpfpm bin/console app:fixtures:load {{.ITEM}} --url=file:///app/tests/resources/{{.ITEM}}.json composer: - desc: "Run `composer` command. Example: task composer -- normalize" + desc: 'Run `composer` command. Example: task composer -- normalize' cmds: - task: compose vars: COMPOSE_ARGS: exec phpfpm composer {{.COMPOSER_ARGS}} compose: - desc: "Run `docker compose` command. Example: task compose -- ps" + desc: 'Run `docker compose` command. Example: task compose -- ps' cmds: # Run docker compose with both arguments passed via var plus any cli args. - - "{{.DOCKER_COMPOSE}} {{.COMPOSE_ARGS}} {{.CLI_ARGS}}" + - '{{.DOCKER_COMPOSE}} {{.COMPOSE_ARGS}} {{.CLI_ARGS}}' console: - desc: "Run Symfony console command. Example: task console -- cache:clear" + desc: 'Run Symfony console command. Example: task console -- cache:clear' cmds: # Run docker compose with both arguments passed via var plus any cli args. - task: compose @@ -78,7 +78,7 @@ tasks: COMPOSE_ARGS: exec phpfpm bin/console {{.CONSOLE_ARGS}} coding-standards:apply: - desc: "Apply coding standards" + desc: 'Apply coding standards' cmds: - task: coding-standards:markdown:apply - task: coding-standards:php:apply @@ -87,7 +87,7 @@ tasks: silent: true coding-standards:check: - desc: "Apply coding standards" + desc: 'Apply coding standards' cmds: - task: coding-standards:markdown:check - task: coding-standards:php:check @@ -96,14 +96,14 @@ tasks: silent: true coding-standards:markdown:apply: - desc: "Apply coding standards for Markdown" + desc: 'Apply coding standards for Markdown' cmds: - task: compose vars: COMPOSE_ARGS: run --rm markdownlint markdownlint '**/*.md' --fix coding-standards:markdown:check: - desc: "Apply and check coding standards for Markdown" + desc: 'Apply and check coding standards for Markdown' cmds: - task: coding-standards:markdown:apply - task: compose @@ -111,7 +111,7 @@ tasks: COMPOSE_ARGS: run --rm markdownlint markdownlint '**/*.md' coding-standards:php:apply: - desc: "Apply coding standards for PHP" + desc: 'Apply coding standards for PHP' cmds: - task: compose vars: @@ -119,7 +119,7 @@ tasks: silent: true coding-standards:php:check: - desc: "Apply and check coding standards for PHP" + desc: 'Apply and check coding standards for PHP' cmds: - task: coding-standards:php:apply - task: compose @@ -128,7 +128,7 @@ tasks: silent: true coding-standards:twig:apply: - desc: "Apply coding standards for Twig" + desc: 'Apply coding standards for Twig' cmds: - task: compose vars: @@ -136,7 +136,7 @@ tasks: silent: true coding-standards:twig:check: - desc: "Apply and check coding standards for Twig" + desc: 'Apply and check coding standards for Twig' cmds: - task: coding-standards:twig:apply - task: compose @@ -145,7 +145,7 @@ tasks: silent: true coding-standards:yaml:apply: - desc: "Apply coding standards for YAML" + desc: 'Apply coding standards for YAML' cmds: - task: compose vars: @@ -153,7 +153,7 @@ tasks: silent: true coding-standards:yaml:check: - desc: "Apply and check coding standards for YAML" + desc: 'Apply and check coding standards for YAML' cmds: - task: coding-standards:yaml:apply - task: compose @@ -162,14 +162,14 @@ tasks: silent: true code-analysis: - desc: "Run code analysis" + desc: 'Run code analysis' cmds: - task: code-analysis:phpstan - task: code-analysis:rector silent: true code-analysis:phpstan: - desc: "Run PHPStan" + desc: 'Run PHPStan' cmds: - task: compose vars: @@ -177,7 +177,7 @@ tasks: silent: true code-analysis:rector: - desc: "Check for Rector suggestions (dry-run; no changes applied)" + desc: 'Check for Rector suggestions (dry-run; no changes applied)' cmds: - task: compose vars: @@ -185,7 +185,7 @@ tasks: silent: true code-analysis:rector:apply: - desc: "Apply Rector changes" + desc: 'Apply Rector changes' cmds: - task: compose vars: diff --git a/bin/phpunit b/bin/phpunit index 692bacc..ac5eef1 100755 --- a/bin/phpunit +++ b/bin/phpunit @@ -1,23 +1,4 @@ #!/usr/bin/env php = 80000) { - require dirname(__DIR__).'/vendor/phpunit/phpunit/phpunit'; - } else { - define('PHPUNIT_COMPOSER_INSTALL', dirname(__DIR__).'/vendor/autoload.php'); - require PHPUNIT_COMPOSER_INSTALL; - PHPUnit\TextUI\Command::main(); - } -} else { - if (!is_file(dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php')) { - echo "Unable to find the `simple-phpunit.php` script in `vendor/symfony/phpunit-bridge/bin/`.\n"; - exit(1); - } - - require dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php'; -} +require dirname(__DIR__).'/vendor/phpunit/phpunit/phpunit'; diff --git a/composer.json b/composer.json index ffeefda..c665983 100644 --- a/composer.json +++ b/composer.json @@ -4,27 +4,37 @@ "license": "proprietary", "type": "project", "require": { - "php": ">=8.3", + "php": ">=8.5", "ext-ctype": "*", "ext-iconv": "*", - "api-platform/core": "~4.3.0", + "api-platform/core": "~4.4.0", "elasticsearch/elasticsearch": "^8.19", "nelmio/cors-bundle": "^2.4", "phpdocumentor/reflection-docblock": "^5.6", "phpstan/phpdoc-parser": "^2.2", + "psr/container": "^2.0", "symfony/asset": "~7.4.0", "symfony/console": "~7.4.0", + "symfony/dependency-injection": "~7.4.0", "symfony/dotenv": "~7.4.0", "symfony/expression-language": "~7.4.0", "symfony/flex": "^2", "symfony/framework-bundle": "~7.4.0", "symfony/http-client": "~7.4.0", + "symfony/http-client-contracts": "^3.7", + "symfony/http-foundation": "~7.4.0", + "symfony/http-kernel": "~7.4.0", "symfony/property-access": "~7.4.0", "symfony/property-info": "~7.4.0", + "symfony/routing": "~7.4.0", "symfony/runtime": "~7.4.0", "symfony/security-bundle": "~7.4.0", + "symfony/security-core": "~7.4.0", + "symfony/security-http": "~7.4.0", "symfony/serializer": "~7.4.0", + "symfony/string": "~7.4.0", "symfony/twig-bundle": "~7.4.0", + "symfony/type-info": "~7.4.0", "symfony/validator": "~7.4.0", "symfony/yaml": "~7.4.0" }, @@ -32,8 +42,10 @@ "ergebnis/composer-normalize": "^2.47", "friendsofphp/php-cs-fixer": "^3.86", "justinrainbow/json-schema": "^6.10", + "pb30/phpstan-composer-analysis": "^1.1", "phpstan/extension-installer": "^1.4", "phpstan/phpstan": "^2.1", + "phpstan/phpstan-deprecation-rules": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpstan/phpstan-symfony": "^2.0", "phpunit/phpunit": "^13", diff --git a/composer.lock b/composer.lock index 3c3f893..a22f967 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "747cb423309e517227c3648b1003fc5a", + "content-hash": "9191b2f4b520ad3382f47d428fa5f251", "packages": [ { "name": "api-platform/core", - "version": "v4.3.16", + "version": "v4.4.6", "source": { "type": "git", "url": "https://github.com/api-platform/core.git", - "reference": "95dd0232dd50e982d37f0590cb35ca3cefd13efa" + "reference": "fcaa1cd28551de1a84ae1437b16472486ebf57f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/core/zipball/95dd0232dd50e982d37f0590cb35ca3cefd13efa", - "reference": "95dd0232dd50e982d37f0590cb35ca3cefd13efa", + "url": "https://api.github.com/repos/api-platform/core/zipball/fcaa1cd28551de1a84ae1437b16472486ebf57f9", + "reference": "fcaa1cd28551de1a84ae1437b16472486ebf57f9", "shasum": "" }, "require": { @@ -26,16 +26,17 @@ "php": ">=8.2", "psr/cache": "^1.0 || ^2.0 || ^3.0", "psr/container": "^1.0 || ^2.0", + "symfony/asset": "^7.4 || ^8.0", "symfony/deprecation-contracts": "^3.1", - "symfony/http-foundation": "^6.4.14 || ^7.0 || ^8.0", - "symfony/http-kernel": "^6.4.13 || ^7.0 || ^8.0", - "symfony/property-access": "^6.4 || ^7.0 || ^8.0", - "symfony/property-info": "^6.4 || ^7.1 || ^8.0", - "symfony/serializer": "^6.4.37 || ^7.4.9 || ^8.0.9", + "symfony/http-foundation": "^7.4 || ^8.0", + "symfony/http-kernel": "^7.4 || ^8.0", + "symfony/property-access": "^7.4 || ^8.0", + "symfony/property-info": "^7.4 || ^8.0", + "symfony/serializer": "^7.4.9 || ^8.0.9", "symfony/translation-contracts": "^3.3", "symfony/type-info": "^7.4 || ^8.0", - "symfony/validator": "^6.4.11 || ^7.1 || ^8.0", - "symfony/web-link": "^6.4 || ^7.1 || ^8.0", + "symfony/validator": "^7.4 || ^8.0", + "symfony/web-link": "^7.4 || ^8.0", "willdurand/negotiation": "^3.1" }, "conflict": { @@ -46,7 +47,7 @@ "doctrine/persistence": "<1.3", "phpspec/prophecy": "<1.15", "phpunit/phpunit": "<9.5", - "symfony/framework-bundle": "6.4.6 || 7.0.6", + "symfony/framework-bundle": "<7.4", "symfony/object-mapper": "<7.3.4", "symfony/var-exporter": "<6.1.1" }, @@ -77,8 +78,8 @@ "require-dev": { "doctrine/common": "^3.2.2", "doctrine/dbal": "^4.0", - "doctrine/doctrine-bundle": "^2.11 || ^3.1", - "doctrine/orm": "^2.17 || ^3.0", + "doctrine/doctrine-bundle": "^2.11.1 || ^3.1", + "doctrine/orm": "^2.17 || ^3.3", "elasticsearch/elasticsearch": "^7.17 || ^8.4 || ^9.0", "friendsofphp/php-cs-fixer": "^3.93", "guzzlehttp/guzzle": "^6.0 || ^7.0", @@ -92,7 +93,7 @@ "jangregor/phpstan-prophecy": "^2.1.11", "justinrainbow/json-schema": "^6.5.2", "laravel/framework": "^11.0 || ^12.0 || ^13.0", - "mcp/sdk": "^0.6", + "mcp/sdk": "^0.8", "orchestra/testbench": "^10.9 || ^11.0", "phpspec/prophecy-phpunit": "^2.2", "phpstan/extension-installer": "^1.1", @@ -107,39 +108,38 @@ "ramsey/uuid-doctrine": "^2.0", "soyuka/pmu": "^0.2.0", "soyuka/stubs-mongodb": "^1.0", - "symfony/asset": "^6.4 || ^7.0 || ^8.0", - "symfony/browser-kit": "^6.4 || ^7.0 || ^8.0", - "symfony/cache": "^6.4 || ^7.0 || ^8.0", - "symfony/config": "^6.4 || ^7.0 || ^8.0", - "symfony/console": "^6.4 || ^7.0 || ^8.0", - "symfony/css-selector": "^6.4 || ^7.0 || ^8.0", - "symfony/dependency-injection": "^6.4 || ^7.0 || ^8.0", - "symfony/doctrine-bridge": "^6.4.2 || ^7.1 || ^8.0", - "symfony/dom-crawler": "^6.4 || ^7.0 || ^8.0", - "symfony/error-handler": "^6.4 || ^7.0 || ^8.0", - "symfony/event-dispatcher": "^6.4 || ^7.0 || ^8.0", - "symfony/expression-language": "^6.4 || ^7.0 || ^8.0", - "symfony/finder": "^6.4 || ^7.0 || ^8.0", - "symfony/form": "^6.4 || ^7.0 || ^8.0", - "symfony/framework-bundle": "^6.4 || ^7.0 || ^8.0", - "symfony/http-client": "^6.4 || ^7.0 || ^8.0", - "symfony/intl": "^6.4 || ^7.0 || ^8.0", + "symfony/browser-kit": "^7.4 || ^8.0", + "symfony/cache": "^7.4 || ^8.0", + "symfony/config": "^7.4 || ^8.0", + "symfony/console": "^7.4 || ^8.0", + "symfony/css-selector": "^7.4 || ^8.0", + "symfony/dependency-injection": "^7.4 || ^8.0", + "symfony/doctrine-bridge": "^7.4 || ^8.0", + "symfony/dom-crawler": "^7.4 || ^8.0", + "symfony/error-handler": "^7.4 || ^8.0", + "symfony/event-dispatcher": "^7.4 || ^8.0", + "symfony/expression-language": "^7.4 || ^8.0", + "symfony/finder": "^7.4 || ^8.0", + "symfony/form": "^7.4 || ^8.0", + "symfony/framework-bundle": "^7.4 || ^8.0", + "symfony/http-client": "^7.4 || ^8.0", + "symfony/intl": "^7.4 || ^8.0", "symfony/json-streamer": "^7.4 || ^8.0", "symfony/maker-bundle": "^1.24", - "symfony/mcp-bundle": "dev-main", - "symfony/mercure-bundle": "*", - "symfony/messenger": "^6.4 || ^7.0 || ^8.0", + "symfony/mcp-bundle": "^0.13", + "symfony/mercure-bundle": "^0.5", + "symfony/messenger": "^7.4 || ^8.0", "symfony/object-mapper": "^7.4 || ^8.0", - "symfony/routing": "^6.4 || ^7.0 || ^8.0", - "symfony/security-bundle": "^6.4 || ^7.0 || ^8.0", - "symfony/security-core": "^6.4 || ^7.0 || ^8.0", - "symfony/stopwatch": "^6.4 || ^7.0 || ^8.0", - "symfony/string": "^6.4 || ^7.0 || ^8.0", - "symfony/twig-bundle": "^6.4 || ^7.0 || ^8.0", - "symfony/uid": "^6.4 || ^7.0 || ^8.0", + "symfony/routing": "^7.4 || ^8.0", + "symfony/security-bundle": "^7.4 || ^8.0", + "symfony/security-core": "^7.4 || ^8.0", + "symfony/stopwatch": "^7.4 || ^8.0", + "symfony/string": "^7.4 || ^8.0", + "symfony/twig-bundle": "^7.4 || ^8.0", + "symfony/uid": "^7.4 || ^8.0", "symfony/var-exporter": "^7.4 || ^8.0", - "symfony/web-profiler-bundle": "^6.4 || ^7.0 || ^8.0", - "symfony/yaml": "^6.4 || ^7.0 || ^8.0", + "symfony/web-profiler-bundle": "^7.4 || ^8.0", + "symfony/yaml": "^7.4 || ^8.0", "twig/twig": "^1.42.3 || ^2.12 || ^3.0", "webonyx/graphql-php": "^15.0" }, @@ -175,7 +175,7 @@ "name": "api-platform/api-platform" }, "symfony": { - "require": "^6.4 || ^7.1 || ^8.0" + "require": "^7.4 || ^8.0" }, "branch-alias": { "dev-3.4": "3.4.x-dev", @@ -220,22 +220,23 @@ ], "support": { "issues": "https://github.com/api-platform/core/issues", - "source": "https://github.com/api-platform/core/tree/v4.3.16" + "source": "https://github.com/api-platform/core/tree/v4.4.6" }, - "time": "2026-07-03T06:59:33+00:00" + "time": "2026-10-23T07:49:00+00:00", + "published-time": "2026-10-23T07:53:11+00:00" }, { "name": "composer/semver", - "version": "3.4.4", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" + "reference": "d92543b7ede9c4ec6b59853cefb061e39866d2cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", - "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "url": "https://api.github.com/repos/composer/semver/zipball/d92543b7ede9c4ec6b59853cefb061e39866d2cf", + "reference": "d92543b7ede9c4ec6b59853cefb061e39866d2cf", "shasum": "" }, "require": { @@ -277,7 +278,7 @@ "homepage": "http://robbast.nl" } ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", + "description": "Version comparison library that offers utilities, version constraint parsing and validation.", "keywords": [ "semantic", "semver", @@ -287,7 +288,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.4" + "source": "https://github.com/composer/semver/tree/3.6.0" }, "funding": [ { @@ -299,7 +300,8 @@ "type": "github" } ], - "time": "2025-08-20T19:15:30+00:00" + "time": "2026-10-29T09:13:34+00:00", + "published-time": "2026-10-29T09:14:11+00:00" }, { "name": "doctrine/deprecations", @@ -347,27 +349,28 @@ "issues": "https://github.com/doctrine/deprecations/issues", "source": "https://github.com/doctrine/deprecations/tree/1.1.6" }, - "time": "2026-02-07T07:09:04+00:00" + "time": "2026-02-07T07:09:04+00:00", + "published-time": "2026-02-07T07:10:09+00:00" }, { "name": "doctrine/inflector", - "version": "2.1.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + "reference": "46351b6812b7b6d52b82c3efa5dfb786a198ec88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", - "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/46351b6812b7b6d52b82c3efa5dfb786a198ec88", + "reference": "46351b6812b7b6d52b82c3efa5dfb786a198ec88", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^12.0 || ^13.0", + "doctrine/coding-standard": "^12.0 || ^14.0", "phpstan/phpstan": "^1.12 || ^2.0", "phpstan/phpstan-phpunit": "^1.4 || ^2.0", "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", @@ -421,7 +424,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.1.0" + "source": "https://github.com/doctrine/inflector/tree/2.1.1" }, "funding": [ { @@ -437,20 +440,21 @@ "type": "tidelift" } ], - "time": "2025-08-10T19:31:58+00:00" + "time": "2026-10-26T08:14:14+00:00", + "published-time": "2026-10-26T20:06:59+00:00" }, { "name": "elastic/transport", - "version": "v8.11.0", + "version": "v8.11.1", "source": { "type": "git", "url": "https://github.com/elastic/elastic-transport-php.git", - "reference": "1d476af5dc0b74530d59b67d5dd96ee39768d5a4" + "reference": "b037aa80e5f44de034706cd7b8f3695b08b2cec6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/elastic/elastic-transport-php/zipball/1d476af5dc0b74530d59b67d5dd96ee39768d5a4", - "reference": "1d476af5dc0b74530d59b67d5dd96ee39768d5a4", + "url": "https://api.github.com/repos/elastic/elastic-transport-php/zipball/b037aa80e5f44de034706cd7b8f3695b08b2cec6", + "reference": "b037aa80e5f44de034706cd7b8f3695b08b2cec6", "shasum": "" }, "require": { @@ -493,9 +497,10 @@ ], "support": { "issues": "https://github.com/elastic/elastic-transport-php/issues", - "source": "https://github.com/elastic/elastic-transport-php/tree/v8.11.0" + "source": "https://github.com/elastic/elastic-transport-php/tree/v8.11.1" }, - "time": "2025-04-02T08:20:33+00:00" + "time": "2026-10-22T14:57:01+00:00", + "published-time": "2026-10-22T14:57:39+00:00" }, { "name": "elasticsearch/elasticsearch", @@ -552,26 +557,27 @@ "issues": "https://github.com/elastic/elasticsearch-php/issues", "source": "https://github.com/elastic/elasticsearch-php/tree/v8.19.0" }, - "time": "2025-08-06T16:58:06+00:00" + "time": "2025-08-06T16:58:06+00:00", + "published-time": "2025-08-06T17:07:33+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.15.5", + "version": "7.16.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a" + "reference": "81755d989b3007ca7f88a069857553cd08e7dc2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ee80339fd9177ba44c49cdb653ff02a4d1106b9a", - "reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/81755d989b3007ca7f88a069857553cd08e7dc2e", + "reference": "81755d989b3007ca7f88a069857553cd08e7dc2e", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^2.5.3", - "guzzlehttp/psr7": "^2.13.1", + "guzzlehttp/promises": "^2.6", + "guzzlehttp/psr7": "^2.13.2", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.5 || ^3.0", @@ -664,7 +670,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.15.5" + "source": "https://github.com/guzzle/guzzle/tree/7.16.1" }, "funding": [ { @@ -680,20 +686,21 @@ "type": "tidelift" } ], - "time": "2026-08-24T09:21:06+00:00" + "time": "2026-10-25T21:35:21+00:00", + "published-time": "2026-10-25T21:37:23+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.5.3", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1" + "reference": "3d88c829bd5f13d13847b39067dbf09a60af2154" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/cde49999552d185d64715fe9c1f77a2aadd2f9f1", - "reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1", + "url": "https://api.github.com/repos/guzzle/promises/zipball/3d88c829bd5f13d13847b39067dbf09a60af2154", + "reference": "3d88c829bd5f13d13847b39067dbf09a60af2154", "shasum": "" }, "require": { @@ -748,7 +755,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.5.3" + "source": "https://github.com/guzzle/promises/tree/2.6.0" }, "funding": [ { @@ -764,20 +771,21 @@ "type": "tidelift" } ], - "time": "2026-08-24T09:11:28+00:00" + "time": "2026-10-18T12:46:59+00:00", + "published-time": "2026-10-18T12:47:39+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.13.1", + "version": "2.13.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "95e7828100de18b4e269fb1703be530082d5166d" + "reference": "adee536f95101929f262b8c59e8a61472f347d58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/95e7828100de18b4e269fb1703be530082d5166d", - "reference": "95e7828100de18b4e269fb1703be530082d5166d", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/adee536f95101929f262b8c59e8a61472f347d58", + "reference": "adee536f95101929f262b8c59e8a61472f347d58", "shasum": "" }, "require": { @@ -867,7 +875,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.13.1" + "source": "https://github.com/guzzle/psr7/tree/2.13.2" }, "funding": [ { @@ -883,7 +891,8 @@ "type": "tidelift" } ], - "time": "2026-08-24T09:13:11+00:00" + "time": "2026-10-17T23:49:46+00:00", + "published-time": "2026-10-17T23:51:00+00:00" }, { "name": "nelmio/cors-bundle", @@ -948,20 +957,21 @@ "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.6.1" }, - "time": "2026-01-12T15:59:08+00:00" + "time": "2026-01-12T15:59:08+00:00", + "published-time": "2026-01-14T20:01:36+00:00" }, { "name": "open-telemetry/api", - "version": "1.9.0", + "version": "1.10.1", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/api.git", - "reference": "6f8d237ce2c304ca85f31970f788e7f074d147be" + "reference": "b2bc26bf8bd6b2b6447b3626b2a1b5733873aa0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/6f8d237ce2c304ca85f31970f788e7f074d147be", - "reference": "6f8d237ce2c304ca85f31970f788e7f074d147be", + "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/b2bc26bf8bd6b2b6447b3626b2a1b5733873aa0b", + "reference": "b2bc26bf8bd6b2b6447b3626b2a1b5733873aa0b", "shasum": "" }, "require": { @@ -1018,7 +1028,8 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2026-02-25T13:24:05+00:00" + "time": "2026-09-16T01:59:09+00:00", + "published-time": "2026-10-20T00:48:16+00:00" }, { "name": "open-telemetry/context", @@ -1077,7 +1088,8 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2025-10-19T06:44:33+00:00" + "time": "2025-10-19T06:44:33+00:00", + "published-time": "2026-03-25T14:04:42+00:00" }, { "name": "php-http/discovery", @@ -1156,7 +1168,8 @@ "issues": "https://github.com/php-http/discovery/issues", "source": "https://github.com/php-http/discovery/tree/1.20.0" }, - "time": "2024-10-02T11:20:13+00:00" + "time": "2024-10-02T11:20:13+00:00", + "published-time": "2024-10-02T11:21:00+00:00" }, { "name": "php-http/httplug", @@ -1213,7 +1226,8 @@ "issues": "https://github.com/php-http/httplug/issues", "source": "https://github.com/php-http/httplug/tree/2.4.1" }, - "time": "2024-09-23T11:39:58+00:00" + "time": "2024-09-23T11:39:58+00:00", + "published-time": "2024-09-23T11:40:47+00:00" }, { "name": "php-http/promise", @@ -1265,24 +1279,30 @@ "issues": "https://github.com/php-http/promise/issues", "source": "https://github.com/php-http/promise/tree/1.3.1" }, - "time": "2024-03-15T13:55:21+00:00" + "time": "2024-03-15T13:55:21+00:00", + "published-time": "2024-03-15T13:55:45+00:00" }, { "name": "phpdocumentor/reflection-common", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + "reference": "ee15a5a2022c8383906b225055e9496a6a5e6e3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/ee15a5a2022c8383906b225055e9496a6a5e6e3b", + "reference": "ee15a5a2022c8383906b225055e9496a6a5e6e3b", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.25" }, "type": "library", "extra": { @@ -1306,7 +1326,7 @@ } ], "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", + "homepage": "https://www.phpdoc.org", "keywords": [ "FQSEN", "phpDocumentor", @@ -1316,9 +1336,10 @@ ], "support": { "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.2.1" }, - "time": "2020-06-27T09:03:43+00:00" + "time": "2025-11-10T21:21:55+00:00", + "published-time": "2026-09-27T10:14:49+00:00" }, { "name": "phpdocumentor/reflection-docblock", @@ -1382,7 +1403,8 @@ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.7" }, - "time": "2026-03-18T20:47:46+00:00" + "time": "2026-03-18T20:47:46+00:00", + "published-time": "2026-03-18T20:49:11+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -1440,20 +1462,21 @@ "issues": "https://github.com/phpDocumentor/TypeResolver/issues", "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0" }, - "time": "2025-11-21T15:09:14+00:00" + "time": "2025-11-21T15:09:14+00:00", + "published-time": "2025-11-24T21:00:34+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.3", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "fb19eedd2bb67ff8cf7a5502ad329e701d6398a3" + "reference": "af8e840551031d254cfdb3a18a62c3470a309c10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fb19eedd2bb67ff8cf7a5502ad329e701d6398a3", - "reference": "fb19eedd2bb67ff8cf7a5502ad329e701d6398a3", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/af8e840551031d254cfdb3a18a62c3470a309c10", + "reference": "af8e840551031d254cfdb3a18a62c3470a309c10", "shasum": "" }, "require": { @@ -1485,9 +1508,10 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.3" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.4.1" }, - "time": "2026-07-08T07:01:06+00:00" + "time": "2026-10-30T19:36:28+00:00", + "published-time": "2026-10-30T19:37:11+00:00" }, { "name": "psr/cache", @@ -1536,7 +1560,8 @@ "support": { "source": "https://github.com/php-fig/cache/tree/3.0.0" }, - "time": "2021-02-03T23:26:27+00:00" + "time": "2021-02-03T23:26:27+00:00", + "published-time": "2021-02-03T23:27:34+00:00" }, { "name": "psr/clock", @@ -1584,7 +1609,8 @@ "issues": "https://github.com/php-fig/clock/issues", "source": "https://github.com/php-fig/clock/tree/1.0.0" }, - "time": "2022-11-25T14:36:26+00:00" + "time": "2022-11-25T14:36:26+00:00", + "published-time": "2022-11-25T14:59:22+00:00" }, { "name": "psr/container", @@ -1637,7 +1663,8 @@ "issues": "https://github.com/php-fig/container/issues", "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-11-05T16:47:00+00:00" + "time": "2021-11-05T16:47:00+00:00", + "published-time": "2021-11-05T16:53:27+00:00" }, { "name": "psr/event-dispatcher", @@ -1687,7 +1714,8 @@ "issues": "https://github.com/php-fig/event-dispatcher/issues", "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, - "time": "2019-01-08T18:20:26+00:00" + "time": "2019-01-08T18:20:26+00:00", + "published-time": "2019-03-25T15:31:44+00:00" }, { "name": "psr/http-client", @@ -1739,7 +1767,8 @@ "support": { "source": "https://github.com/php-fig/http-client" }, - "time": "2023-09-23T14:17:50+00:00" + "time": "2023-09-23T14:17:50+00:00", + "published-time": "2023-09-23T14:18:12+00:00" }, { "name": "psr/http-factory", @@ -1794,7 +1823,8 @@ "support": { "source": "https://github.com/php-fig/http-factory" }, - "time": "2024-04-15T12:06:14+00:00" + "time": "2024-04-15T12:06:14+00:00", + "published-time": "2024-05-10T07:32:19+00:00" }, { "name": "psr/http-message", @@ -1847,7 +1877,8 @@ "support": { "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "time": "2023-04-04T09:54:51+00:00" + "time": "2023-04-04T09:54:51+00:00", + "published-time": "2023-04-04T09:55:35+00:00" }, { "name": "psr/link", @@ -1903,7 +1934,8 @@ "support": { "source": "https://github.com/php-fig/link/tree/2.0.1" }, - "time": "2021-03-11T23:00:27+00:00" + "time": "2021-03-11T23:00:27+00:00", + "published-time": "2021-03-11T23:05:05+00:00" }, { "name": "psr/log", @@ -1953,7 +1985,8 @@ "support": { "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2024-09-11T13:17:53+00:00" + "time": "2024-09-11T13:17:53+00:00", + "published-time": "2024-09-11T13:21:14+00:00" }, { "name": "ralouphie/getallheaders", @@ -1997,7 +2030,8 @@ "issues": "https://github.com/ralouphie/getallheaders/issues", "source": "https://github.com/ralouphie/getallheaders/tree/develop" }, - "time": "2019-03-08T08:55:37+00:00" + "time": "2019-03-08T08:55:37+00:00", + "published-time": "2019-03-08T09:01:32+00:00" }, { "name": "symfony/asset", @@ -2070,20 +2104,21 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-24T13:12:05+00:00", + "published-time": "2026-03-31T21:09:42+00:00" }, { "name": "symfony/cache", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "9adfcb2a7fc3924473b09f5a0b058dcc2cc7be9a" + "reference": "bbaa2ca4a93a94532285bdd5a0caf225d34ff578" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/9adfcb2a7fc3924473b09f5a0b058dcc2cc7be9a", - "reference": "9adfcb2a7fc3924473b09f5a0b058dcc2cc7be9a", + "url": "https://api.github.com/repos/symfony/cache/zipball/bbaa2ca4a93a94532285bdd5a0caf225d34ff578", + "reference": "bbaa2ca4a93a94532285bdd5a0caf225d34ff578", "shasum": "" }, "require": { @@ -2097,7 +2132,6 @@ }, "conflict": { "doctrine/dbal": "<3.6", - "ext-redis": "<6.1", "ext-relay": "<0.12.1", "symfony/dependency-injection": "<6.4", "symfony/http-kernel": "<6.4", @@ -2109,7 +2143,7 @@ "symfony/cache-implementation": "1.1|2.0|3.0" }, "require-dev": { - "cache/integration-tests": "dev-master", + "cache/integration-tests": "^1.0.3", "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", @@ -2154,7 +2188,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.4.14" + "source": "https://github.com/symfony/cache/tree/v7.4.23" }, "funding": [ { @@ -2174,20 +2208,21 @@ "type": "tidelift" } ], - "time": "2026-06-17T14:44:48+00:00" + "time": "2026-11-01T22:26:51+00:00", + "published-time": "2026-11-04T11:28:20+00:00" }, { "name": "symfony/cache-contracts", - "version": "v3.7.1", + "version": "v3.8.1", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "9789738bc19af1106dc54d6afba9a0b467516cf2" + "reference": "af26a91232085b7edd4e04be62f75e7c25159ece" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/9789738bc19af1106dc54d6afba9a0b467516cf2", - "reference": "9789738bc19af1106dc54d6afba9a0b467516cf2", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/af26a91232085b7edd4e04be62f75e7c25159ece", + "reference": "af26a91232085b7edd4e04be62f75e7c25159ece", "shasum": "" }, "require": { @@ -2201,7 +2236,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.7-dev" + "dev-main": "3.8-dev" } }, "autoload": { @@ -2234,7 +2269,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.7.1" + "source": "https://github.com/symfony/cache-contracts/tree/v3.8.1" }, "funding": [ { @@ -2254,20 +2289,21 @@ "type": "tidelift" } ], - "time": "2026-06-05T06:23:12+00:00" + "time": "2026-09-26T07:05:14+00:00", + "published-time": "2026-11-04T11:25:38+00:00" }, { "name": "symfony/clock", - "version": "v7.4.8", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111" + "reference": "07437f612dca89c1894c1db04491002b1e798f03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/674fa3b98e21531dd040e613479f5f6fa8f32111", - "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111", + "url": "https://api.github.com/repos/symfony/clock/zipball/07437f612dca89c1894c1db04491002b1e798f03", + "reference": "07437f612dca89c1894c1db04491002b1e798f03", "shasum": "" }, "require": { @@ -2312,7 +2348,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.4.8" + "source": "https://github.com/symfony/clock/tree/v7.4.21" }, "funding": [ { @@ -2332,20 +2368,21 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-10-12T14:31:36+00:00", + "published-time": "2026-10-14T06:45:48+00:00" }, { "name": "symfony/config", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "7b665e443381ea7c4db03eb03b4bf79ea2b020eb" + "reference": "8ef666abf731e85e59cf478929dda6c7cb2fa9c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/7b665e443381ea7c4db03eb03b4bf79ea2b020eb", - "reference": "7b665e443381ea7c4db03eb03b4bf79ea2b020eb", + "url": "https://api.github.com/repos/symfony/config/zipball/8ef666abf731e85e59cf478929dda6c7cb2fa9c4", + "reference": "8ef666abf731e85e59cf478929dda6c7cb2fa9c4", "shasum": "" }, "require": { @@ -2391,7 +2428,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.4.14" + "source": "https://github.com/symfony/config/tree/v7.4.23" }, "funding": [ { @@ -2411,20 +2448,21 @@ "type": "tidelift" } ], - "time": "2026-06-09T07:51:57+00:00" + "time": "2026-11-04T08:27:22+00:00", + "published-time": "2026-11-04T11:27:33+00:00" }, { "name": "symfony/console", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "92f58bc4bf97a92ed1b9f367f0cd44f20bde0e87" + "reference": "81957c2440c05c962fe8291f318de6e85f8db330" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/92f58bc4bf97a92ed1b9f367f0cd44f20bde0e87", - "reference": "92f58bc4bf97a92ed1b9f367f0cd44f20bde0e87", + "url": "https://api.github.com/repos/symfony/console/zipball/81957c2440c05c962fe8291f318de6e85f8db330", + "reference": "81957c2440c05c962fe8291f318de6e85f8db330", "shasum": "" }, "require": { @@ -2489,7 +2527,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.14" + "source": "https://github.com/symfony/console/tree/v7.4.23" }, "funding": [ { @@ -2509,20 +2547,21 @@ "type": "tidelift" } ], - "time": "2026-06-16T11:50:14+00:00" + "time": "2026-11-03T21:47:07+00:00", + "published-time": "2026-11-04T11:27:31+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "2c8c64a33e2e6911579e1ff79a8e06c27d48d402" + "reference": "4df0d83a8253d95b222c2f136b9dca3a1a9451a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2c8c64a33e2e6911579e1ff79a8e06c27d48d402", - "reference": "2c8c64a33e2e6911579e1ff79a8e06c27d48d402", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/4df0d83a8253d95b222c2f136b9dca3a1a9451a7", + "reference": "4df0d83a8253d95b222c2f136b9dca3a1a9451a7", "shasum": "" }, "require": { @@ -2573,7 +2612,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.4.14" + "source": "https://github.com/symfony/dependency-injection/tree/v7.4.23" }, "funding": [ { @@ -2593,20 +2632,21 @@ "type": "tidelift" } ], - "time": "2026-06-24T07:41:05+00:00" + "time": "2026-11-01T17:38:00+00:00", + "published-time": "2026-11-04T11:27:44+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.7.1", + "version": "v3.8.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" + "reference": "feb1edf4e546af3b85c5caebe8359a20db230ca3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", - "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/feb1edf4e546af3b85c5caebe8359a20db230ca3", + "reference": "feb1edf4e546af3b85c5caebe8359a20db230ca3", "shasum": "" }, "require": { @@ -2619,7 +2659,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.7-dev" + "dev-main": "3.8-dev" } }, "autoload": { @@ -2644,7 +2684,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.8.1" }, "funding": [ { @@ -2664,20 +2704,21 @@ "type": "tidelift" } ], - "time": "2026-06-05T06:23:12+00:00" + "time": "2026-09-16T14:15:10+00:00", + "published-time": "2026-11-04T11:25:34+00:00" }, { "name": "symfony/dotenv", - "version": "v7.4.14", + "version": "v7.4.18", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "9b9c7a00e565238857eea0040dc9745e3576402e" + "reference": "99b5b14953237c89ed24f1af5ba34225caf598a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/9b9c7a00e565238857eea0040dc9745e3576402e", - "reference": "9b9c7a00e565238857eea0040dc9745e3576402e", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/99b5b14953237c89ed24f1af5ba34225caf598a4", + "reference": "99b5b14953237c89ed24f1af5ba34225caf598a4", "shasum": "" }, "require": { @@ -2722,7 +2763,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v7.4.14" + "source": "https://github.com/symfony/dotenv/tree/v7.4.18" }, "funding": [ { @@ -2742,20 +2783,21 @@ "type": "tidelift" } ], - "time": "2026-06-05T06:22:21+00:00" + "time": "2026-07-26T10:22:28+00:00", + "published-time": "2026-08-30T21:39:35+00:00" }, { "name": "symfony/error-handler", - "version": "v7.4.14", + "version": "v7.4.22", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "4e1a093b481f323e6e326451f9760c3868430673" + "reference": "545852cfe9c4979c82389155b4d8d05f8864e4f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/4e1a093b481f323e6e326451f9760c3868430673", - "reference": "4e1a093b481f323e6e326451f9760c3868430673", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/545852cfe9c4979c82389155b4d8d05f8864e4f1", + "reference": "545852cfe9c4979c82389155b4d8d05f8864e4f1", "shasum": "" }, "require": { @@ -2804,7 +2846,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.4.14" + "source": "https://github.com/symfony/error-handler/tree/v7.4.22" }, "funding": [ { @@ -2824,20 +2866,21 @@ "type": "tidelift" } ], - "time": "2026-06-05T06:22:21+00:00" + "time": "2026-10-25T14:40:16+00:00", + "published-time": "2026-10-28T18:20:15+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.4.14", + "version": "v7.4.17", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "51fe3d170227be8d1772214b82ae506e15ed78ff" + "reference": "d269974ee93c61d03620ffee358355bfdb471d66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/51fe3d170227be8d1772214b82ae506e15ed78ff", - "reference": "51fe3d170227be8d1772214b82ae506e15ed78ff", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d269974ee93c61d03620ffee358355bfdb471d66", + "reference": "d269974ee93c61d03620ffee358355bfdb471d66", "shasum": "" }, "require": { @@ -2889,7 +2932,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.14" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.17" }, "funding": [ { @@ -2909,20 +2952,21 @@ "type": "tidelift" } ], - "time": "2026-06-06T11:10:32+00:00" + "time": "2026-08-21T17:40:08+00:00", + "published-time": "2026-08-22T13:44:01+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.7.1", + "version": "v3.8.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e" + "reference": "658e29751424da3ef4758c60f769e59d1b2981eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c7de7a00ffb67842132da02ea92988a39ccd9f4e", - "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/658e29751424da3ef4758c60f769e59d1b2981eb", + "reference": "658e29751424da3ef4758c60f769e59d1b2981eb", "shasum": "" }, "require": { @@ -2936,7 +2980,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.7-dev" + "dev-main": "3.8-dev" } }, "autoload": { @@ -2969,7 +3013,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.8.1" }, "funding": [ { @@ -2989,7 +3033,8 @@ "type": "tidelift" } ], - "time": "2026-06-05T06:23:12+00:00" + "time": "2026-09-16T14:15:10+00:00", + "published-time": "2026-11-04T11:25:36+00:00" }, { "name": "symfony/expression-language", @@ -3057,20 +3102,21 @@ "type": "tidelift" } ], - "time": "2026-10-09T13:57:53+00:00" + "time": "2026-10-09T13:57:53+00:00", + "published-time": "2026-10-14T06:45:54+00:00" }, { "name": "symfony/filesystem", - "version": "v7.4.11", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "d721ea61b4a5fba8c5b6e7c1feda19efea144b50" + "reference": "53d609da66578dad5a39fe290e8f924ec8f05e93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/d721ea61b4a5fba8c5b6e7c1feda19efea144b50", - "reference": "d721ea61b4a5fba8c5b6e7c1feda19efea144b50", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/53d609da66578dad5a39fe290e8f924ec8f05e93", + "reference": "53d609da66578dad5a39fe290e8f924ec8f05e93", "shasum": "" }, "require": { @@ -3107,7 +3153,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.4.11" + "source": "https://github.com/symfony/filesystem/tree/v7.4.23" }, "funding": [ { @@ -3127,20 +3173,21 @@ "type": "tidelift" } ], - "time": "2026-05-11T16:38:44+00:00" + "time": "2026-11-04T08:27:22+00:00", + "published-time": "2026-11-04T11:28:00+00:00" }, { "name": "symfony/finder", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "13b38720174286f55d1761152b575a8d1436fc25" + "reference": "c723f990aefe8c1053b18374faf4231eba84f518" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/13b38720174286f55d1761152b575a8d1436fc25", - "reference": "13b38720174286f55d1761152b575a8d1436fc25", + "url": "https://api.github.com/repos/symfony/finder/zipball/c723f990aefe8c1053b18374faf4231eba84f518", + "reference": "c723f990aefe8c1053b18374faf4231eba84f518", "shasum": "" }, "require": { @@ -3175,7 +3222,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.14" + "source": "https://github.com/symfony/finder/tree/v7.4.23" }, "funding": [ { @@ -3195,20 +3242,21 @@ "type": "tidelift" } ], - "time": "2026-06-27T08:31:18+00:00" + "time": "2026-11-02T10:56:49+00:00", + "published-time": "2026-11-04T11:28:12+00:00" }, { "name": "symfony/flex", - "version": "v2.11.0", + "version": "v2.12.0", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "4a6d98eea3ebc7f68d82810cb682eedca2649e99" + "reference": "3d37e8597c2290c095433b4260563986f857a274" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/4a6d98eea3ebc7f68d82810cb682eedca2649e99", - "reference": "4a6d98eea3ebc7f68d82810cb682eedca2649e99", + "url": "https://api.github.com/repos/symfony/flex/zipball/3d37e8597c2290c095433b4260563986f857a274", + "reference": "3d37e8597c2290c095433b4260563986f857a274", "shasum": "" }, "require": { @@ -3248,7 +3296,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.11.0" + "source": "https://github.com/symfony/flex/tree/v2.12.0" }, "funding": [ { @@ -3268,20 +3316,21 @@ "type": "tidelift" } ], - "time": "2026-05-29T17:25:22+00:00" + "time": "2026-10-29T17:24:46+00:00", + "published-time": "2026-10-29T17:26:51+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "4d11fd50d0a3d2c43b400154ad7ec35b84ea3e5b" + "reference": "6a749f2c37cb9def53793633ec72958aaad4b359" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/4d11fd50d0a3d2c43b400154ad7ec35b84ea3e5b", - "reference": "4d11fd50d0a3d2c43b400154ad7ec35b84ea3e5b", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/6a749f2c37cb9def53793633ec72958aaad4b359", + "reference": "6a749f2c37cb9def53793633ec72958aaad4b359", "shasum": "" }, "require": { @@ -3290,13 +3339,13 @@ "php": ">=8.2", "symfony/cache": "^6.4.12|^7.0|^8.0", "symfony/config": "^7.4.4|^8.0.4", - "symfony/dependency-injection": "^7.4.4|^8.0.4", + "symfony/dependency-injection": "^7.4.15|~8.0.15|^8.1.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^7.3|^8.0", "symfony/event-dispatcher": "^6.4|^7.0|^8.0", "symfony/filesystem": "^7.1|^8.0", "symfony/finder": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-foundation": "^7.4.23|^8.1.11", "symfony/http-kernel": "^7.4|^8.0", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php85": "^1.32", @@ -3309,13 +3358,13 @@ "symfony/asset": "<6.4", "symfony/asset-mapper": "<6.4", "symfony/clock": "<6.4", - "symfony/console": "<6.4", + "symfony/console": "<6.4.43|>=7.0,<7.4.15|>=8.0,<8.0.15", "symfony/dom-crawler": "<6.4", "symfony/dotenv": "<6.4", "symfony/form": "<7.4", "symfony/http-client": "<6.4", "symfony/lock": "<6.4", - "symfony/mailer": "<6.4", + "symfony/mailer": "<6.4.44|>=7.0,<7.4.17|>=8.0,<8.1.5", "symfony/messenger": "<7.4", "symfony/mime": "<6.4.37|>=7.0,<7.4.9|>=8.0,<8.0.9", "symfony/property-access": "<6.4", @@ -3335,7 +3384,6 @@ "symfony/workflow": "<7.4" }, "require-dev": { - "doctrine/persistence": "^1.3|^2|^3", "dragonmantank/cron-expression": "^3.1", "phpdocumentor/reflection-docblock": "^5.2|^6.0", "seld/jsonlint": "^1.10", @@ -3343,7 +3391,7 @@ "symfony/asset-mapper": "^6.4|^7.0|^8.0", "symfony/browser-kit": "^6.4|^7.0|^8.0", "symfony/clock": "^6.4|^7.0|^8.0", - "symfony/console": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4.43|^7.4.15|^8.0.15", "symfony/css-selector": "^6.4|^7.0|^8.0", "symfony/dom-crawler": "^6.4|^7.0|^8.0", "symfony/dotenv": "^6.4|^7.0|^8.0", @@ -3378,7 +3426,7 @@ "symfony/webhook": "^7.4|^8.0", "symfony/workflow": "^7.4|^8.0", "symfony/yaml": "^7.3|^8.0", - "twig/twig": "^3.12" + "twig/twig": "^3.12|^4.0" }, "type": "symfony-bundle", "autoload": { @@ -3406,7 +3454,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.4.14" + "source": "https://github.com/symfony/framework-bundle/tree/v7.4.23" }, "funding": [ { @@ -3426,20 +3474,21 @@ "type": "tidelift" } ], - "time": "2026-06-27T08:31:38+00:00" + "time": "2026-11-04T07:46:24+00:00", + "published-time": "2026-11-04T11:27:38+00:00" }, { "name": "symfony/http-client", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "f6bc6b5a54ff5afac4725cacec9bf2f52eb15920" + "reference": "ed012bfca0f7b45d97016efcdf9b0639c52a1722" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/f6bc6b5a54ff5afac4725cacec9bf2f52eb15920", - "reference": "f6bc6b5a54ff5afac4725cacec9bf2f52eb15920", + "url": "https://api.github.com/repos/symfony/http-client/zipball/ed012bfca0f7b45d97016efcdf9b0639c52a1722", + "reference": "ed012bfca0f7b45d97016efcdf9b0639c52a1722", "shasum": "" }, "require": { @@ -3507,7 +3556,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.4.14" + "source": "https://github.com/symfony/http-client/tree/v7.4.23" }, "funding": [ { @@ -3527,20 +3576,21 @@ "type": "tidelift" } ], - "time": "2026-06-16T11:50:14+00:00" + "time": "2026-11-04T08:27:22+00:00", + "published-time": "2026-11-04T11:28:32+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.7.1", + "version": "v3.8.1", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "41fc42d276aeff21192465331ebbab7d83a743c0" + "reference": "f9f94260f787446c6fd430b2ae1969fe41ae1ba8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41fc42d276aeff21192465331ebbab7d83a743c0", - "reference": "41fc42d276aeff21192465331ebbab7d83a743c0", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/f9f94260f787446c6fd430b2ae1969fe41ae1ba8", + "reference": "f9f94260f787446c6fd430b2ae1969fe41ae1ba8", "shasum": "" }, "require": { @@ -3553,7 +3603,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.7-dev" + "dev-main": "3.8-dev" } }, "autoload": { @@ -3589,7 +3639,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.7.1" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.8.1" }, "funding": [ { @@ -3609,20 +3659,21 @@ "type": "tidelift" } ], - "time": "2026-06-05T06:23:12+00:00" + "time": "2026-10-04T15:04:25+00:00", + "published-time": "2026-11-04T11:25:37+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.4.22", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "63eda1d0c4de229d6b3e825709e49dd5c149699a" + "reference": "7fb73cffa06e2bcc2cb523fcccb1e8174106b206" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/63eda1d0c4de229d6b3e825709e49dd5c149699a", - "reference": "63eda1d0c4de229d6b3e825709e49dd5c149699a", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7fb73cffa06e2bcc2cb523fcccb1e8174106b206", + "reference": "7fb73cffa06e2bcc2cb523fcccb1e8174106b206", "shasum": "" }, "require": { @@ -3671,7 +3722,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.4.22" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.23" }, "funding": [ { @@ -3691,20 +3742,21 @@ "type": "tidelift" } ], - "time": "2026-10-27T13:26:03+00:00" + "time": "2026-11-04T08:27:22+00:00", + "published-time": "2026-11-04T11:28:53+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "e99af79b1e776646eda0e1c23b7b45c184ff99be" + "reference": "94c57f4c5c45a311d244a0aeadb72b14ee41d25d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/e99af79b1e776646eda0e1c23b7b45c184ff99be", - "reference": "e99af79b1e776646eda0e1c23b7b45c184ff99be", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/94c57f4c5c45a311d244a0aeadb72b14ee41d25d", + "reference": "94c57f4c5c45a311d244a0aeadb72b14ee41d25d", "shasum": "" }, "require": { @@ -3762,7 +3814,7 @@ "symfony/validator": "^6.4|^7.0|^8.0", "symfony/var-dumper": "^6.4|^7.0|^8.0", "symfony/var-exporter": "^6.4|^7.0|^8.0", - "twig/twig": "^3.12" + "twig/twig": "^3.12|^4.0" }, "type": "library", "autoload": { @@ -3790,7 +3842,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.4.14" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.23" }, "funding": [ { @@ -3810,7 +3862,8 @@ "type": "tidelift" } ], - "time": "2026-06-27T09:14:35+00:00" + "time": "2026-11-04T11:26:18+00:00", + "published-time": "2026-11-04T11:27:47+00:00" }, { "name": "symfony/password-hasher", @@ -3886,20 +3939,21 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-24T13:12:05+00:00", + "published-time": "2026-03-31T21:10:21+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.38.1", + "version": "v1.43.3", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "e9247d281d694a5120554d9afaf54e070e88a603" + "reference": "5a8f33c87aeecffce24e721b5064fab05f4becf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603", - "reference": "e9247d281d694a5120554d9afaf54e070e88a603", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5a8f33c87aeecffce24e721b5064fab05f4becf8", + "reference": "5a8f33c87aeecffce24e721b5064fab05f4becf8", "shasum": "" }, "require": { @@ -3948,7 +4002,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.43.3" }, "funding": [ { @@ -3968,20 +4022,21 @@ "type": "tidelift" } ], - "time": "2026-05-26T05:58:03+00:00" + "time": "2026-10-15T09:18:53+00:00", + "published-time": "2026-10-28T10:07:44+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.38.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" + "reference": "ebd57ccc7edb93d632e184efbe7693d2517bab3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", - "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/ebd57ccc7edb93d632e184efbe7693d2517bab3b", + "reference": "ebd57ccc7edb93d632e184efbe7693d2517bab3b", "shasum": "" }, "require": { @@ -4033,7 +4088,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.43.0" }, "funding": [ { @@ -4053,20 +4108,21 @@ "type": "tidelift" } ], - "time": "2026-05-25T13:48:31+00:00" + "time": "2026-09-23T22:02:09+00:00", + "published-time": "2026-09-30T10:23:47+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.38.2", + "version": "v1.43.3", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" + "reference": "122889ed24dc000165bcbfd77ec412f15cbdfc6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", - "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/122889ed24dc000165bcbfd77ec412f15cbdfc6a", + "reference": "122889ed24dc000165bcbfd77ec412f15cbdfc6a", "shasum": "" }, "require": { @@ -4118,7 +4174,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.43.3" }, "funding": [ { @@ -4138,20 +4194,21 @@ "type": "tidelift" } ], - "time": "2026-05-27T06:59:30+00:00" + "time": "2026-10-28T09:35:49+00:00", + "published-time": "2026-10-28T10:07:45+00:00" }, { "name": "symfony/polyfill-php82", - "version": "v1.38.1", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php82.git", - "reference": "002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b" + "reference": "843bbe8b2a7934307b749751eede0f111f5d1cfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php82/zipball/002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b", - "reference": "002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b", + "url": "https://api.github.com/repos/symfony/polyfill-php82/zipball/843bbe8b2a7934307b749751eede0f111f5d1cfc", + "reference": "843bbe8b2a7934307b749751eede0f111f5d1cfc", "shasum": "" }, "require": { @@ -4198,7 +4255,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php82/tree/v1.38.1" + "source": "https://github.com/symfony/polyfill-php82/tree/v1.43.0" }, "funding": [ { @@ -4218,20 +4275,21 @@ "type": "tidelift" } ], - "time": "2026-05-26T12:45:58+00:00" + "time": "2026-09-25T15:50:05+00:00", + "published-time": "2026-09-30T10:23:32+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.38.2", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "796a26abb75ce49f3a84433cd81bf1009d73d5f8" + "reference": "80ccff923a8d61f73ebe9da0aa94e25232f004ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/796a26abb75ce49f3a84433cd81bf1009d73d5f8", - "reference": "796a26abb75ce49f3a84433cd81bf1009d73d5f8", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/80ccff923a8d61f73ebe9da0aa94e25232f004ce", + "reference": "80ccff923a8d61f73ebe9da0aa94e25232f004ce", "shasum": "" }, "require": { @@ -4278,7 +4336,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.38.2" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.43.0" }, "funding": [ { @@ -4298,20 +4356,21 @@ "type": "tidelift" } ], - "time": "2026-05-27T06:51:48+00:00" + "time": "2026-09-25T15:50:05+00:00", + "published-time": "2026-09-30T10:23:43+00:00" }, { "name": "symfony/polyfill-php84", - "version": "v1.38.1", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" + "reference": "22c6548499cbe5c5bb072fc0c42312dff062a015" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", - "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/22c6548499cbe5c5bb072fc0c42312dff062a015", + "reference": "22c6548499cbe5c5bb072fc0c42312dff062a015", "shasum": "" }, "require": { @@ -4358,7 +4417,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.43.0" }, "funding": [ { @@ -4378,20 +4437,21 @@ "type": "tidelift" } ], - "time": "2026-05-26T12:51:13+00:00" + "time": "2026-09-23T22:01:09+00:00", + "published-time": "2026-09-30T10:23:33+00:00" }, { "name": "symfony/polyfill-php85", - "version": "v1.38.1", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1" + "reference": "86a42cbcc07adc331481a5ab310a4024bfc227f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", - "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/86a42cbcc07adc331481a5ab310a4024bfc227f6", + "reference": "86a42cbcc07adc331481a5ab310a4024bfc227f6", "shasum": "" }, "require": { @@ -4438,7 +4498,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php85/tree/v1.38.1" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.43.0" }, "funding": [ { @@ -4458,20 +4518,21 @@ "type": "tidelift" } ], - "time": "2026-05-26T02:25:22+00:00" + "time": "2026-09-25T15:46:47+00:00", + "published-time": "2026-09-30T10:23:32+00:00" }, { "name": "symfony/property-access", - "version": "v7.4.8", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "b7dad9dae8b8a47ef7ecc76c8569e7d8c7d90cfc" + "reference": "4dce45112d7a31d530d2e0e69143fc88eaa1521f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/b7dad9dae8b8a47ef7ecc76c8569e7d8c7d90cfc", - "reference": "b7dad9dae8b8a47ef7ecc76c8569e7d8c7d90cfc", + "url": "https://api.github.com/repos/symfony/property-access/zipball/4dce45112d7a31d530d2e0e69143fc88eaa1521f", + "reference": "4dce45112d7a31d530d2e0e69143fc88eaa1521f", "shasum": "" }, "require": { @@ -4519,7 +4580,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.4.8" + "source": "https://github.com/symfony/property-access/tree/v7.4.23" }, "funding": [ { @@ -4539,20 +4600,21 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-11-01T19:17:22+00:00", + "published-time": "2026-11-04T11:28:09+00:00" }, { "name": "symfony/property-info", - "version": "v7.4.8", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "ac5e82528b986c4f7cfccbf7764b5d2e824d6175" + "reference": "1eeaa666bcd1864b883b98cad9e5188064ddac26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/ac5e82528b986c4f7cfccbf7764b5d2e824d6175", - "reference": "ac5e82528b986c4f7cfccbf7764b5d2e824d6175", + "url": "https://api.github.com/repos/symfony/property-info/zipball/1eeaa666bcd1864b883b98cad9e5188064ddac26", + "reference": "1eeaa666bcd1864b883b98cad9e5188064ddac26", "shasum": "" }, "require": { @@ -4609,7 +4671,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.4.8" + "source": "https://github.com/symfony/property-info/tree/v7.4.23" }, "funding": [ { @@ -4629,20 +4691,21 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-11-02T10:56:49+00:00", + "published-time": "2026-11-04T11:28:19+00:00" }, { "name": "symfony/routing", - "version": "v7.4.13", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "3a162171bb008e5e0f15dce6581373a4c0e8390d" + "reference": "0000ade604b7bc798cb1e75edf6f17df48185f73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/3a162171bb008e5e0f15dce6581373a4c0e8390d", - "reference": "3a162171bb008e5e0f15dce6581373a4c0e8390d", + "url": "https://api.github.com/repos/symfony/routing/zipball/0000ade604b7bc798cb1e75edf6f17df48185f73", + "reference": "0000ade604b7bc798cb1e75edf6f17df48185f73", "shasum": "" }, "require": { @@ -4694,7 +4757,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.13" + "source": "https://github.com/symfony/routing/tree/v7.4.23" }, "funding": [ { @@ -4714,20 +4777,21 @@ "type": "tidelift" } ], - "time": "2026-05-24T11:20:33+00:00" + "time": "2026-11-04T08:27:22+00:00", + "published-time": "2026-11-04T11:28:04+00:00" }, { "name": "symfony/runtime", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "15497f743dd714f3167cb6a56509b9d42e6417b3" + "reference": "5149bb4e03eb69bdbfda792c50c99ed87321851d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/15497f743dd714f3167cb6a56509b9d42e6417b3", - "reference": "15497f743dd714f3167cb6a56509b9d42e6417b3", + "url": "https://api.github.com/repos/symfony/runtime/zipball/5149bb4e03eb69bdbfda792c50c99ed87321851d", + "reference": "5149bb4e03eb69bdbfda792c50c99ed87321851d", "shasum": "" }, "require": { @@ -4779,7 +4843,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v7.4.14" + "source": "https://github.com/symfony/runtime/tree/v7.4.23" }, "funding": [ { @@ -4799,20 +4863,21 @@ "type": "tidelift" } ], - "time": "2026-06-05T06:22:21+00:00" + "time": "2026-11-01T08:32:25+00:00", + "published-time": "2026-11-04T11:28:46+00:00" }, { "name": "symfony/security-bundle", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "6ec147e67262c6f5ac5dbb8b2ccbb34af14c4d79" + "reference": "1cb338633172a5ce2fb92b31f5d39315f4aa4c00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/6ec147e67262c6f5ac5dbb8b2ccbb34af14c4d79", - "reference": "6ec147e67262c6f5ac5dbb8b2ccbb34af14c4d79", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/1cb338633172a5ce2fb92b31f5d39315f4aa4c00", + "reference": "1cb338633172a5ce2fb92b31f5d39315f4aa4c00", "shasum": "" }, "require": { @@ -4824,12 +4889,12 @@ "symfony/dependency-injection": "^6.4.11|^7.1.4|^8.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4.50|^7.4.23|^8.1.11", "symfony/http-kernel": "^6.4.13|^7.1.6|^8.0", "symfony/password-hasher": "^6.4|^7.0|^8.0", - "symfony/security-core": "^7.4|^8.0", + "symfony/security-core": "^7.4.22|^8.1.10", "symfony/security-csrf": "^6.4|^7.0|^8.0", - "symfony/security-http": "^7.4|^8.0", + "symfony/security-http": "^7.4.21|^8.1.9", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -4853,6 +4918,7 @@ "symfony/framework-bundle": "^6.4.13|^7.1.6|^8.0", "symfony/http-client": "^6.4|^7.0|^8.0", "symfony/ldap": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", "symfony/process": "^6.4|^7.0|^8.0", "symfony/rate-limiter": "^6.4|^7.0|^8.0", "symfony/runtime": "^6.4.13|^7.1.6|^8.0", @@ -4862,7 +4928,7 @@ "symfony/twig-bundle": "^6.4|^7.0|^8.0", "symfony/validator": "^6.4|^7.0|^8.0", "symfony/yaml": "^6.4|^7.0|^8.0", - "twig/twig": "^3.15", + "twig/twig": "^3.15|^4.0", "web-token/jwt-library": "^3.3.2|^4.0" }, "type": "symfony-bundle", @@ -4891,7 +4957,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.4.14" + "source": "https://github.com/symfony/security-bundle/tree/v7.4.23" }, "funding": [ { @@ -4911,20 +4977,21 @@ "type": "tidelift" } ], - "time": "2026-06-16T15:54:05+00:00" + "time": "2026-11-04T08:27:22+00:00", + "published-time": "2026-11-04T11:28:15+00:00" }, { "name": "symfony/security-core", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "880bb18eff6188d55115e795f06e4185373c35fd" + "reference": "c93b2194c0255496c2c0ac999821fa7f5296c7cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/880bb18eff6188d55115e795f06e4185373c35fd", - "reference": "880bb18eff6188d55115e795f06e4185373c35fd", + "url": "https://api.github.com/repos/symfony/security-core/zipball/c93b2194c0255496c2c0ac999821fa7f5296c7cc", + "reference": "c93b2194c0255496c2c0ac999821fa7f5296c7cc", "shasum": "" }, "require": { @@ -4952,6 +5019,7 @@ "symfony/expression-language": "^6.4|^7.0|^8.0", "symfony/http-foundation": "^6.4|^7.0|^8.0", "symfony/ldap": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", "symfony/string": "^6.4|^7.0|^8.0", "symfony/translation": "^6.4.3|^7.0.3|^8.0", "symfony/validator": "^6.4|^7.0|^8.0" @@ -4982,7 +5050,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v7.4.14" + "source": "https://github.com/symfony/security-core/tree/v7.4.23" }, "funding": [ { @@ -5002,7 +5070,8 @@ "type": "tidelift" } ], - "time": "2026-06-09T07:51:57+00:00" + "time": "2026-11-01T19:17:22+00:00", + "published-time": "2026-11-04T11:28:23+00:00" }, { "name": "symfony/security-csrf", @@ -5076,20 +5145,21 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-24T13:12:05+00:00", + "published-time": "2026-03-31T21:10:11+00:00" }, { "name": "symfony/security-http", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "148e038b91c8cc3e42aee177f8b0117437077c9b" + "reference": "ea0623a02764025268bd928810f012767ea1965a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/148e038b91c8cc3e42aee177f8b0117437077c9b", - "reference": "148e038b91c8cc3e42aee177f8b0117437077c9b", + "url": "https://api.github.com/repos/symfony/security-http/zipball/ea0623a02764025268bd928810f012767ea1965a", + "reference": "ea0623a02764025268bd928810f012767ea1965a", "shasum": "" }, "require": { @@ -5113,6 +5183,7 @@ "psr/log": "^1|^2|^3", "symfony/cache": "^6.4|^7.0|^8.0", "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", "symfony/expression-language": "^6.4|^7.0|^8.0", "symfony/http-client": "^6.4|^7.0|^8.0", "symfony/http-client-contracts": "^3.0", @@ -5148,7 +5219,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v7.4.14" + "source": "https://github.com/symfony/security-http/tree/v7.4.23" }, "funding": [ { @@ -5168,20 +5239,21 @@ "type": "tidelift" } ], - "time": "2026-06-19T08:40:54+00:00" + "time": "2026-11-04T08:27:22+00:00", + "published-time": "2026-11-04T11:28:39+00:00" }, { "name": "symfony/serializer", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "55acb01b9c8a5211dfbaf68c314d90d0ed2cc3d1" + "reference": "9df8eb88c4d067d7aef1f3940075521769f34086" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/55acb01b9c8a5211dfbaf68c314d90d0ed2cc3d1", - "reference": "55acb01b9c8a5211dfbaf68c314d90d0ed2cc3d1", + "url": "https://api.github.com/repos/symfony/serializer/zipball/9df8eb88c4d067d7aef1f3940075521769f34086", + "reference": "9df8eb88c4d067d7aef1f3940075521769f34086", "shasum": "" }, "require": { @@ -5195,7 +5267,7 @@ "phpdocumentor/type-resolver": "<1.5.1", "symfony/dependency-injection": "<6.4", "symfony/property-access": "<6.4.31|>=7.0,<7.4.2|>=8.0,<8.0.2", - "symfony/property-info": "<6.4", + "symfony/property-info": "<6.4.43", "symfony/type-info": "<7.2.5", "symfony/uid": "<6.4", "symfony/validator": "<6.4", @@ -5217,7 +5289,7 @@ "symfony/messenger": "^6.4|^7.0|^8.0", "symfony/mime": "^6.4|^7.0|^8.0", "symfony/property-access": "^6.4.31|^7.4.2|^8.0.2", - "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4.43|^7.4.15|^8.0.15", "symfony/translation-contracts": "^2.5|^3", "symfony/type-info": "^7.2.5|^8.0", "symfony/uid": "^6.4|^7.0|^8.0", @@ -5252,7 +5324,7 @@ "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.4.14" + "source": "https://github.com/symfony/serializer/tree/v7.4.23" }, "funding": [ { @@ -5272,20 +5344,21 @@ "type": "tidelift" } ], - "time": "2026-06-27T08:31:18+00:00" + "time": "2026-11-04T08:27:22+00:00", + "published-time": "2026-11-04T11:28:28+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.7.1", + "version": "v3.8.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0" + "reference": "052852a96fd5e5ebdb617dba22031e41a3300fb5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/c0a284bab1ed8aa0417e3d69250ab437739563a0", - "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/052852a96fd5e5ebdb617dba22031e41a3300fb5", + "reference": "052852a96fd5e5ebdb617dba22031e41a3300fb5", "shasum": "" }, "require": { @@ -5303,7 +5376,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.7-dev" + "dev-main": "3.8-dev" } }, "autoload": { @@ -5339,7 +5412,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.7.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.8.1" }, "funding": [ { @@ -5359,20 +5432,21 @@ "type": "tidelift" } ], - "time": "2026-06-16T09:55:08+00:00" + "time": "2026-10-20T17:38:25+00:00", + "published-time": "2026-11-04T11:25:33+00:00" }, { "name": "symfony/string", - "version": "v7.4.13", + "version": "v7.4.22", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "961683010db3b27ec6ebcd7308e6e1ee8fa7ffde" + "reference": "8dff7da3a56638f1d189c5368183294102de4ced" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/961683010db3b27ec6ebcd7308e6e1ee8fa7ffde", - "reference": "961683010db3b27ec6ebcd7308e6e1ee8fa7ffde", + "url": "https://api.github.com/repos/symfony/string/zipball/8dff7da3a56638f1d189c5368183294102de4ced", + "reference": "8dff7da3a56638f1d189c5368183294102de4ced", "shasum": "" }, "require": { @@ -5430,7 +5504,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.4.13" + "source": "https://github.com/symfony/string/tree/v7.4.22" }, "funding": [ { @@ -5450,20 +5524,21 @@ "type": "tidelift" } ], - "time": "2026-05-23T15:23:29+00:00" + "time": "2026-10-23T16:51:52+00:00", + "published-time": "2026-10-28T18:21:18+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.7.1", + "version": "v3.8.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621" + "reference": "0a3ae917402632fcba2aeddae9c98332f3d7dd05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/ccb206b98faccc511ebae8e5fad50f2dc0b30621", - "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/0a3ae917402632fcba2aeddae9c98332f3d7dd05", + "reference": "0a3ae917402632fcba2aeddae9c98332f3d7dd05", "shasum": "" }, "require": { @@ -5476,7 +5551,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.7-dev" + "dev-main": "3.8-dev" } }, "autoload": { @@ -5512,7 +5587,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.7.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.8.1" }, "funding": [ { @@ -5532,27 +5607,28 @@ "type": "tidelift" } ], - "time": "2026-06-05T06:23:12+00:00" + "time": "2026-10-03T08:17:19+00:00", + "published-time": "2026-11-04T11:25:31+00:00" }, { "name": "symfony/twig-bridge", - "version": "v7.4.14", + "version": "v7.4.22", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "e4574ab4d5411a7c495d4189b15a8ecfbc720332" + "reference": "c959c7d2396e72e64c899fc9d0abba50733ea042" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/e4574ab4d5411a7c495d4189b15a8ecfbc720332", - "reference": "e4574ab4d5411a7c495d4189b15a8ecfbc720332", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/c959c7d2396e72e64c899fc9d0abba50733ea042", + "reference": "c959c7d2396e72e64c899fc9d0abba50733ea042", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/translation-contracts": "^2.5|^3", - "twig/twig": "^3.21" + "twig/twig": "^3.21|^4.0" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2|>=7", @@ -5590,7 +5666,7 @@ "symfony/security-core": "^6.4|^7.0|^8.0", "symfony/security-csrf": "^6.4|^7.0|^8.0", "symfony/security-http": "^6.4|^7.0|^8.0", - "symfony/serializer": "^6.4.3|^7.0.3|^8.0", + "symfony/serializer": "^6.4.44|^7.4.17|^8.1.5", "symfony/stopwatch": "^6.4|^7.0|^8.0", "symfony/translation": "^6.4|^7.0|^8.0", "symfony/validator": "^6.4|^7.0|^8.0", @@ -5627,7 +5703,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.4.14" + "source": "https://github.com/symfony/twig-bridge/tree/v7.4.22" }, "funding": [ { @@ -5647,20 +5723,21 @@ "type": "tidelift" } ], - "time": "2026-06-17T13:16:29+00:00" + "time": "2026-10-15T16:00:28+00:00", + "published-time": "2026-10-28T18:20:41+00:00" }, { "name": "symfony/twig-bundle", - "version": "v7.4.14", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "11b69c64efdd0c3465403bb2747bf4585add1ec7" + "reference": "991586116d99e549621c70eeafe496dfcceeb1ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/11b69c64efdd0c3465403bb2747bf4585add1ec7", - "reference": "11b69c64efdd0c3465403bb2747bf4585add1ec7", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/991586116d99e549621c70eeafe496dfcceeb1ce", + "reference": "991586116d99e549621c70eeafe496dfcceeb1ce", "shasum": "" }, "require": { @@ -5672,7 +5749,7 @@ "symfony/http-foundation": "^6.4|^7.0|^8.0", "symfony/http-kernel": "^6.4.13|^7.1.6|^8.0", "symfony/twig-bridge": "^7.3|^8.0", - "twig/twig": "^3.12" + "twig/twig": "^3.12|^4.0" }, "conflict": { "symfony/framework-bundle": "<6.4", @@ -5717,7 +5794,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.4.14" + "source": "https://github.com/symfony/twig-bundle/tree/v7.4.21" }, "funding": [ { @@ -5737,20 +5814,21 @@ "type": "tidelift" } ], - "time": "2026-06-05T06:22:21+00:00" + "time": "2026-10-09T16:12:31+00:00", + "published-time": "2026-10-14T06:45:14+00:00" }, { "name": "symfony/type-info", - "version": "v7.4.9", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "cafeedbf157b890e94ac5b83eaed85595106d5d6" + "reference": "eca5fdb294539268ad3245b2214f32f24b337e09" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/cafeedbf157b890e94ac5b83eaed85595106d5d6", - "reference": "cafeedbf157b890e94ac5b83eaed85595106d5d6", + "url": "https://api.github.com/repos/symfony/type-info/zipball/eca5fdb294539268ad3245b2214f32f24b337e09", + "reference": "eca5fdb294539268ad3245b2214f32f24b337e09", "shasum": "" }, "require": { @@ -5800,7 +5878,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.4.9" + "source": "https://github.com/symfony/type-info/tree/v7.4.23" }, "funding": [ { @@ -5820,20 +5898,21 @@ "type": "tidelift" } ], - "time": "2026-04-22T15:21:55+00:00" + "time": "2026-11-02T09:31:16+00:00", + "published-time": "2026-11-04T11:27:49+00:00" }, { "name": "symfony/validator", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "306d904336166d001751759351d40d5e82312596" + "reference": "0208748881024578b32edb7fad3d2cb01a88c364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/306d904336166d001751759351d40d5e82312596", - "reference": "306d904336166d001751759351d40d5e82312596", + "url": "https://api.github.com/repos/symfony/validator/zipball/0208748881024578b32edb7fad3d2cb01a88c364", + "reference": "0208748881024578b32edb7fad3d2cb01a88c364", "shasum": "" }, "require": { @@ -5904,7 +5983,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v7.4.14" + "source": "https://github.com/symfony/validator/tree/v7.4.23" }, "funding": [ { @@ -5924,20 +6003,21 @@ "type": "tidelift" } ], - "time": "2026-06-27T06:16:12+00:00" + "time": "2026-11-04T08:27:22+00:00", + "published-time": "2026-11-04T11:28:46+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.4.14", + "version": "v7.4.22", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "9a3a56a4a1e65a5cb4f8d13801fe8ab0a170e358" + "reference": "6e6ff33ea8cf5df27f00a5561ebd5ee9bd7f1618" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9a3a56a4a1e65a5cb4f8d13801fe8ab0a170e358", - "reference": "9a3a56a4a1e65a5cb4f8d13801fe8ab0a170e358", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6e6ff33ea8cf5df27f00a5561ebd5ee9bd7f1618", + "reference": "6e6ff33ea8cf5df27f00a5561ebd5ee9bd7f1618", "shasum": "" }, "require": { @@ -5953,7 +6033,7 @@ "symfony/http-kernel": "^6.4|^7.0|^8.0", "symfony/process": "^6.4|^7.0|^8.0", "symfony/uid": "^6.4|^7.0|^8.0", - "twig/twig": "^3.12" + "twig/twig": "^3.12|^4.0" }, "bin": [ "Resources/bin/var-dump-server" @@ -5991,7 +6071,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.4.14" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.22" }, "funding": [ { @@ -6011,20 +6091,21 @@ "type": "tidelift" } ], - "time": "2026-06-08T20:24:16+00:00" + "time": "2026-10-25T21:04:04+00:00", + "published-time": "2026-10-28T18:20:00+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.4.14", + "version": "v7.4.22", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "0118811b1d59f323bf131250b3fb919febfece28" + "reference": "6c967db30708068f6eaedb6ed37973bd86de2241" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0118811b1d59f323bf131250b3fb919febfece28", - "reference": "0118811b1d59f323bf131250b3fb919febfece28", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/6c967db30708068f6eaedb6ed37973bd86de2241", + "reference": "6c967db30708068f6eaedb6ed37973bd86de2241", "shasum": "" }, "require": { @@ -6072,7 +6153,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.4.14" + "source": "https://github.com/symfony/var-exporter/tree/v7.4.22" }, "funding": [ { @@ -6092,7 +6173,8 @@ "type": "tidelift" } ], - "time": "2026-06-27T08:41:53+00:00" + "time": "2026-10-22T14:50:44+00:00", + "published-time": "2026-10-28T18:20:27+00:00" }, { "name": "symfony/web-link", @@ -6179,20 +6261,21 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-24T13:12:05+00:00", + "published-time": "2026-03-31T21:10:59+00:00" }, { "name": "symfony/yaml", - "version": "v7.4.22", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "1ed6afa13d48c579c51cbf32e38f50686313497b" + "reference": "1e601207ffe627a2e621faa9d661f1d32dcf1cec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/1ed6afa13d48c579c51cbf32e38f50686313497b", - "reference": "1ed6afa13d48c579c51cbf32e38f50686313497b", + "url": "https://api.github.com/repos/symfony/yaml/zipball/1e601207ffe627a2e621faa9d661f1d32dcf1cec", + "reference": "1e601207ffe627a2e621faa9d661f1d32dcf1cec", "shasum": "" }, "require": { @@ -6235,7 +6318,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.4.22" + "source": "https://github.com/symfony/yaml/tree/v7.4.23" }, "funding": [ { @@ -6255,20 +6338,21 @@ "type": "tidelift" } ], - "time": "2026-10-18T14:39:27+00:00" + "time": "2026-11-04T08:27:22+00:00", + "published-time": "2026-11-04T11:28:41+00:00" }, { "name": "twig/twig", - "version": "v3.28.0", + "version": "v3.30.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "597c12ed286fb9d1701a36684ce6e0cbe28ebc8b" + "reference": "8c737079b726af72ff8ef3c595be9f6a810ea1ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/597c12ed286fb9d1701a36684ce6e0cbe28ebc8b", - "reference": "597c12ed286fb9d1701a36684ce6e0cbe28ebc8b", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/8c737079b726af72ff8ef3c595be9f6a810ea1ef", + "reference": "8c737079b726af72ff8ef3c595be9f6a810ea1ef", "shasum": "" }, "require": { @@ -6323,7 +6407,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.28.0" + "source": "https://github.com/twigphp/Twig/tree/v3.30.0" }, "funding": [ { @@ -6335,20 +6419,21 @@ "type": "tidelift" } ], - "time": "2026-07-03T20:44:34+00:00" + "time": "2026-09-25T13:20:01+00:00", + "published-time": "2026-09-25T13:20:14+00:00" }, { "name": "webmozart/assert", - "version": "2.4.1", + "version": "2.5.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70" + "reference": "8a163706bbcac613733dba03f51e13b5eb1bb819" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/2ccb7c2e821038c03a3e6e1700c570c158c55f70", - "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/8a163706bbcac613733dba03f51e13b5eb1bb819", + "reference": "8a163706bbcac613733dba03f51e13b5eb1bb819", "shasum": "" }, "require": { @@ -6399,9 +6484,10 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.4.1" + "source": "https://github.com/webmozarts/assert/tree/2.5.0" }, - "time": "2026-06-15T15:31:57+00:00" + "time": "2026-10-05T23:14:19+00:00", + "published-time": "2026-10-05T23:14:25+00:00" }, { "name": "willdurand/negotiation", @@ -6457,7 +6543,8 @@ "issues": "https://github.com/willdurand/Negotiation/issues", "source": "https://github.com/willdurand/Negotiation/tree/3.1.0" }, - "time": "2022-01-30T20:08:53+00:00" + "time": "2022-01-30T20:08:53+00:00", + "published-time": "2022-01-30T20:14:18+00:00" } ], "packages-dev": [ @@ -6523,7 +6610,8 @@ "type": "github" } ], - "time": "2022-12-23T10:58:28+00:00" + "time": "2022-12-23T10:58:28+00:00", + "published-time": "2022-12-23T10:59:43+00:00" }, { "name": "composer/pcre", @@ -6599,7 +6687,8 @@ "type": "github" } ], - "time": "2026-06-07T11:47:49+00:00" + "time": "2026-06-07T11:47:49+00:00", + "published-time": "2026-06-11T12:12:37+00:00" }, { "name": "composer/xdebug-handler", @@ -6665,46 +6754,47 @@ "type": "tidelift" } ], - "time": "2024-05-06T16:37:16+00:00" + "time": "2024-05-06T16:37:16+00:00", + "published-time": "2024-05-06T17:01:42+00:00" }, { "name": "ergebnis/agent-detector", - "version": "1.2.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/ergebnis/agent-detector.git", - "reference": "e211f17928c8b95a51e06040792d57f5462fb271" + "reference": "bcc63004284c61c6df6e9625acf2673e3be1889b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/agent-detector/zipball/e211f17928c8b95a51e06040792d57f5462fb271", - "reference": "e211f17928c8b95a51e06040792d57f5462fb271", + "url": "https://api.github.com/repos/ergebnis/agent-detector/zipball/bcc63004284c61c6df6e9625acf2673e3be1889b", + "reference": "bcc63004284c61c6df6e9625acf2673e3be1889b", "shasum": "" }, "require": { "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.51.0", - "ergebnis/license": "^2.7.0", + "ergebnis/composer-normalize": "^2.54.0", + "ergebnis/license": "^2.8.0", "ergebnis/php-cs-fixer-config": "^6.60.2", - "ergebnis/phpstan-rules": "^2.13.1", - "ergebnis/phpunit-slow-test-detector": "^2.24.0", - "ergebnis/rector-rules": "^1.18.1", + "ergebnis/phpstan-rules": "^2.14.2", + "ergebnis/phpunit-slow-test-detector": "^2.27.0", + "ergebnis/rector-rules": "^1.18.5", "fakerphp/faker": "^1.24.1", "infection/infection": "^0.26.6", "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^2.1.54", - "phpstan/phpstan-deprecation-rules": "^2.0.4", - "phpstan/phpstan-phpunit": "^2.0.16", - "phpstan/phpstan-strict-rules": "^2.0.10", + "phpstan/phpstan": "^2.2.14", + "phpstan/phpstan-deprecation-rules": "^2.0.5", + "phpstan/phpstan-phpunit": "^2.1.1", + "phpstan/phpstan-strict-rules": "^2.1.0", "phpunit/phpunit": "^9.6.34", - "rector/rector": "^2.4.2" + "rector/rector": "^2.7.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.2-dev" + "dev-main": "2.0-dev" }, "composer-normalize": { "indent-size": 2, @@ -6734,54 +6824,56 @@ "security": "https://github.com/ergebnis/agent-detector/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/agent-detector" }, - "time": "2026-05-07T08:19:07+00:00" + "time": "2026-10-29T17:44:55+00:00", + "published-time": "2026-10-29T17:49:41+00:00" }, { "name": "ergebnis/composer-normalize", - "version": "2.52.0", + "version": "2.56.0", "source": { "type": "git", "url": "https://github.com/ergebnis/composer-normalize.git", - "reference": "988f83f5e51a42cdd2337e5fcd935432f8dfa33c" + "reference": "36df55b10d751ebdece4f22b7b74f5f6f72b3248" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/988f83f5e51a42cdd2337e5fcd935432f8dfa33c", - "reference": "988f83f5e51a42cdd2337e5fcd935432f8dfa33c", + "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/36df55b10d751ebdece4f22b7b74f5f6f72b3248", + "reference": "36df55b10d751ebdece4f22b7b74f5f6f72b3248", "shasum": "" }, "require": { "composer-plugin-api": "^2.0.0", + "composer-runtime-api": "^2.0.0", "ergebnis/json": "^1.4.0", - "ergebnis/json-normalizer": "^4.9.0", + "ergebnis/json-normalizer": "^4.12.0", "ergebnis/json-printer": "^3.7.0", "ext-json": "*", "justinrainbow/json-schema": "^5.2.12 || ^6.0.0", "localheinz/diff": "^1.3.0", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0" }, "require-dev": { - "composer/composer": "^2.9.8", - "ergebnis/license": "^2.7.0", - "ergebnis/php-cs-fixer-config": "^6.62.1", - "ergebnis/phpstan-rules": "^2.13.1", - "ergebnis/phpunit-slow-test-detector": "^2.24.0", - "ergebnis/rector-rules": "^1.18.1", + "composer/composer": "^2.11.0", + "ergebnis/license": "^2.8.0", + "ergebnis/php-cs-fixer-config": "^6.64.1", + "ergebnis/phpstan-rules": "^2.14.2", + "ergebnis/phpunit-slow-test-detector": "^2.27.0", + "ergebnis/rector-rules": "^1.18.5", "fakerphp/faker": "^1.24.1", "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^2.1.54", - "phpstan/phpstan-deprecation-rules": "^2.0.4", - "phpstan/phpstan-phpunit": "^2.0.16", - "phpstan/phpstan-strict-rules": "^2.0.11", + "phpstan/phpstan": "^2.1.55", + "phpstan/phpstan-deprecation-rules": "^2.0.5", + "phpstan/phpstan-phpunit": "^2.1.1", + "phpstan/phpstan-strict-rules": "^2.1.0", "phpunit/phpunit": "^9.6.33", - "rector/rector": "^2.4.3", + "rector/rector": "^2.7.0", "symfony/filesystem": "^5.4.41" }, "type": "composer-plugin", "extra": { "class": "Ergebnis\\Composer\\Normalize\\NormalizePlugin", "branch-alias": { - "dev-main": "2.52-dev" + "dev-main": "2.56-dev" }, "plugin-optional": true, "composer-normalize": { @@ -6818,42 +6910,43 @@ "security": "https://github.com/ergebnis/composer-normalize/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/composer-normalize" }, - "time": "2026-05-15T15:39:24+00:00" + "time": "2026-10-29T15:47:39+00:00", + "published-time": "2026-10-29T15:47:48+00:00" }, { "name": "ergebnis/json", - "version": "1.6.0", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json.git", - "reference": "7b56d2b5d9e897e75b43e2e753075a0904c921b1" + "reference": "829ce8b25c5e452249492c824f1d227777709403" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json/zipball/7b56d2b5d9e897e75b43e2e753075a0904c921b1", - "reference": "7b56d2b5d9e897e75b43e2e753075a0904c921b1", + "url": "https://api.github.com/repos/ergebnis/json/zipball/829ce8b25c5e452249492c824f1d227777709403", + "reference": "829ce8b25c5e452249492c824f1d227777709403", "shasum": "" }, "require": { "ext-json": "*", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.44.0", - "ergebnis/data-provider": "^3.3.0", - "ergebnis/license": "^2.5.0", - "ergebnis/php-cs-fixer-config": "^6.37.0", - "ergebnis/phpstan-rules": "^2.11.0", - "ergebnis/phpunit-slow-test-detector": "^2.16.1", - "fakerphp/faker": "^1.24.0", + "ergebnis/data-provider": "^3.6.0", + "ergebnis/license": "^2.7.0", + "ergebnis/php-cs-fixer-config": "^6.63.3", + "ergebnis/phpstan-rules": "^2.13.1", + "ergebnis/phpunit-slow-test-detector": "^2.25.0", + "ergebnis/rector-rules": "^1.18.4", + "fakerphp/faker": "^1.24.1", "infection/infection": "~0.26.6", "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^2.1.22", - "phpstan/phpstan-deprecation-rules": "^2.0.3", - "phpstan/phpstan-phpunit": "^2.0.7", - "phpstan/phpstan-strict-rules": "^2.0.6", + "phpstan/phpstan": "^2.2.14", + "phpstan/phpstan-deprecation-rules": "^2.0.5", + "phpstan/phpstan-phpunit": "^2.0.18", + "phpstan/phpstan-strict-rules": "^2.0.12", "phpunit/phpunit": "^9.6.24", - "rector/rector": "^2.1.4" + "rector/rector": "^2.6.7" }, "type": "library", "extra": { @@ -6891,20 +6984,21 @@ "security": "https://github.com/ergebnis/json/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json" }, - "time": "2025-09-06T09:08:45+00:00" + "time": "2026-09-24T19:42:16+00:00", + "published-time": "2026-09-24T19:42:28+00:00" }, { "name": "ergebnis/json-normalizer", - "version": "4.10.1", + "version": "4.12.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json-normalizer.git", - "reference": "77961faf2c651c3f05977b53c6c68e8434febf62" + "reference": "b1a23409760cbac5b4deef9284c4e5e4a9c9165b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/77961faf2c651c3f05977b53c6c68e8434febf62", - "reference": "77961faf2c651c3f05977b53c6c68e8434febf62", + "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/b1a23409760cbac5b4deef9284c4e5e4a9c9165b", + "reference": "b1a23409760cbac5b4deef9284c4e5e4a9c9165b", "shasum": "" }, "require": { @@ -6914,24 +7008,24 @@ "ergebnis/json-schema-validator": "^4.2.0", "ext-json": "*", "justinrainbow/json-schema": "^5.2.12 || ^6.0.0", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0" }, "require-dev": { - "composer/semver": "^3.4.3", - "ergebnis/composer-normalize": "^2.44.0", - "ergebnis/data-provider": "^3.3.0", - "ergebnis/license": "^2.5.0", - "ergebnis/php-cs-fixer-config": "^6.37.0", - "ergebnis/phpunit-slow-test-detector": "^2.16.1", - "fakerphp/faker": "^1.24.0", + "composer/semver": "^3.4.4", + "ergebnis/data-provider": "^3.7.1", + "ergebnis/license": "^2.8.0", + "ergebnis/php-cs-fixer-config": "^6.64.1", + "ergebnis/phpunit-slow-test-detector": "^2.27.0", + "ergebnis/rector-rules": "^1.18.5", + "fakerphp/faker": "^1.24.1", "infection/infection": "~0.26.6", "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^1.12.10", - "phpstan/phpstan-deprecation-rules": "^1.2.1", - "phpstan/phpstan-phpunit": "^1.4.0", - "phpstan/phpstan-strict-rules": "^1.6.1", + "phpstan/phpstan": "^2.2.15", + "phpstan/phpstan-deprecation-rules": "^2.0.5", + "phpstan/phpstan-phpunit": "^2.1.1", + "phpstan/phpstan-strict-rules": "^2.1.0", "phpunit/phpunit": "^9.6.19", - "rector/rector": "^1.2.10" + "rector/rector": "^2.7.0" }, "suggest": { "composer/semver": "If you want to use ComposerJsonNormalizer or VersionConstraintNormalizer" @@ -6939,7 +7033,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "4.11-dev" + "dev-main": "4.12-dev" }, "composer-normalize": { "indent-size": 2, @@ -6973,47 +7067,47 @@ "security": "https://github.com/ergebnis/json-normalizer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-normalizer" }, - "time": "2025-09-06T09:18:13+00:00" + "time": "2026-10-29T15:38:49+00:00", + "published-time": "2026-10-29T15:38:58+00:00" }, { "name": "ergebnis/json-pointer", - "version": "3.8.0", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json-pointer.git", - "reference": "b58c3c468a7ff109fdf9a255f17de29ecbe5276c" + "reference": "414a90039cdf458eeb71297315a2be6de195697a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/b58c3c468a7ff109fdf9a255f17de29ecbe5276c", - "reference": "b58c3c468a7ff109fdf9a255f17de29ecbe5276c", + "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/414a90039cdf458eeb71297315a2be6de195697a", + "reference": "414a90039cdf458eeb71297315a2be6de195697a", "shasum": "" }, "require": { - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.50.0", "ergebnis/data-provider": "^3.6.0", "ergebnis/license": "^2.7.0", - "ergebnis/php-cs-fixer-config": "^6.60.2", + "ergebnis/php-cs-fixer-config": "^6.63.3", "ergebnis/phpstan-rules": "^2.13.1", - "ergebnis/phpunit-slow-test-detector": "^2.24.0", - "ergebnis/rector-rules": "^1.16.0", + "ergebnis/phpunit-slow-test-detector": "^2.25.0", + "ergebnis/rector-rules": "^1.18.3", "fakerphp/faker": "^1.24.1", "infection/infection": "~0.26.6", "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^2.1.46", - "phpstan/phpstan-deprecation-rules": "^2.0.4", - "phpstan/phpstan-phpunit": "^2.0.16", - "phpstan/phpstan-strict-rules": "^2.0.10", + "phpstan/phpstan": "^2.2.14", + "phpstan/phpstan-deprecation-rules": "^2.0.5", + "phpstan/phpstan-phpunit": "^2.0.18", + "phpstan/phpstan-strict-rules": "^2.0.12", "phpunit/phpunit": "^9.6.34", - "rector/rector": "^2.4.0" + "rector/rector": "^2.6.7" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.8-dev" + "dev-main": "3.9-dev" }, "composer-normalize": { "indent-size": 2, @@ -7048,42 +7142,43 @@ "security": "https://github.com/ergebnis/json-pointer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-pointer" }, - "time": "2026-04-07T14:52:13+00:00" + "time": "2026-09-24T19:42:34+00:00", + "published-time": "2026-09-24T19:42:46+00:00" }, { "name": "ergebnis/json-printer", - "version": "3.8.1", + "version": "3.9.1", "source": { "type": "git", "url": "https://github.com/ergebnis/json-printer.git", - "reference": "211d73fc7ec6daf98568ee6ed6e6d133dee8503e" + "reference": "a9bbf3816ca39382d6fb4b4ad58018e5ea4f3cb4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/211d73fc7ec6daf98568ee6ed6e6d133dee8503e", - "reference": "211d73fc7ec6daf98568ee6ed6e6d133dee8503e", + "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/a9bbf3816ca39382d6fb4b4ad58018e5ea4f3cb4", + "reference": "a9bbf3816ca39382d6fb4b4ad58018e5ea4f3cb4", "shasum": "" }, "require": { "ext-json": "*", - "ext-mbstring": "*", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.44.0", - "ergebnis/data-provider": "^3.3.0", - "ergebnis/license": "^2.5.0", - "ergebnis/php-cs-fixer-config": "^6.37.0", - "ergebnis/phpunit-slow-test-detector": "^2.16.1", + "ergebnis/data-provider": "^3.7.0", + "ergebnis/license": "^2.8.0", + "ergebnis/php-cs-fixer-config": "^6.64.1", + "ergebnis/phpunit-slow-test-detector": "^2.26.0", + "ergebnis/rector-rules": "^1.18.5", "fakerphp/faker": "^1.24.0", "infection/infection": "~0.26.6", + "phpbench/phpbench": "^1.2.14", "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^1.12.10", - "phpstan/phpstan-deprecation-rules": "^1.2.1", - "phpstan/phpstan-phpunit": "^1.4.1", - "phpstan/phpstan-strict-rules": "^1.6.1", + "phpstan/phpstan": "^2.2.16", + "phpstan/phpstan-deprecation-rules": "^2.0.5", + "phpstan/phpstan-phpunit": "^2.1.1", + "phpstan/phpstan-strict-rules": "^2.1.0", "phpunit/phpunit": "^9.6.21", - "rector/rector": "^1.2.10" + "rector/rector": "^2.7.0" }, "type": "library", "extra": { @@ -7123,20 +7218,21 @@ "security": "https://github.com/ergebnis/json-printer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-printer" }, - "time": "2025-09-06T09:59:26+00:00" + "time": "2026-10-21T19:02:11+00:00", + "published-time": "2026-10-21T19:02:23+00:00" }, { "name": "ergebnis/json-schema-validator", - "version": "4.5.1", + "version": "4.6.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json-schema-validator.git", - "reference": "b739527a480a9e3651360ad351ea77e7e9019df2" + "reference": "228bf86d963c06c863a3143c9d8531bb3ef72fbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/b739527a480a9e3651360ad351ea77e7e9019df2", - "reference": "b739527a480a9e3651360ad351ea77e7e9019df2", + "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/228bf86d963c06c863a3143c9d8531bb3ef72fbe", + "reference": "228bf86d963c06c863a3143c9d8531bb3ef72fbe", "shasum": "" }, "require": { @@ -7144,23 +7240,23 @@ "ergebnis/json-pointer": "^3.4.0", "ext-json": "*", "justinrainbow/json-schema": "^5.2.12 || ^6.0.0", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.44.0", - "ergebnis/data-provider": "^3.3.0", - "ergebnis/license": "^2.5.0", - "ergebnis/php-cs-fixer-config": "^6.37.0", - "ergebnis/phpunit-slow-test-detector": "^2.16.1", + "ergebnis/data-provider": "^3.6.0", + "ergebnis/license": "^2.7.0", + "ergebnis/php-cs-fixer-config": "^6.63.3", + "ergebnis/phpunit-slow-test-detector": "^2.25.0", + "ergebnis/rector-rules": "^1.18.4", "fakerphp/faker": "^1.24.0", "infection/infection": "~0.26.6", "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^1.12.10", - "phpstan/phpstan-deprecation-rules": "^1.2.1", - "phpstan/phpstan-phpunit": "^1.4.0", - "phpstan/phpstan-strict-rules": "^1.6.1", + "phpstan/phpstan": "^2.2.15", + "phpstan/phpstan-deprecation-rules": "^2.0.5", + "phpstan/phpstan-phpunit": "^2.0.18", + "phpstan/phpstan-strict-rules": "^2.0.12", "phpunit/phpunit": "^9.6.20", - "rector/rector": "^1.2.10" + "rector/rector": "^2.6.7" }, "type": "library", "extra": { @@ -7200,7 +7296,8 @@ "security": "https://github.com/ergebnis/json-schema-validator/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-schema-validator" }, - "time": "2025-09-06T11:37:35+00:00" + "time": "2026-09-24T19:42:52+00:00", + "published-time": "2026-09-24T19:43:04+00:00" }, { "name": "evenement/evenement", @@ -7247,27 +7344,28 @@ "issues": "https://github.com/igorw/evenement/issues", "source": "https://github.com/igorw/evenement/tree/v3.0.2" }, - "time": "2023-08-08T05:53:35+00:00" + "time": "2023-08-08T05:53:35+00:00", + "published-time": "2023-08-08T08:34:49+00:00" }, { "name": "fidry/cpu-core-counter", - "version": "1.3.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "db9508f7b1474469d9d3c53b86f817e344732678" + "reference": "d384a7d0d6e67aa497327260ca95023e92dc2032" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", - "reference": "db9508f7b1474469d9d3c53b86f817e344732678", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/d384a7d0d6e67aa497327260ca95023e92dc2032", + "reference": "d384a7d0d6e67aa497327260ca95023e92dc2032", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "fidry/makefile": "^0.2.0", + "fidry/makefile": "^0.2.0 || ^1.1.2", "fidry/php-cs-fixer-config": "^1.1.2", "phpstan/extension-installer": "^1.2.0", "phpstan/phpstan": "^2.0", @@ -7275,6 +7373,7 @@ "phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "symfony/polyfill-mbstring": "^1.33", "webmozarts/strict-phpunit": "^7.5" }, "type": "library", @@ -7300,7 +7399,7 @@ ], "support": { "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.4.1" }, "funding": [ { @@ -7308,27 +7407,28 @@ "type": "github" } ], - "time": "2025-08-14T07:29:31+00:00" + "time": "2026-09-29T22:11:39+00:00", + "published-time": "2026-09-29T22:12:43+00:00" }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.95.12", + "version": "v3.95.28", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "b1b9055997a98dce3c2338e884626e718a25a923" + "reference": "de66c41256ad603e63cf033bd153fa4a14ebaca4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/b1b9055997a98dce3c2338e884626e718a25a923", - "reference": "b1b9055997a98dce3c2338e884626e718a25a923", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/de66c41256ad603e63cf033bd153fa4a14ebaca4", + "reference": "de66c41256ad603e63cf033bd153fa4a14ebaca4", "shasum": "" }, "require": { "clue/ndjson-react": "^1.3", "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.5", - "ergebnis/agent-detector": "^1.2", + "ergebnis/agent-detector": "^2.0.0", "ext-filter": "*", "ext-hash": "*", "ext-json": "*", @@ -7340,31 +7440,30 @@ "react/socket": "^1.16", "react/stream": "^1.4", "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0 || ^8.0 || ^9.0", - "symfony/console": "^5.4.47 || ^6.4.24 || ^7.0 || ^8.0", - "symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", - "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", - "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", - "symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", - "symfony/polyfill-mbstring": "^1.37", - "symfony/polyfill-php80": "^1.37", - "symfony/polyfill-php81": "^1.37", - "symfony/polyfill-php84": "^1.37", - "symfony/process": "^5.4.47 || ^6.4.24 || ^7.2 || ^8.0", - "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0" + "symfony/console": "^5.4.55 || ^6.4.50 || ^7.4.23 || ^8.1.11", + "symfony/event-dispatcher": "^5.4.45 || ^6.4.44 || ^7.4.17 || ^8.1.5", + "symfony/filesystem": "^5.4.56 || ^6.4.50 || ^7.4.23 || ^8.1.11", + "symfony/finder": "^5.4.45 || ^6.4.50 || ^7.4.23 || ^8.1.11", + "symfony/options-resolver": "^5.4.45 || ^6.4.49 || ^7.4.22 || ^8.1.10", + "symfony/polyfill-mbstring": "^1.43.3", + "symfony/polyfill-php80": "^1.43", + "symfony/polyfill-php81": "^1.38.1", + "symfony/polyfill-php84": "^1.43", + "symfony/process": "^5.4.54 || ^6.4.49 || ^7.4.22 || ^8.1.10", + "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.4.8 || ^8.1" }, "require-dev": { "facile-it/paraunit": "^1.3.1 || ^2.11.0", "infection/infection": "^0.32.7", - "justinrainbow/json-schema": "^6.10.0", + "justinrainbow/json-schema": "^6.12.0", "keradus/cli-executor": "^2.3", - "mikey179/vfsstream": "^1.6.12", "php-coveralls/php-coveralls": "^2.9.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.8", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.8", - "phpunit/phpunit": "^9.6.35 || ^10.5.64 || ^11.5.56", - "symfony/polyfill-php85": "^1.38", - "symfony/var-dumper": "^5.4.48 || ^6.4.36 || ^7.4.8 || ^8.1.0", - "symfony/yaml": "^5.4.53 || ^6.4.41 || ^7.4.13 || ^8.1.0" + "phpunit/phpunit": "^9.6.36 || ^10.5.64 || ^11.5.56 || ^12.5.35 || ^13.3.3", + "symfony/polyfill-php85": "^1.43", + "symfony/var-dumper": "^5.4.54 || ^6.4.49 || ^7.4.22 || ^8.1.10", + "symfony/yaml": "^5.4.56 || ^6.4.50 || ^7.4.23 || ^8.1.11" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -7405,7 +7504,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.12" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.28" }, "funding": [ { @@ -7413,23 +7512,25 @@ "type": "github" } ], - "time": "2026-07-07T13:29:36+00:00" + "time": "2026-11-04T13:04:49+00:00", + "published-time": "2026-11-04T13:04:58+00:00" }, { "name": "justinrainbow/json-schema", - "version": "6.10.0", + "version": "6.14.0", "source": { "type": "git", "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "8b1308a9d7bdbdb20ce87ef920f82b4564bb2d33" + "reference": "bae415e135dd68260c2d020ba392850231e9b1ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/8b1308a9d7bdbdb20ce87ef920f82b4564bb2d33", - "reference": "8b1308a9d7bdbdb20ce87ef920f82b4564bb2d33", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/bae415e135dd68260c2d020ba392850231e9b1ab", + "reference": "bae415e135dd68260c2d020ba392850231e9b1ab", "shasum": "" }, "require": { + "ext-filter": "*", "ext-json": "*", "marc-mabe/php-enum": "^4.4", "php": "^7.2 || ^8.0" @@ -7462,20 +7563,9 @@ ], "authors": [ { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" + "name": "Danny van der Sluijs", + "email": "danny.vandersluijs@icloud.com", + "role": "Maintainer" } ], "description": "A library to validate a json schema.", @@ -7486,9 +7576,10 @@ ], "support": { "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/6.10.0" + "source": "https://github.com/jsonrainbow/json-schema/tree/6.14.0" }, - "time": "2026-06-16T20:50:26+00:00" + "time": "2026-10-24T08:53:34+00:00", + "published-time": "2026-10-24T08:53:38+00:00" }, { "name": "localheinz/diff", @@ -7543,7 +7634,8 @@ "issues": "https://github.com/localheinz/diff/issues", "source": "https://github.com/localheinz/diff/tree/1.3.0" }, - "time": "2025-08-30T09:44:18+00:00" + "time": "2025-08-30T09:44:18+00:00", + "published-time": "2025-08-30T09:45:38+00:00" }, { "name": "marc-mabe/php-enum", @@ -7616,28 +7708,30 @@ "issues": "https://github.com/marc-mabe/php-enum/issues", "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.2" }, - "time": "2025-09-14T11:18:39+00:00" + "time": "2025-09-14T11:18:39+00:00", + "published-time": "2025-09-14T11:32:17+00:00" }, { "name": "masterminds/html5", - "version": "2.10.1", + "version": "2.12.0", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", - "reference": "fd5018f6815fff903946d0564977b44ce8010e29" + "reference": "15e16663bd6f512352209d0e3a789c0a691c0d9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fd5018f6815fff903946d0564977b44ce8010e29", - "reference": "fd5018f6815fff903946d0564977b44ce8010e29", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/15e16663bd6f512352209d0e3a789c0a691c0d9b", + "reference": "15e16663bd6f512352209d0e3a789c0a691c0d9b", "shasum": "" }, "require": { "ext-dom": "*", - "php": ">=5.3.0" + "ext-mbstring": "*", + "php": ">=7.4" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9 || ^10" + "phpunit/phpunit": "^6 || ^7 || ^8 || ^9 || ^10" }, "type": "library", "extra": { @@ -7681,26 +7775,27 @@ ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.10.1" + "source": "https://github.com/Masterminds/html5-php/tree/2.12.0" }, - "time": "2026-06-23T18:43:15+00:00" + "time": "2026-10-25T08:57:58+00:00", + "published-time": "2026-10-25T08:58:48+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.13.4", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.0" }, "conflict": { "doctrine/collections": "<1.6.8", @@ -7735,28 +7830,29 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + "source": "https://github.com/myclabs/DeepCopy/tree/1.14.0" }, "funding": [ { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" + "url": "https://github.com/mnapoli", + "type": "github" } ], - "time": "2025-08-01T08:46:24+00:00" + "time": "2026-08-11T10:17:44+00:00", + "published-time": "2026-08-11T10:29:20+00:00" }, { "name": "nikic/php-parser", - "version": "v5.8.0", + "version": "v5.9.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f" + "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/044a6a392ff8ad0d61f14370a5fbbd0a0107152f", - "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9e33da9553fe7786f0962b35f4e4ecf01be89def", + "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def", "shasum": "" }, "require": { @@ -7798,9 +7894,60 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.8.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.9.0" }, - "time": "2026-07-04T14:30:18+00:00" + "time": "2026-09-13T18:51:52+00:00", + "published-time": "2026-09-13T18:53:16+00:00" + }, + { + "name": "pb30/phpstan-composer-analysis", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/pb30/phpstan-composer-analysis.git", + "reference": "845c20681e6309db74e9bf29629791510d34221b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pb30/phpstan-composer-analysis/zipball/845c20681e6309db74e9bf29629791510d34221b", + "reference": "845c20681e6309db74e9bf29629791510d34221b", + "shasum": "" + }, + "require": { + "php": "~8.1|~8.2|~8.3|~8.4|~8.5", + "phpstan/phpstan": "^2.1.6", + "shipmonk/composer-dependency-analyser": "1.8.4" + }, + "require-dev": { + "laravel/pint": "^1.20" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "ComposerAnalyzer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "issues": "https://github.com/pb30/phpstan-composer-analysis/issues", + "source": "https://github.com/pb30/phpstan-composer-analysis/tree/v1.1.0" + }, + "time": "2025-11-28T03:38:38+00:00", + "published-time": "2025-11-28T03:40:09+00:00" }, { "name": "phar-io/manifest", @@ -7867,7 +8014,8 @@ "type": "github" } ], - "time": "2024-03-03T12:33:53+00:00" + "time": "2024-03-03T12:33:53+00:00", + "published-time": "2024-03-03T12:39:44+00:00" }, { "name": "phar-io/version", @@ -7918,7 +8066,8 @@ "issues": "https://github.com/phar-io/version/issues", "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2022-02-21T01:04:05+00:00" + "time": "2022-02-21T01:04:05+00:00", + "published-time": "2022-02-21T01:04:30+00:00" }, { "name": "phpstan/extension-installer", @@ -7966,15 +8115,16 @@ "issues": "https://github.com/phpstan/extension-installer/issues", "source": "https://github.com/phpstan/extension-installer/tree/1.4.3" }, - "time": "2024-09-04T20:21:43+00:00" + "time": "2024-09-04T20:21:43+00:00", + "published-time": "2024-09-04T20:22:27+00:00" }, { "name": "phpstan/phpstan", - "version": "2.2.5", + "version": "2.3.4", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/909c1e5fef7989ac0d0c1c5c42e32a5c4f6198a0", - "reference": "909c1e5fef7989ac0d0c1c5c42e32a5c4f6198a0", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f20ce6f3c82556cfcfc086b152445a12d1d64fff", + "reference": "f20ce6f3c82556cfcfc086b152445a12d1d64fff", "shasum": "" }, "require": { @@ -8030,31 +8180,85 @@ "type": "github" } ], - "time": "2026-07-05T06:31:06+00:00" + "time": "2026-10-28T22:38:53+00:00", + "published-time": "2026-10-28T22:39:06+00:00" + }, + { + "name": "phpstan/phpstan-deprecation-rules", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", + "reference": "67bedd65c24bc72840afc45aed48b1059dd44bec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/67bedd65c24bc72840afc45aed48b1059dd44bec", + "reference": "67bedd65c24bc72840afc45aed48b1059dd44bec", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.1.39" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "shipmonk/name-collision-detector": "^2.1" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.5" + }, + "time": "2026-07-22T06:50:43+00:00", + "published-time": "2026-07-27T15:18:00+00:00" }, { "name": "phpstan/phpstan-strict-rules", - "version": "2.0.11", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "9b000a578b85b32945b358b172c7b20e91189024" + "reference": "24ec51589f896f048d0d36de373d993b5cf71786" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/9b000a578b85b32945b358b172c7b20e91189024", - "reference": "9b000a578b85b32945b358b172c7b20e91189024", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/24ec51589f896f048d0d36de373d993b5cf71786", + "reference": "24ec51589f896f048d0d36de373d993b5cf71786", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.1.39" + "phpstan/phpstan": "^2.3" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/phpstan-deprecation-rules": "^2.0", "phpstan/phpstan-phpunit": "^2.0", - "phpunit/phpunit": "^9.6" + "phpunit/phpunit": "^9.6", + "shipmonk/name-collision-detector": "^2.1" }, "type": "phpstan-extension", "extra": { @@ -8079,35 +8283,36 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.11" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.1.0" }, - "time": "2026-05-02T06:54:10+00:00" + "time": "2026-10-01T21:30:37+00:00", + "published-time": "2026-10-06T07:32:29+00:00" }, { "name": "phpstan/phpstan-symfony", - "version": "2.0.20", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "53f1a6462dbe71fad36ce054caf5e1b725b740fd" + "reference": "e218a49b5d24c9fd74903e22433fb10e16c33a53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/53f1a6462dbe71fad36ce054caf5e1b725b740fd", - "reference": "53f1a6462dbe71fad36ce054caf5e1b725b740fd", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/e218a49b5d24c9fd74903e22433fb10e16c33a53", + "reference": "e218a49b5d24c9fd74903e22433fb10e16c33a53", "shasum": "" }, "require": { "ext-simplexml": "*", "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.1.13" + "phpstan/phpstan": "^2.3" }, "conflict": { "symfony/framework-bundle": "<3.0" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-phpunit": "^2.0.8", + "phpstan/phpstan-phpunit": "^2.0.13", "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^9.6", "psr/container": "1.1.2", @@ -8153,22 +8358,23 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.20" + "source": "https://github.com/phpstan/phpstan-symfony/tree/2.1.1" }, - "time": "2026-06-16T09:17:35+00:00" + "time": "2026-10-25T14:57:26+00:00", + "published-time": "2026-10-26T09:30:48+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "14.2.3", + "version": "14.5.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "82f6e49ff224e2cde923d74425e583a883910783" + "reference": "4063552c678ce3beb4b7f131a5b7354a19ff3e2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/82f6e49ff224e2cde923d74425e583a883910783", - "reference": "82f6e49ff224e2cde923d74425e583a883910783", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4063552c678ce3beb4b7f131a5b7354a19ff3e2a", + "reference": "4063552c678ce3beb4b7f131a5b7354a19ff3e2a", "shasum": "" }, "require": { @@ -8176,18 +8382,17 @@ "ext-libxml": "*", "ext-mbstring": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.8.0", + "nikic/php-parser": "^5.9.0", "php": ">=8.4", - "phpunit/php-text-template": "^6.0", + "phpunit/php-text-template": "^6.0.1", "sebastian/complexity": "^6.0", - "sebastian/environment": "^9.3.2", - "sebastian/git-state": "^1.0", - "sebastian/lines-of-code": "^5.0.1", - "sebastian/version": "^7.0", - "theseer/tokenizer": "^2.0.1" + "sebastian/environment": "^9.3.3", + "sebastian/git-state": "^1.1.0", + "sebastian/lines-of-code": "^5.0.2", + "sebastian/version": "^7.0.1" }, "require-dev": { - "phpunit/phpunit": "^13.2.2" + "phpunit/phpunit": "^13.4.5" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -8196,7 +8401,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "14.2.x-dev" + "dev-main": "14.5.x-dev" } }, "autoload": { @@ -8225,7 +8430,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.2.3" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.5.1" }, "funding": [ { @@ -8245,27 +8450,28 @@ "type": "tidelift" } ], - "time": "2026-07-06T15:04:02+00:00" + "time": "2026-11-02T11:47:37+00:00", + "published-time": "2026-11-02T11:49:08+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "7.0.0", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "6e5aa1fb0a95b1703d83e721299ee18bb4e2de50" + "reference": "9bb4e6c58b62c1e043be995c66abec7c97307aae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6e5aa1fb0a95b1703d83e721299ee18bb4e2de50", - "reference": "6e5aa1fb0a95b1703d83e721299ee18bb4e2de50", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/9bb4e6c58b62c1e043be995c66abec7c97307aae", + "reference": "9bb4e6c58b62c1e043be995c66abec7c97307aae", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.0" + "phpunit/phpunit": "^13.3.1" }, "type": "library", "extra": { @@ -8298,7 +8504,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/7.0.2" }, "funding": [ { @@ -8318,7 +8524,8 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:33:26+00:00" + "time": "2026-08-25T14:47:43+00:00", + "published-time": "2026-08-25T14:48:49+00:00" }, { "name": "phpunit/php-invoker", @@ -8394,27 +8601,28 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:34:47+00:00" + "time": "2026-02-06T04:34:47+00:00", + "published-time": "2026-02-06T04:35:29+00:00" }, { "name": "phpunit/php-text-template", - "version": "6.0.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4" + "reference": "97107691cb2b6c743b5e0c44be19e983cb337a02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/a47af19f93f76aa3368303d752aa5272ca3299f4", - "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/97107691cb2b6c743b5e0c44be19e983cb337a02", + "reference": "97107691cb2b6c743b5e0c44be19e983cb337a02", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.0" + "phpunit/phpunit": "^13.3.6" }, "type": "library", "extra": { @@ -8446,7 +8654,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/6.0.1" }, "funding": [ { @@ -8466,7 +8674,8 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:36:37+00:00" + "time": "2026-10-03T04:54:24+00:00", + "published-time": "2026-10-03T04:54:39+00:00" }, { "name": "phpunit/php-timer", @@ -8538,20 +8747,21 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:37:53+00:00" + "time": "2026-02-06T04:37:53+00:00", + "published-time": "2026-02-06T04:38:39+00:00" }, { "name": "phpunit/phpunit", - "version": "13.2.4", + "version": "13.4.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "8f5180f4627fc1978be2f61d8d9979dbe37e0c10" + "reference": "4821376960d0e1e5a7b7b700955ebcab33ecd71b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8f5180f4627fc1978be2f61d8d9979dbe37e0c10", - "reference": "8f5180f4627fc1978be2f61d8d9979dbe37e0c10", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4821376960d0e1e5a7b7b700955ebcab33ecd71b", + "reference": "4821376960d0e1e5a7b7b700955ebcab33ecd71b", "shasum": "" }, "require": { @@ -8561,27 +8771,27 @@ "ext-libxml": "*", "ext-mbstring": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.4", + "myclabs/deep-copy": "^1.14.0", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.4.1", - "phpunit/php-code-coverage": "^14.2.3", - "phpunit/php-file-iterator": "^7.0.0", + "phpunit/php-code-coverage": "^14.5.0", + "phpunit/php-file-iterator": "^7.0.2", "phpunit/php-invoker": "^7.0.0", - "phpunit/php-text-template": "^6.0.0", + "phpunit/php-text-template": "^6.0.1", "phpunit/php-timer": "^9.0.0", - "sebastian/cli-parser": "^5.0.0", - "sebastian/comparator": "^8.3.0", - "sebastian/diff": "^9.0", - "sebastian/environment": "^9.3.2", - "sebastian/exporter": "^8.1.0", + "sebastian/cli-parser": "^5.0.1", + "sebastian/comparator": "^8.4", + "sebastian/diff": "^9.0.1", + "sebastian/environment": "^9.3.3", + "sebastian/exporter": "^8.2.1", "sebastian/file-filter": "^1.0", - "sebastian/git-state": "^1.0", + "sebastian/git-state": "^1.1", "sebastian/global-state": "^9.0.1", - "sebastian/object-enumerator": "^8.0.0", - "sebastian/recursion-context": "^8.0.0", - "sebastian/type": "^7.0.1", - "sebastian/version": "^7.0.0", + "sebastian/object-enumerator": "^8.1.0", + "sebastian/recursion-context": "^8.0.1", + "sebastian/type": "^7.0.2", + "sebastian/version": "^7.0.1", "staabm/side-effects-detector": "^1.0.5" }, "bin": [ @@ -8590,7 +8800,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "13.2-dev" + "dev-main": "13.4-dev" } }, "autoload": { @@ -8622,7 +8832,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/13.2.4" + "source": "https://github.com/sebastianbergmann/phpunit/tree/13.4.6" }, "funding": [ { @@ -8630,7 +8840,8 @@ "type": "other" } ], - "time": "2026-07-08T08:36:51+00:00" + "time": "2026-11-02T07:12:28+00:00", + "published-time": "2026-11-02T07:13:08+00:00" }, { "name": "react/cache", @@ -8702,7 +8913,8 @@ "type": "open_collective" } ], - "time": "2022-11-30T15:59:55+00:00" + "time": "2022-11-30T15:59:55+00:00", + "published-time": "2022-11-30T16:03:35+00:00" }, { "name": "react/child-process", @@ -8777,7 +8989,8 @@ "type": "open_collective" } ], - "time": "2025-12-23T15:25:20+00:00" + "time": "2025-12-23T15:25:20+00:00", + "published-time": "2025-12-23T15:25:57+00:00" }, { "name": "react/dns", @@ -8853,7 +9066,8 @@ "type": "open_collective" } ], - "time": "2025-11-18T19:34:28+00:00" + "time": "2025-11-18T19:34:28+00:00", + "published-time": "2025-11-18T19:35:06+00:00" }, { "name": "react/event-loop", @@ -8925,7 +9139,8 @@ "type": "open_collective" } ], - "time": "2025-11-17T20:46:25+00:00" + "time": "2025-11-17T20:46:25+00:00", + "published-time": "2025-11-17T20:47:32+00:00" }, { "name": "react/promise", @@ -8998,7 +9213,8 @@ "type": "open_collective" } ], - "time": "2025-08-19T18:57:03+00:00" + "time": "2025-08-19T18:57:03+00:00", + "published-time": "2025-08-19T19:13:36+00:00" }, { "name": "react/socket", @@ -9078,7 +9294,8 @@ "type": "open_collective" } ], - "time": "2025-11-19T20:47:34+00:00" + "time": "2025-11-19T20:47:34+00:00", + "published-time": "2025-11-19T20:48:23+00:00" }, { "name": "react/stream", @@ -9156,25 +9373,26 @@ "type": "open_collective" } ], - "time": "2024-06-11T12:45:25+00:00" + "time": "2024-06-11T12:45:25+00:00", + "published-time": "2024-06-11T12:48:34+00:00" }, { "name": "rector/rector", - "version": "2.5.4", + "version": "2.8.3", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "adaa18d7cd6b3c960967cfbc98c03efb3116ac0e" + "reference": "12ddb68d34acb91bcf3d00302bf1c7c1b5840bd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/adaa18d7cd6b3c960967cfbc98c03efb3116ac0e", - "reference": "adaa18d7cd6b3c960967cfbc98c03efb3116ac0e", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/12ddb68d34acb91bcf3d00302bf1c7c1b5840bd6", + "reference": "12ddb68d34acb91bcf3d00302bf1c7c1b5840bd6", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.2.2" + "phpstan/phpstan": "^2.3.4" }, "conflict": { "rector/rector-doctrine": "*", @@ -9182,9 +9400,6 @@ "rector/rector-phpunit": "*", "rector/rector-symfony": "*" }, - "suggest": { - "ext-dom": "To manipulate phpunit.xml via the custom-rule command" - }, "bin": [ "bin/rector" ], @@ -9208,7 +9423,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.5.4" + "source": "https://github.com/rectorphp/rector/tree/2.8.3" }, "funding": [ { @@ -9216,27 +9431,28 @@ "type": "github" } ], - "time": "2026-07-06T12:41:46+00:00" + "time": "2026-10-29T05:51:41+00:00", + "published-time": "2026-10-29T05:51:47+00:00" }, { "name": "sebastian/cli-parser", - "version": "5.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "48a4654fa5e48c1c81214e9930048a572d4b23ca" + "reference": "eeb759ad3146b7096fb59c3195d39e071cd409e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/48a4654fa5e48c1c81214e9930048a572d4b23ca", - "reference": "48a4654fa5e48c1c81214e9930048a572d4b23ca", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/eeb759ad3146b7096fb59c3195d39e071cd409e3", + "reference": "eeb759ad3146b7096fb59c3195d39e071cd409e3", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.0" + "phpunit/phpunit": "^13.2.6" }, "type": "library", "extra": { @@ -9265,7 +9481,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/5.0.1" }, "funding": [ { @@ -9285,20 +9501,21 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:39:44+00:00" + "time": "2026-08-01T04:27:14+00:00", + "published-time": "2026-08-01T04:29:01+00:00" }, { "name": "sebastian/comparator", - "version": "8.3.0", + "version": "8.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "c025fc7604afab3f195fab7cdaf72327331af241" + "reference": "3b070e608146cba00fd6fd1f0ffba89e5a8897fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c025fc7604afab3f195fab7cdaf72327331af241", - "reference": "c025fc7604afab3f195fab7cdaf72327331af241", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/3b070e608146cba00fd6fd1f0ffba89e5a8897fb", + "reference": "3b070e608146cba00fd6fd1f0ffba89e5a8897fb", "shasum": "" }, "require": { @@ -9306,10 +9523,10 @@ "ext-mbstring": "*", "php": ">=8.4", "sebastian/diff": "^9.0", - "sebastian/exporter": "^8.1.0" + "sebastian/exporter": "^8.2" }, "require-dev": { - "phpunit/phpunit": "^13.2" + "phpunit/phpunit": "^13.3" }, "suggest": { "ext-bcmath": "For comparing BcMath\\Number objects" @@ -9317,7 +9534,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "8.3-dev" + "dev-main": "8.4-dev" } }, "autoload": { @@ -9357,7 +9574,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/8.3.0" + "source": "https://github.com/sebastianbergmann/comparator/tree/8.4.0" }, "funding": [ { @@ -9377,7 +9594,8 @@ "type": "tidelift" } ], - "time": "2026-06-05T03:06:45+00:00" + "time": "2026-08-07T07:23:13+00:00", + "published-time": "2026-08-07T07:23:29+00:00" }, { "name": "sebastian/complexity", @@ -9447,28 +9665,29 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:41:32+00:00" + "time": "2026-02-06T04:41:32+00:00", + "published-time": "2026-02-06T04:41:49+00:00" }, { "name": "sebastian/diff", - "version": "9.0.0", + "version": "9.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "a3fb6a298a265ff487a91bbea46e03cd01dbb226" + "reference": "a2df6626c1baf31d5a88674882a3072f151b5a26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a3fb6a298a265ff487a91bbea46e03cd01dbb226", - "reference": "a3fb6a298a265ff487a91bbea46e03cd01dbb226", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a2df6626c1baf31d5a88674882a3072f151b5a26", + "reference": "a2df6626c1baf31d5a88674882a3072f151b5a26", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.2", - "symfony/process": "^7.4.13" + "phpunit/phpunit": "^13.3.1", + "symfony/process": "^7.4.17" }, "type": "library", "extra": { @@ -9506,7 +9725,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/9.0.0" + "source": "https://github.com/sebastianbergmann/diff/tree/9.0.1" }, "funding": [ { @@ -9526,27 +9745,28 @@ "type": "tidelift" } ], - "time": "2026-06-05T03:04:51+00:00" + "time": "2026-08-25T15:38:55+00:00", + "published-time": "2026-08-25T15:39:44+00:00" }, { "name": "sebastian/environment", - "version": "9.3.2", + "version": "9.3.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e" + "reference": "d4dd10267a11055066a2a78ae04583d8ddd4f595" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e", - "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d4dd10267a11055066a2a78ae04583d8ddd4f595", + "reference": "d4dd10267a11055066a2a78ae04583d8ddd4f595", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.1.11" + "phpunit/phpunit": "^13.3.6" }, "suggest": { "ext-posix": "*" @@ -9582,7 +9802,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/9.3.2" + "source": "https://github.com/sebastianbergmann/environment/tree/9.3.3" }, "funding": [ { @@ -9602,34 +9822,35 @@ "type": "tidelift" } ], - "time": "2026-05-25T13:41:38+00:00" + "time": "2026-10-01T12:37:56+00:00", + "published-time": "2026-10-01T12:38:48+00:00" }, { "name": "sebastian/exporter", - "version": "8.1.0", + "version": "8.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "c0d29a945f8cf82f300a05e69874508e307ca4c6" + "reference": "24a3b69bba4a12ab615fca9d34680c5598d9ab7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c0d29a945f8cf82f300a05e69874508e307ca4c6", - "reference": "c0d29a945f8cf82f300a05e69874508e307ca4c6", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/24a3b69bba4a12ab615fca9d34680c5598d9ab7a", + "reference": "24a3b69bba4a12ab615fca9d34680c5598d9ab7a", "shasum": "" }, "require": { "ext-mbstring": "*", "php": ">=8.4", - "sebastian/recursion-context": "^8.0" + "sebastian/recursion-context": "^8.0.1" }, "require-dev": { - "phpunit/phpunit": "^13.1.10" + "phpunit/phpunit": "^13.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.1-dev" + "dev-main": "8.2-dev" } }, "autoload": { @@ -9672,7 +9893,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/8.1.0" + "source": "https://github.com/sebastianbergmann/exporter/tree/8.2.1" }, "funding": [ { @@ -9692,7 +9913,8 @@ "type": "tidelift" } ], - "time": "2026-05-21T11:50:56+00:00" + "time": "2026-08-07T07:22:06+00:00", + "published-time": "2026-08-07T07:23:47+00:00" }, { "name": "sebastian/file-filter", @@ -9761,32 +9983,33 @@ "type": "tidelift" } ], - "time": "2026-04-22T07:20:04+00:00" + "time": "2026-04-22T07:20:04+00:00", + "published-time": "2026-04-22T07:20:25+00:00" }, { "name": "sebastian/git-state", - "version": "1.0.0", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/git-state.git", - "reference": "792a952e0eba55b6960a48aeceb9f371aad1f76b" + "reference": "31a565f463686f0eefa85f899549256bf5805985" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/git-state/zipball/792a952e0eba55b6960a48aeceb9f371aad1f76b", - "reference": "792a952e0eba55b6960a48aeceb9f371aad1f76b", + "url": "https://api.github.com/repos/sebastianbergmann/git-state/zipball/31a565f463686f0eefa85f899549256bf5805985", + "reference": "31a565f463686f0eefa85f899549256bf5805985", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.0" + "phpunit/phpunit": "^13.4.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.0-dev" + "dev-main": "1.1-dev" } }, "autoload": { @@ -9810,7 +10033,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/git-state/issues", "security": "https://github.com/sebastianbergmann/git-state/security/policy", - "source": "https://github.com/sebastianbergmann/git-state/tree/1.0.0" + "source": "https://github.com/sebastianbergmann/git-state/tree/1.1.0" }, "funding": [ { @@ -9830,7 +10053,8 @@ "type": "tidelift" } ], - "time": "2026-03-21T12:54:28+00:00" + "time": "2026-10-21T05:59:52+00:00", + "published-time": "2026-10-21T06:01:28+00:00" }, { "name": "sebastian/global-state", @@ -9904,28 +10128,29 @@ "type": "tidelift" } ], - "time": "2026-06-01T15:11:33+00:00" + "time": "2026-06-01T15:11:33+00:00", + "published-time": "2026-06-01T15:20:45+00:00" }, { "name": "sebastian/lines-of-code", - "version": "5.0.1", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d2cff273a90c79b0eb590baa682d4b5c318bdbb7" + "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d2cff273a90c79b0eb590baa682d4b5c318bdbb7", - "reference": "d2cff273a90c79b0eb590baa682d4b5c318bdbb7", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d1b6f8fce682505dbd048977f1abedf1b8ad3ff8", + "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8", "shasum": "" }, "require": { - "nikic/php-parser": "^5.7.0", + "nikic/php-parser": "^5.8.0", "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.1.10" + "phpunit/phpunit": "^13.2.4" }, "type": "library", "extra": { @@ -9954,7 +10179,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.2" }, "funding": [ { @@ -9974,34 +10199,34 @@ "type": "tidelift" } ], - "time": "2026-05-19T16:23:37+00:00" + "time": "2026-07-09T08:42:34+00:00", + "published-time": "2026-07-09T08:44:06+00:00" }, { "name": "sebastian/object-enumerator", - "version": "8.0.0", + "version": "8.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "b39ab125fd9a7434b0ecbc4202eebce11a98cfc5" + "reference": "511064ecde82bd747e2ba2fab3dda8d977b59576" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/b39ab125fd9a7434b0ecbc4202eebce11a98cfc5", - "reference": "b39ab125fd9a7434b0ecbc4202eebce11a98cfc5", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/511064ecde82bd747e2ba2fab3dda8d977b59576", + "reference": "511064ecde82bd747e2ba2fab3dda8d977b59576", "shasum": "" }, "require": { "php": ">=8.4", - "sebastian/object-reflector": "^6.0", - "sebastian/recursion-context": "^8.0" + "sebastian/recursion-context": "^8.0.1" }, "require-dev": { - "phpunit/phpunit": "^13.0" + "phpunit/phpunit": "^13.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "8.1-dev" } }, "autoload": { @@ -10024,7 +10249,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/8.0.0" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/8.1.0" }, "funding": [ { @@ -10044,27 +10269,28 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:46:36+00:00" + "time": "2026-08-13T07:05:05+00:00", + "published-time": "2026-08-13T07:07:58+00:00" }, { "name": "sebastian/object-reflector", - "version": "6.0.0", + "version": "6.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "3ca042c2c60b0eab094f8a1b6a7093f4d4c72200" + "reference": "f71bbcdc4f95456b4622810bec64eb06372e25b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/3ca042c2c60b0eab094f8a1b6a7093f4d4c72200", - "reference": "3ca042c2c60b0eab094f8a1b6a7093f4d4c72200", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/f71bbcdc4f95456b4622810bec64eb06372e25b2", + "reference": "f71bbcdc4f95456b4622810bec64eb06372e25b2", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.0" + "phpunit/phpunit": "^13.3.0" }, "type": "library", "extra": { @@ -10092,7 +10318,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/6.1.0" }, "funding": [ { @@ -10112,27 +10338,28 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:47:13+00:00" + "time": "2026-08-13T06:34:36+00:00", + "published-time": "2026-08-13T06:39:22+00:00" }, { "name": "sebastian/recursion-context", - "version": "8.0.0", + "version": "8.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "74c5af21f6a5833e91767ca068c4d3dfec15317e" + "reference": "32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/74c5af21f6a5833e91767ca068c4d3dfec15317e", - "reference": "74c5af21f6a5833e91767ca068c4d3dfec15317e", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0", + "reference": "32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.0" + "phpunit/phpunit": "^13.2.6" }, "type": "library", "extra": { @@ -10168,7 +10395,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/8.0.0" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/8.0.1" }, "funding": [ { @@ -10188,27 +10415,28 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:51:28+00:00" + "time": "2026-08-03T05:58:12+00:00", + "published-time": "2026-08-03T05:59:59+00:00" }, { "name": "sebastian/type", - "version": "7.0.1", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "fee0309275847fefd7636167085e379c1dbf6990" + "reference": "bd1df467864cb95140414059a535b2d906173fcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fee0309275847fefd7636167085e379c1dbf6990", - "reference": "fee0309275847fefd7636167085e379c1dbf6990", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/bd1df467864cb95140414059a535b2d906173fcf", + "reference": "bd1df467864cb95140414059a535b2d906173fcf", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.1.10" + "phpunit/phpunit": "^13.3.0" }, "type": "library", "extra": { @@ -10237,7 +10465,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/7.0.1" + "source": "https://github.com/sebastianbergmann/type/tree/7.0.2" }, "funding": [ { @@ -10257,20 +10485,21 @@ "type": "tidelift" } ], - "time": "2026-05-20T06:49:11+00:00" + "time": "2026-08-10T08:00:57+00:00", + "published-time": "2026-08-10T08:01:43+00:00" }, { "name": "sebastian/version", - "version": "7.0.0", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "ad37a5552c8e2b88572249fdc19b6da7792e021b" + "reference": "f1598cf1d8d1ca4c0f194a52f2fe72a559a7b0b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ad37a5552c8e2b88572249fdc19b6da7792e021b", - "reference": "ad37a5552c8e2b88572249fdc19b6da7792e021b", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/f1598cf1d8d1ca4c0f194a52f2fe72a559a7b0b1", + "reference": "f1598cf1d8d1ca4c0f194a52f2fe72a559a7b0b1", "shasum": "" }, "require": { @@ -10303,7 +10532,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/version/issues", "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/version/tree/7.0.1" }, "funding": [ { @@ -10323,7 +10552,75 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:52:52+00:00" + "time": "2026-10-04T05:51:14+00:00", + "published-time": "2026-10-04T05:52:22+00:00" + }, + { + "name": "shipmonk/composer-dependency-analyser", + "version": "1.8.4", + "source": { + "type": "git", + "url": "https://github.com/shipmonk-rnd/composer-dependency-analyser.git", + "reference": "975e5873b519d5180b1017a5dfb43d80781abd45" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/shipmonk-rnd/composer-dependency-analyser/zipball/975e5873b519d5180b1017a5dfb43d80781abd45", + "reference": "975e5873b519d5180b1017a5dfb43d80781abd45", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "editorconfig-checker/editorconfig-checker": "^10.7.0", + "ergebnis/composer-normalize": "^2.19.0", + "ext-dom": "*", + "ext-libxml": "*", + "phpcompatibility/php-compatibility": "^9.3.5", + "phpstan/phpstan": "^1.12.26", + "phpstan/phpstan-phpunit": "^1.4.2", + "phpstan/phpstan-strict-rules": "^1.6.2", + "phpunit/phpunit": "^8.5.42 || ^9.6.23", + "shipmonk/name-collision-detector": "^2.1.1", + "slevomat/coding-standard": "^8.15.0" + }, + "bin": [ + "bin/composer-dependency-analyser" + ], + "type": "library", + "autoload": { + "psr-4": { + "ShipMonk\\ComposerDependencyAnalyser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Fast detection of composer dependency issues (dead dependencies, shadow dependencies, misplaced dependencies)", + "keywords": [ + "analyser", + "composer", + "composer dependency", + "dead code", + "dead dependency", + "detector", + "dev", + "misplaced dependency", + "shadow dependency", + "static analysis", + "unused code", + "unused dependency" + ], + "support": { + "issues": "https://github.com/shipmonk-rnd/composer-dependency-analyser/issues", + "source": "https://github.com/shipmonk-rnd/composer-dependency-analyser/tree/1.8.4" + }, + "time": "2025-11-25T14:38:16+00:00", + "published-time": "2025-11-25T14:59:44+00:00" }, { "name": "staabm/side-effects-detector", @@ -10375,20 +10672,21 @@ "type": "github" } ], - "time": "2024-10-20T05:08:20+00:00" + "time": "2024-10-20T05:08:20+00:00", + "published-time": "2024-10-20T05:09:39+00:00" }, { "name": "symfony/browser-kit", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "bb28e8761a6c33975972948010f00d4a10f0a634" + "reference": "a0d19ca90c1fcce29d3337decb761b5adb808965" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/bb28e8761a6c33975972948010f00d4a10f0a634", - "reference": "bb28e8761a6c33975972948010f00d4a10f0a634", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/a0d19ca90c1fcce29d3337decb761b5adb808965", + "reference": "a0d19ca90c1fcce29d3337decb761b5adb808965", "shasum": "" }, "require": { @@ -10399,6 +10697,7 @@ "require-dev": { "symfony/css-selector": "^6.4|^7.0|^8.0", "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", "symfony/mime": "^6.4|^7.0|^8.0", "symfony/process": "^6.4|^7.0|^8.0" }, @@ -10428,7 +10727,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.4.14" + "source": "https://github.com/symfony/browser-kit/tree/v7.4.23" }, "funding": [ { @@ -10448,20 +10747,21 @@ "type": "tidelift" } ], - "time": "2026-06-08T20:24:16+00:00" + "time": "2026-11-01T07:00:22+00:00", + "published-time": "2026-11-04T11:28:24+00:00" }, { "name": "symfony/css-selector", - "version": "v7.4.9", + "version": "v7.4.22", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "b75663ed96cf4756e28e3105476f220f92886cc4" + "reference": "4cdbb4a575111d771791339a9d5231155918f699" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/b75663ed96cf4756e28e3105476f220f92886cc4", - "reference": "b75663ed96cf4756e28e3105476f220f92886cc4", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/4cdbb4a575111d771791339a9d5231155918f699", + "reference": "4cdbb4a575111d771791339a9d5231155918f699", "shasum": "" }, "require": { @@ -10497,7 +10797,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.4.9" + "source": "https://github.com/symfony/css-selector/tree/v7.4.22" }, "funding": [ { @@ -10517,20 +10817,21 @@ "type": "tidelift" } ], - "time": "2026-04-18T13:18:21+00:00" + "time": "2026-10-18T14:39:27+00:00", + "published-time": "2026-10-28T18:21:04+00:00" }, { "name": "symfony/dom-crawler", - "version": "v7.4.12", + "version": "v7.4.22", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "b59b59122690976550fd142c23fab62c84738db6" + "reference": "cc5c3d6275873fd463c2a772251d65379015682f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b59b59122690976550fd142c23fab62c84738db6", - "reference": "b59b59122690976550fd142c23fab62c84738db6", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/cc5c3d6275873fd463c2a772251d65379015682f", + "reference": "cc5c3d6275873fd463c2a772251d65379015682f", "shasum": "" }, "require": { @@ -10569,7 +10870,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v7.4.12" + "source": "https://github.com/symfony/dom-crawler/tree/v7.4.22" }, "funding": [ { @@ -10589,36 +10890,37 @@ "type": "tidelift" } ], - "time": "2026-05-20T07:20:23+00:00" + "time": "2026-10-25T14:40:16+00:00", + "published-time": "2026-10-28T18:20:14+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.67.0", + "version": "1.68.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "6ce8b313845f16bcf385ee3cb31d8b24e30d5516" + "reference": "1b0fb459594fdeb1d183065451c5e954babeb16c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/6ce8b313845f16bcf385ee3cb31d8b24e30d5516", - "reference": "6ce8b313845f16bcf385ee3cb31d8b24e30d5516", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/1b0fb459594fdeb1d183065451c5e954babeb16c", + "reference": "1b0fb459594fdeb1d183065451c5e954babeb16c", "shasum": "" }, "require": { "composer-runtime-api": "^2.1", "doctrine/inflector": "^2.0", "nikic/php-parser": "^5.0", - "php": ">=8.1", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "php": ">=8.2", + "symfony/config": "^7.4|^8.1", + "symfony/console": "^7.4|^8.1", + "symfony/dependency-injection": "^7.4|^8.1", "symfony/deprecation-contracts": "^2.2|^3", - "symfony/filesystem": "^6.4|^7.0|^8.0", - "symfony/finder": "^6.4|^7.0|^8.0", - "symfony/framework-bundle": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/process": "^6.4|^7.0|^8.0" + "symfony/filesystem": "^7.4|^8.1", + "symfony/finder": "^7.4|^8.1", + "symfony/framework-bundle": "^7.4|^8.1", + "symfony/http-kernel": "^7.4|^8.1", + "symfony/process": "^7.4|^8.1" }, "conflict": { "doctrine/doctrine-bundle": "<2.10", @@ -10629,11 +10931,12 @@ "doctrine/doctrine-bundle": "^2.10|^3.0", "doctrine/orm": "^2.15|^3", "doctrine/persistence": "^3.1|^4.0", - "symfony/http-client": "^6.4|^7.0|^8.0", - "symfony/phpunit-bridge": "^6.4.1|^7.0|^8.0", - "symfony/security-core": "^6.4|^7.0|^8.0", - "symfony/security-http": "^6.4|^7.0|^8.0", - "symfony/yaml": "^6.4|^7.0|^8.0", + "symfony/doctrine-bridge": "^7.4|^8.1", + "symfony/http-client": "^7.4|^8.1", + "symfony/phpunit-bridge": "^7.4|^8.1", + "symfony/security-core": "^7.4|^8.1", + "symfony/security-http": "^7.4|^8.1", + "symfony/yaml": "^7.4|^8.1", "twig/twig": "^3.0|^4.x-dev" }, "type": "symfony-bundle", @@ -10668,7 +10971,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.67.0" + "source": "https://github.com/symfony/maker-bundle/tree/1.68.0" }, "funding": [ { @@ -10688,20 +10991,21 @@ "type": "tidelift" } ], - "time": "2026-03-18T13:39:06+00:00" + "time": "2026-09-12T21:13:48+00:00", + "published-time": "2026-09-12T21:26:21+00:00" }, { "name": "symfony/options-resolver", - "version": "v7.4.8", + "version": "v7.4.22", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "2888fcdc4dc2fd5f7c7397be78631e8af12e02b4" + "reference": "c95dd81729944936b48f9fecb38ff524eeaf97c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/2888fcdc4dc2fd5f7c7397be78631e8af12e02b4", - "reference": "2888fcdc4dc2fd5f7c7397be78631e8af12e02b4", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/c95dd81729944936b48f9fecb38ff524eeaf97c0", + "reference": "c95dd81729944936b48f9fecb38ff524eeaf97c0", "shasum": "" }, "require": { @@ -10739,7 +11043,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.4.8" + "source": "https://github.com/symfony/options-resolver/tree/v7.4.22" }, "funding": [ { @@ -10759,20 +11063,21 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-10-18T14:39:27+00:00", + "published-time": "2026-10-28T18:19:49+00:00" }, { "name": "symfony/process", - "version": "v7.4.13", + "version": "v7.4.22", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "f5804be144caceb570f6747519999636b664f24c" + "reference": "a5a6912edbbfc4c98cd080bc4bbe37c8e7eeb20a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/f5804be144caceb570f6747519999636b664f24c", - "reference": "f5804be144caceb570f6747519999636b664f24c", + "url": "https://api.github.com/repos/symfony/process/zipball/a5a6912edbbfc4c98cd080bc4bbe37c8e7eeb20a", + "reference": "a5a6912edbbfc4c98cd080bc4bbe37c8e7eeb20a", "shasum": "" }, "require": { @@ -10804,7 +11109,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.4.13" + "source": "https://github.com/symfony/process/tree/v7.4.22" }, "funding": [ { @@ -10824,7 +11129,8 @@ "type": "tidelift" } ], - "time": "2026-05-23T16:05:06+00:00" + "time": "2026-10-25T14:40:16+00:00", + "published-time": "2026-10-28T18:21:18+00:00" }, { "name": "symfony/stopwatch", @@ -10890,20 +11196,21 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-24T13:12:05+00:00", + "published-time": "2026-03-31T21:08:39+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v7.4.14", + "version": "v7.4.23", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "5dead36a9202a6008b54b95308bce7ab97a41fe0" + "reference": "5f632731e0a9c129cd1939da8d13949af1ee505a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/5dead36a9202a6008b54b95308bce7ab97a41fe0", - "reference": "5dead36a9202a6008b54b95308bce7ab97a41fe0", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/5f632731e0a9c129cd1939da8d13949af1ee505a", + "reference": "5f632731e0a9c129cd1939da8d13949af1ee505a", "shasum": "" }, "require": { @@ -10915,7 +11222,7 @@ "symfony/http-kernel": "^6.4.13|^7.1.6|^8.0", "symfony/routing": "^6.4|^7.0|^8.0", "symfony/twig-bundle": "^6.4|^7.0|^8.0", - "twig/twig": "^3.15" + "twig/twig": "^3.15|^4.0" }, "conflict": { "symfony/form": "<6.4", @@ -10960,7 +11267,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.4.14" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.4.23" }, "funding": [ { @@ -10980,70 +11287,21 @@ "type": "tidelift" } ], - "time": "2026-06-05T06:22:21+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", - "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^8.1" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/2.0.1" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2025-12-08T11:19:18+00:00" + "time": "2026-10-30T12:52:42+00:00", + "published-time": "2026-11-04T11:28:43+00:00" }, { "name": "vincentlanglet/twig-cs-fixer", - "version": "4.0.2", + "version": "4.1.1", "source": { "type": "git", "url": "https://github.com/VincentLanglet/Twig-CS-Fixer.git", - "reference": "1cb75618f7dd0f9bf51924aa6d3aa8c588f51d5a" + "reference": "53c1234b6e5d87ac2beaf686774bba013697f9c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/1cb75618f7dd0f9bf51924aa6d3aa8c588f51d5a", - "reference": "1cb75618f7dd0f9bf51924aa6d3aa8c588f51d5a", + "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/53c1234b6e5d87ac2beaf686774bba013697f9c5", + "reference": "53c1234b6e5d87ac2beaf686774bba013697f9c5", "shasum": "" }, "require": { @@ -11099,7 +11357,7 @@ "homepage": "https://github.com/VincentLanglet/Twig-CS-Fixer", "support": { "issues": "https://github.com/VincentLanglet/Twig-CS-Fixer/issues", - "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/4.0.2" + "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/4.1.1" }, "funding": [ { @@ -11107,7 +11365,8 @@ "type": "github" } ], - "time": "2026-06-29T15:22:14+00:00" + "time": "2026-09-08T21:26:25+00:00", + "published-time": "2026-09-08T21:27:58+00:00" } ], "aliases": [], @@ -11116,10 +11375,10 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=8.3", + "php": ">=8.5", "ext-ctype": "*", "ext-iconv": "*" }, "platform-dev": {}, - "plugin-api-version": "2.9.0" + "plugin-api-version": "2.11.0" } diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml index 8166181..0f34f87 100644 --- a/config/packages/routing.yaml +++ b/config/packages/routing.yaml @@ -2,7 +2,7 @@ framework: router: # Configure how to generate URLs in non-HTTP contexts, such as CLI commands. # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands - #default_uri: http://localhost + default_uri: '%env(DEFAULT_URI)%' when@prod: framework: diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 0d1e5f5..282cc70 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -2,6 +2,7 @@ security: # https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords password_hashers: Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto' + # https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider providers: users_in_memory: { memory: null } @@ -9,7 +10,8 @@ security: id: App\Security\ApiUserProvider firewalls: dev: - pattern: ^/(_(profiler|wdt)|css|images|js)/ + # Ensure dev tools and static assets are always allowed + pattern: ^/(_profiler(/|$)|(_wdt|assets|build)/) security: false main: stateless: true @@ -17,14 +19,13 @@ security: - App\Security\ApiKeyAuthenticator provider: api_user_provider - # activate different ways to authenticate + # Activate different ways to authenticate: # https://symfony.com/doc/current/security.html#the-firewall # https://symfony.com/doc/current/security/impersonating_user.html # switch_user: true - # Easy way to control access for large sections of your site - # Note: Only the *first* access control that matches will be used + # Note: Only the *first* matching rule is applied access_control: - { path: ^/api/v2/docs, roles: PUBLIC_ACCESS } - { path: ^/api, roles: IS_AUTHENTICATED_FULLY } @@ -33,10 +34,8 @@ security: when@test: security: password_hashers: - # By default, password hashers are resource intensive and take time. This is - # important to generate secure password hashes. In tests however, secure hashes - # are not important, waste resources and increase test times. The following - # reduces the work factor to the lowest possible values. + # Password hashers are resource-intensive by design to ensure security. + # In tests, it's safe to reduce their cost to improve performance. Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: algorithm: auto cost: 4 # Lowest possible value for bcrypt diff --git a/config/preload.php b/config/preload.php index 5ebcdb2..bb358ef 100644 --- a/config/preload.php +++ b/config/preload.php @@ -1,5 +1,6 @@ * @psalm-type ParametersConfig = array|Param|null>|Param|null> * @psalm-type ArgumentsType = list|array @@ -136,9 +136,9 @@ * set_locale_from_accept_language?: bool|Param, // Whether to use the Accept-Language HTTP header to set the Request locale (only when the "_locale" request attribute is not passed). // Default: false * set_content_language_from_locale?: bool|Param, // Whether to set the Content-Language HTTP header on the Response using the Request locale. // Default: false * enabled_locales?: list, - * trusted_hosts?: string|list, + * trusted_hosts?: Param|string|list, * trusted_proxies?: mixed, // Default: ["%env(default::SYMFONY_TRUSTED_PROXIES)%"] - * trusted_headers?: string|list, + * trusted_headers?: Param|string|list, * error_controller?: scalar|Param|null, // Default: "error_controller" * handle_all_throwables?: bool|Param, // HttpKernel will handle all kinds of \Throwable. // Default: true * csrf_protection?: bool|array{ @@ -202,23 +202,23 @@ * property?: scalar|Param|null, * service?: scalar|Param|null, * }, - * supports?: string|list, + * supports?: Param|string|list, * definition_validators?: list, * support_strategy?: scalar|Param|null, - * initial_marking?: \BackedEnum|string|list, + * initial_marking?: \BackedEnum|Param|string|list, * events_to_dispatch?: null|list, - * places?: string|list, * }>, * transitions?: list, - * to?: \BackedEnum|string|list, @@ -261,7 +261,7 @@ * }, * request?: bool|array{ // Request configuration * enabled?: bool|Param, // Default: false - * formats?: array>, + * formats?: array>, * }, * assets?: bool|array{ // Assets configuration * enabled?: bool|Param, // Default: true @@ -271,7 +271,7 @@ * version_format?: scalar|Param|null, // Default: "%%s?%%s" * json_manifest_path?: scalar|Param|null, // Default: null * base_path?: scalar|Param|null, // Default: "" - * base_urls?: string|list, + * base_urls?: Param|string|list, * packages?: array, + * base_urls?: Param|string|list, * }>, * }, * asset_mapper?: bool|array{ // Asset Mapper configuration * enabled?: bool|Param, // Default: false - * paths?: string|array, + * paths?: Param|string|array, * excluded_patterns?: list, * exclude_dotfiles?: bool|Param, // If true, any files starting with "." will be excluded from the asset mapper. // Default: true * server?: bool|Param, // If true, a "dev server" will return the assets from the public directory (true in "debug" mode only by default). // Default: true @@ -303,7 +303,7 @@ * }, * translator?: bool|array{ // Translator configuration * enabled?: bool|Param, // Default: false - * fallbacks?: string|list, + * fallbacks?: Param|string|list, * logging?: bool|Param, // Default: false * formatter?: scalar|Param|null, // Default: "translator.formatter.default" * cache_dir?: scalar|Param|null, // Default: "%kernel.cache_dir%/translations" @@ -322,7 +322,7 @@ * domains?: list, * locales?: list, * }>, - * globals?: array, @@ -333,7 +333,7 @@ * enabled?: bool|Param, // Default: true * cache?: scalar|Param|null, // Deprecated: Setting the "framework.validation.cache.cache" configuration option is deprecated. It will be removed in version 8.0. * enable_attributes?: bool|Param, // Default: true - * static_method?: string|list, + * static_method?: Param|string|list, * translation_domain?: scalar|Param|null, // Default: "validators" * email_validation_mode?: "html5"|"html5-allow-no-tld"|"strict"|"loose"|Param, // Default: "html5" * mapping?: array{ @@ -396,7 +396,7 @@ * default_doctrine_dbal_provider?: scalar|Param|null, // Default: "database_connection" * default_pdo_provider?: scalar|Param|null, // Default: null * pools?: array, + * adapters?: Param|string|list, * tags?: scalar|Param|null, // Default: null * public?: bool|Param, // Default: false * default_lifetime?: scalar|Param|null, // Default lifetime of the pool. @@ -417,17 +417,17 @@ * web_link?: bool|array{ // Web links configuration * enabled?: bool|Param, // Default: true * }, - * lock?: bool|string|array{ // Lock configuration + * lock?: Param|bool|string|array{ // Lock configuration * enabled?: bool|Param, // Default: false - * resources?: string|array>, + * resources?: Param|string|array>, * }, - * semaphore?: bool|string|array{ // Semaphore configuration + * semaphore?: Param|bool|string|array{ // Semaphore configuration * enabled?: bool|Param, // Default: false - * resources?: string|array, + * resources?: Param|string|array, * }, * messenger?: bool|array{ // Messenger configuration * enabled?: bool|Param, // Default: false - * routing?: array, * }>, * serializer?: array{ @@ -437,12 +437,12 @@ * context?: array, * }, * }, - * transports?: array, * failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null - * retry_strategy?: string|array{ + * retry_strategy?: Param|string|array{ * service?: scalar|Param|null, // Service id to override the retry strategy entirely. // Default: null * max_retries?: int|Param, // Default: 3 * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 @@ -453,15 +453,15 @@ * rate_limiter?: scalar|Param|null, // Rate limiter name to use when processing messages. // Default: null * }>, * failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null - * stop_worker_on_signals?: int|string|list, + * stop_worker_on_signals?: Param|int|string|list, * default_bus?: scalar|Param|null, // Default: null * buses?: array, * }>, @@ -510,9 +510,9 @@ * retry_failed?: bool|array{ * enabled?: bool|Param, // Default: false * retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null - * http_codes?: int|string|array, + * methods?: Param|string|list, * }>, * max_retries?: int|Param, // Default: 3 * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 @@ -522,7 +522,7 @@ * }, * }, * mock_response_factory?: scalar|Param|null, // The id of the service that should generate mock responses. It should be either an invokable or an iterable. - * scoped_clients?: array, + * methods?: Param|string|list, * }>, * max_retries?: int|Param, // Default: 3 * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 @@ -582,10 +582,10 @@ * transports?: array, * envelope?: array{ // Mailer Envelope configuration * sender?: scalar|Param|null, - * recipients?: string|list, - * allowed_recipients?: string|list, + * recipients?: Param|string|list, + * allowed_recipients?: Param|string|list, * }, - * headers?: array, * dkim_signer?: bool|array{ // DKIM signer configuration @@ -622,7 +622,7 @@ * chatter_transports?: array, * texter_transports?: array, * notification_on_failed_messages?: bool|Param, // Default: false - * channel_policy?: array>, + * channel_policy?: array>, * admin_recipients?: list, + * limiters?: Param|string|list, * limit?: int|Param, // The maximum allowed hits in a fixed interval or burst. * interval?: scalar|Param|null, // Configures the fixed interval if "policy" is set to "fixed_window" or "sliding_window". The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). * rate?: array{ // Configures the fill rate if "policy" is set to "token_bucket". @@ -658,20 +658,20 @@ * allow_safe_elements?: bool|Param, // Allows "safe" elements and attributes. // Default: false * allow_static_elements?: bool|Param, // Allows all static elements and attributes from the W3C Sanitizer API standard. // Default: false * allow_elements?: array, - * block_elements?: string|list, - * drop_elements?: string|list, + * block_elements?: Param|string|list, + * drop_elements?: Param|string|list, * allow_attributes?: array, * drop_attributes?: array, * force_attributes?: array>, * force_https_urls?: bool|Param, // Transforms URLs using the HTTP scheme to use the HTTPS scheme instead. // Default: false - * allowed_link_schemes?: string|list, - * allowed_link_hosts?: null|string|list, + * allowed_link_schemes?: Param|string|list, + * allowed_link_hosts?: Param|null|string|list, * allow_relative_links?: bool|Param, // Allows relative URLs to be used in links href attributes. // Default: false - * allowed_media_schemes?: string|list, - * allowed_media_hosts?: null|string|list, + * allowed_media_schemes?: Param|string|list, + * allowed_media_hosts?: Param|null|string|list, * allow_relative_medias?: bool|Param, // Allows relative URLs to be used in media source attributes (img, audio, video, ...). // Default: false - * with_attribute_sanitizers?: string|list, - * without_attribute_sanitizers?: string|list, + * with_attribute_sanitizers?: Param|string|list, + * without_attribute_sanitizers?: Param|string|list, * max_input_length?: int|Param, // The maximum length allowed for the sanitized input. // Default: 0 * }>, * }, @@ -680,10 +680,10 @@ * message_bus?: scalar|Param|null, // The message bus to use. // Default: "messenger.default_bus" * routing?: array, * }, - * remote-event?: bool|array{ // RemoteEvent configuration + * remote_event?: bool|array{ // RemoteEvent configuration * enabled?: bool|Param, // Default: false * }, * json_streamer?: bool|array{ // JSON streamer configuration @@ -696,6 +696,7 @@ * id?: scalar|Param|null, * type?: scalar|Param|null, * value?: mixed, + * ... * }>, * autoescape_service?: scalar|Param|null, // Default: null * autoescape_service_method?: scalar|Param|null, // Default: null @@ -707,7 +708,7 @@ * auto_reload?: scalar|Param|null, * optimizations?: int|Param, * default_path?: scalar|Param|null, // The default path used to load templates. // Default: "%kernel.project_dir%/templates" - * file_name_pattern?: string|list, + * file_name_pattern?: Param|string|list, * paths?: array, * date?: array{ // The default format options used by the date filter. * format?: scalar|Param|null, // Default: "F j, Y H:i" @@ -736,9 +737,9 @@ * allow_if_all_abstain?: bool|Param, // Default: false * allow_if_equal_granted_denied?: bool|Param, // Default: true * }, - * password_hashers?: array, + * migrate_from?: Param|string|list, * hash_algorithm?: scalar|Param|null, // Name of hashing algorithm for PBKDF2 (i.e. sha256, sha512, etc..) See hash_algos() for a list of supported algorithms. // Default: "sha512" * key_length?: scalar|Param|null, // Default: 40 * ignore_case?: bool|Param, // Default: false @@ -752,12 +753,12 @@ * providers?: array, + * providers?: Param|string|list, * }, * memory?: array{ * users?: array, + * roles?: Param|string|list, * }>, * }, * ldap?: array{ @@ -766,7 +767,7 @@ * search_dn?: scalar|Param|null, // Default: null * search_password?: scalar|Param|null, // Default: null * extra_fields?: list, - * default_roles?: string|list, + * default_roles?: Param|string|list, * role_fetcher?: scalar|Param|null, // Default: null * uid_key?: scalar|Param|null, // Default: "sAMAccountName" * filter?: scalar|Param|null, // Default: "({uid_key}={user_identifier})" @@ -776,7 +777,7 @@ * firewalls?: array, + * methods?: Param|string|list, * security?: bool|Param, // Default: true * user_checker?: scalar|Param|null, // The UserChecker to use when authenticating users in this firewall. // Default: "security.user_checker" * request_matcher?: scalar|Param|null, @@ -795,8 +796,8 @@ * path?: scalar|Param|null, // Default: "/logout" * target?: scalar|Param|null, // Default: "/" * invalidate_session?: bool|Param, // Default: true - * clear_site_data?: string|list<"*"|"cache"|"cookies"|"storage"|"executionContexts"|Param>, - * delete_cookies?: string|array, + * delete_cookies?: Param|string|array, - * token_handler?: string|array{ + * token_extractors?: Param|string|list, + * token_handler?: Param|string|array{ * id?: scalar|Param|null, - * oidc_user_info?: string|array{ - * base_uri?: scalar|Param|null, // Base URI of the userinfo endpoint on the OIDC server, or the OIDC server URI to use the discovery (require "discovery" to be configured). + * oidc_user_info?: Param|string|array{ + * base_uri?: scalar|Param|null, // Base URI of the userinfo endpoint on the OIDC server, or the OIDC server URI to use the discovery (require "discovery" to be configured). The latter must end with a slash when it has a path, as the discovery path is resolved against it as a relative URL. * discovery?: array{ // Enable the OIDC discovery. * cache?: array{ * id?: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration. @@ -949,7 +950,7 @@ * }, * oidc?: array{ * discovery?: array{ // Enable the OIDC discovery. - * base_uri?: string|list, + * base_uri?: Param|string|list, * cache?: array{ * id?: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration. * }, @@ -992,10 +993,10 @@ * remember_me?: array{ * secret?: scalar|Param|null, // Default: "%kernel.secret%" * service?: scalar|Param|null, - * user_providers?: string|list, + * user_providers?: Param|string|list, * catch_exceptions?: bool|Param, // Default: true * signature_properties?: list, - * token_provider?: string|array{ + * token_provider?: Param|string|array{ * service?: scalar|Param|null, // The service ID of a custom remember-me token provider. * doctrine?: bool|array{ * enabled?: bool|Param, // Default: false @@ -1007,9 +1008,9 @@ * lifetime?: int|Param, // Default: 31536000 * path?: scalar|Param|null, // Default: "/" * domain?: scalar|Param|null, // Default: null - * secure?: true|false|"auto"|Param, // Default: false + * secure?: true|false|"auto"|Param, // Defaults to the value of "framework.session.cookie_secure", or to "auto". * httponly?: bool|Param, // Default: true - * samesite?: null|"lax"|"strict"|"none"|Param, // Default: null + * samesite?: null|"lax"|"strict"|"none"|Param, // Defaults to the value of "framework.session.cookie_samesite", or to "lax". * always_remember_me?: bool|Param, // Default: false * remember_me_parameter?: scalar|Param|null, // Default: "_remember_me" * }, @@ -1020,14 +1021,14 @@ * path?: scalar|Param|null, // Use the urldecoded format. // Default: null * host?: scalar|Param|null, // Default: null * port?: int|Param, // Default: null - * ips?: string|list, + * ips?: Param|string|list, * attributes?: array, * route?: scalar|Param|null, // Default: null - * methods?: string|list, + * methods?: Param|string|list, * allow_if?: scalar|Param|null, // Default: null - * roles?: string|list, + * roles?: Param|string|list, * }>, - * role_hierarchy?: array>, + * role_hierarchy?: array>, * } * @psalm-type NelmioCorsConfig = array{ * defaults?: array{ @@ -1069,10 +1070,10 @@ * inflector?: scalar|Param|null, // Specify an inflector to use. // Default: "api_platform.metadata.inflector" * validator?: array{ * serialize_payload_fields?: mixed, // Set to null to serialize all payload fields when a validation error is thrown, or set the fields you want to include explicitly. // Default: [] - * query_parameter_validation?: bool|Param, // Deprecated: Will be removed in API Platform 5.0. // Default: true + * query_parameter_validation?: bool|Param, // Deprecated: The "query_parameter_validation" configuration is deprecated and will be removed in API Platform 5.0. // Default: true * }, * jsonapi?: array{ - * use_iri_as_id?: bool|Param, // Set to false to use entity identifiers instead of IRIs as the "id" field in JSON:API responses. // Default: true + * use_iri_as_id?: bool|Param|null, // Set to false to use entity identifiers instead of IRIs as the "id" field in JSON:API responses. Defaults to true; this default will change to false in API Platform 5.0. // Default: null * allow_client_generated_id?: bool|Param, // Allow client-generated IDs on JSON:API POST per https://jsonapi.org/format/#crud-creating-client-ids. Off by default to prevent id spoofing on public endpoints. // Default: false * }, * eager_loading?: bool|array{ @@ -1089,9 +1090,10 @@ * enable_scalar?: bool|Param, // Enable Scalar API Reference // Default: true * enable_entrypoint?: bool|Param, // Enable the entrypoint // Default: true * enable_docs?: bool|Param, // Enable the docs // Default: true + * enable_head_request_optimization?: bool|Param, // Skip response body construction on HEAD requests so collections are not iterated. Disable to process HEAD identically to GET. // Default: true * enable_profiler?: bool|Param, // Enable the data collector and the WebProfilerBundle integration. // Default: true * enable_phpdoc_parser?: bool|Param, // Enable resource metadata collector using PHPStan PhpDocParser. // Default: true - * enable_link_security?: bool|Param, // Deprecated: This option is always enabled and will be removed in API Platform 5.0. // Enable security for Links (sub resources). // Default: true + * enable_link_security?: bool|Param, // Deprecated: The "enable_link_security" configuration is deprecated, this option is always enabled and will be removed in API Platform 5.0. // Enable security for Links (sub resources). // Default: true * collection?: array{ * exists_parameter_name?: scalar|Param|null, // The name of the query parameter to filter on nullable field values. // Default: "exists" * order?: scalar|Param|null, // The default order of results. // Default: "ASC" @@ -1154,6 +1156,7 @@ * }, * swagger?: array{ * persist_authorization?: bool|Param, // Persist the SwaggerUI Authorization in the localStorage. // Default: false + * with_credentials?: bool|Param, // Send credentials (cookies, authorization headers) on Swagger UI cross-origin requests (e.g. when running behind Cloudflare Access). // Default: false * versions?: list, * api_keys?: array * }, + * ... * } * @psalm-type MakerConfig = array{ * root_namespace?: scalar|Param|null, // Default: "App" diff --git a/config/routes.yaml b/config/routes.yaml index 41ef814..cef258c 100644 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -1,5 +1,11 @@ +# yaml-language-server: $schema=../vendor/symfony/routing/Loader/schema/routing.schema.json + +# This file is the entry point to configure the routes of your app. +# Methods with the #[Route] attribute are automatically imported. +# See also https://symfony.com/doc/current/routing.html + +# To list all registered routes, run the following command: +# bin/console debug:router + controllers: - resource: - path: ../src/Controller/ - namespace: App\Controller - type: attribute + resource: routing.controllers diff --git a/config/services.yaml b/config/services.yaml index 6b804c1..e066da2 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -1,5 +1,8 @@ +# yaml-language-server: $schema=../vendor/symfony/dependency-injection/Loader/schema/services.schema.json + # This file is the entry point to configure your own services. # Files in the packages/ subdirectory configure your dependencies. +# See also https://symfony.com/doc/current/service_container/import.html # Put parameters here that don't need to change on each machine where the app is deployed # https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index ca2f4d1..71a88b4 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -6,7 +6,7 @@ services: nginx: labels: - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.middlewares=ITKBasicAuth@file" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}.middlewares=ITKBasicAuth@file" mail: image: axllent/mailpit @@ -17,11 +17,11 @@ services: labels: - "traefik.enable=true" - "traefik.docker.network=frontend" - - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME}-http.rule=Host(`mail.${COMPOSE_SERVER_DOMAIN}`)" - - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME}-http.entrypoints=web" - - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME}-http.middlewares=redirect-to-https" + - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME:?}-http.rule=Host(`mail.${COMPOSE_SERVER_DOMAIN:?}`)" + - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME:?}-http.entrypoints=web" + - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME:?}-http.middlewares=redirect-to-https" - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" - - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME}.rule=Host(`mail.${COMPOSE_SERVER_DOMAIN}`)" - - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME}.entrypoints=websecure" - - "traefik.http.services.mail_${COMPOSE_PROJECT_NAME}.loadbalancer.server.port=8025" - - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME}.middlewares=ITKMailhogAuth@file" + - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME:?}.rule=Host(`mail.${COMPOSE_SERVER_DOMAIN:?}`)" + - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME:?}.entrypoints=websecure" + - "traefik.http.services.mail_${COMPOSE_PROJECT_NAME:?}.loadbalancer.server.port=8025" + - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME:?}.middlewares=ITKMailhogAuth@file" diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 898fd23..b61c9dc 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -1,23 +1,7 @@ services: phpfpm: - image: itkdev/php8.4-fpm:latest networks: - frontend - depends_on: - # - elasticsearch - - rabbit - - rabbit: - image: rabbitmq:3.12.4-management-alpine - networks: - - app - - frontend - ports: - - "15672" - environment: - - RABBITMQ_DEFAULT_USER=user - - RABBITMQ_DEFAULT_PASS=password - - RABBITMQ_ERLANG_COOKIE='d53f319cd7376f8f840aaf9889f315ab nginx: environment: @@ -33,7 +17,7 @@ services: - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=Host(`${COMPOSE_DOMAIN}`) && (PathPrefix(`${APP_PATH_PREFIX}`) || PathPrefix(`/_wdt`) || PathPrefix(`/_profiler`))" elasticsearch: - image: elasticsearch:8.19.18 + image: elasticsearch:8.19.23 networks: - app - frontend diff --git a/docker-compose.redirect.yml b/docker-compose.redirect.yml index e9ba157..2e7ac33 100644 --- a/docker-compose.redirect.yml +++ b/docker-compose.redirect.yml @@ -3,13 +3,13 @@ services: nginx: labels: # Add www before domain and set redirect to non-www - - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME}-http.rule=Host(`www.${COMPOSE_SERVER_DOMAIN}`)" - - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME}-http.entrypoints=web" - - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME}-http.middlewares=redirect-to-https,non_www" - - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME}.rule=Host(`www.${COMPOSE_SERVER_DOMAIN}`)" - - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME}.entrypoints=websecure" - - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME}.middlewares=non_www" + - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME:?}-http.rule=Host(`www.${COMPOSE_SERVER_DOMAIN:?}`)" + - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME:?}-http.entrypoints=web" + - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME:?}-http.middlewares=redirect-to-https,non_www" + - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME:?}.rule=Host(`www.${COMPOSE_SERVER_DOMAIN:?}`)" + - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME:?}.entrypoints=websecure" + - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME:?}.middlewares=non_www" - traefik.http.middlewares.non_www.redirectregex.regex=^(http|https)?://(?:www\.)?(.+) - - traefik.http.middlewares.non_www.redirectregex.replacement=https://$${2} + - traefik.http.middlewares.non_www.redirectregex.replacement=https://$${2:?} - traefik.http.middlewares.non_www.redirectregex.permanent=true diff --git a/docker-compose.server.override.yml b/docker-compose.server.override.yml index e796748..3211589 100644 --- a/docker-compose.server.override.yml +++ b/docker-compose.server.override.yml @@ -1,6 +1,5 @@ services: phpfpm: - image: itkdev/php8.4-fpm:alpine environment: - PHP_MEMORY_LIMIT=256M @@ -15,3 +14,5 @@ services: - "traefik.http.routers.${COMPOSE_PROJECT_NAME}-http.priority=200" - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=Host(`${COMPOSE_SERVER_DOMAIN}`) && PathPrefix(`${APP_PATH_PREFIX}`)" - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.priority=200" + # This app has no cron jobs. Let the importer on the same domain serve '/cron-metrics'. + - "traefik.http.routers.${COMPOSE_PROJECT_NAME}-metrics.priority=1" diff --git a/docker-compose.server.yml b/docker-compose.server.yml index dd16da4..19a4e89 100644 --- a/docker-compose.server.yml +++ b/docker-compose.server.yml @@ -8,7 +8,7 @@ networks: services: phpfpm: - image: itkdev/php8.4-fpm:alpine + image: itkdev/php8.5-fpm:alpine restart: unless-stopped networks: - app @@ -33,16 +33,20 @@ services: - ./.docker/nginx.conf:/etc/nginx/nginx.conf:ro - .:/app environment: - NGINX_FPM_SERVICE: ${COMPOSE_PROJECT_NAME}-phpfpm-1:9000 + NGINX_FPM_SERVICE: ${COMPOSE_PROJECT_NAME:?}-phpfpm-1:9000 + NGINX_CRON_METRICS: ${COMPOSE_PROJECT_NAME:?}-phpfpm-1:9746 NGINX_WEB_ROOT: /app/public NGINX_PORT: 8080 NGINX_MAX_BODY_SIZE: 5M labels: - "traefik.enable=true" - "traefik.docker.network=frontend" - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}-http.rule=Host(`${COMPOSE_SERVER_DOMAIN}`)" - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}-http.entrypoints=web" - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}-http.middlewares=redirect-to-https" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}-http.rule=Host(`${COMPOSE_SERVER_DOMAIN:?}`)" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}-http.entrypoints=web" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}-http.middlewares=redirect-to-https" - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=Host(`${COMPOSE_SERVER_DOMAIN}`)" - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.entrypoints=websecure" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}.rule=Host(`${COMPOSE_SERVER_DOMAIN:?}`)" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}.entrypoints=websecure" + # Cron-metrics protection. + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}-metrics.rule=Host(`${COMPOSE_SERVER_DOMAIN:?}`) && PathPrefix(`/cron-metrics`) " + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}-metrics.middlewares=ITKMetricsAuth@file" diff --git a/docker-compose.yml b/docker-compose.yml index cc88b52..4455116 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,7 +27,7 @@ services: #- ENCRYPT=1 # Uncomment to enable database encryption. phpfpm: - image: itkdev/php8.4-fpm:latest + image: itkdev/php8.5-fpm:latest user: ${COMPOSE_USER:-deploy} networks: - app @@ -39,7 +39,7 @@ services: - PHP_MEMORY_LIMIT=256M # Depending on the setup, you may have to remove --read-envelope-from from msmtp (cf. https://marlam.de/msmtp/msmtp.html) or use SMTP to send mail - PHP_SENDMAIL_PATH=/usr/bin/msmtp --host=mail --port=1025 --read-recipients --read-envelope-from - - DOCKER_HOST_DOMAIN=${COMPOSE_DOMAIN} + - DOCKER_HOST_DOMAIN=${COMPOSE_DOMAIN:?} - PHP_IDE_CONFIG=serverName=localhost depends_on: mariadb: @@ -60,17 +60,21 @@ services: - ./.docker/templates:/etc/nginx/templates:ro - .:/app environment: - NGINX_FPM_SERVICE: ${COMPOSE_PROJECT_NAME}-phpfpm-1:9000 + NGINX_FPM_SERVICE: ${COMPOSE_PROJECT_NAME:?}-phpfpm-1:9000 + NGINX_CRON_METRICS: ${COMPOSE_PROJECT_NAME:?}-phpfpm-1:9746 NGINX_WEB_ROOT: /app/public NGINX_PORT: 8080 NGINX_MAX_BODY_SIZE: 5M labels: - "traefik.enable=true" - "traefik.docker.network=frontend" - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=Host(`${COMPOSE_DOMAIN}`)" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}.rule=Host(`${COMPOSE_DOMAIN:?}`)" # HTTPS config - uncomment to enable redirect from :80 to :443 - # - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.middlewares=redirect-to-https" + # - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}.middlewares=redirect-to-https" # - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" + # Cron-metrics protection. + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}-metrics.rule=Host(`${COMPOSE_DOMAIN:?}`) && PathPrefix(`/cron-metrics`) " + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}-metrics.middlewares=ITKMetricsAuth@file" mail: image: axllent/mailpit @@ -83,8 +87,8 @@ services: labels: - "traefik.enable=true" - "traefik.docker.network=frontend" - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}mail.rule=Host(`mail-${COMPOSE_DOMAIN}`)" - - "traefik.http.services.${COMPOSE_PROJECT_NAME}mail.loadbalancer.server.port=8025" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}mail.rule=Host(`mail-${COMPOSE_DOMAIN:?}`)" + - "traefik.http.services.${COMPOSE_PROJECT_NAME:?}mail.loadbalancer.server.port=8025" # Code checks tools markdownlint: @@ -95,7 +99,7 @@ services: - ./:/md prettier: - # Prettier does not (yet, fcf. + # Prettier does not (yet, cf. # https://github.com/prettier/prettier/issues/15206) have an official # docker image. # https://hub.docker.com/r/jauderho/prettier is good candidate (cf. https://hub.docker.com/search?q=prettier&sort=updated_at&order=desc) diff --git a/phpstan.dist.neon b/phpstan.dist.neon index 695a209..0ec6d37 100644 --- a/phpstan.dist.neon +++ b/phpstan.dist.neon @@ -17,3 +17,17 @@ parameters: - identifier: missingType.iterableValue # The ID properties are set reflectively by API Platform. - '#Property App\\Api\\Dto\\[^\\]+::\$id is unused#' + # API Platform 4.4 deprecates #[ApiFilter] and replaces it with #[QueryParameter]. #[ApiFilter] is removed + # in API Platform 6.0. The change needs application code changes (the DTOs, and AbstractProvider::getFilters(), + # which reads the #[ApiFilter] attributes through api_platform.filter_locator). Remove this rule after the change. + - + identifier: attribute.deprecated + message: '#^Attribute class ApiPlatform\\Metadata\\ApiFilter is deprecated#' + path: src/Api/Dto/* + # pb30/phpstan-composer-analysis: report packages used directly but only installed transitively ("shadow + # dependencies") and dev packages used in production code. Unused/misplaced checks are off: bundles and + # extensions are used through config, not class references, so they would all be false positives. + composerAnalysis: + ignoreAllUnusedDeps: true + ignoreAllProdDepsInDev: true + disableExtensionsAnalysis: true diff --git a/public/index.php b/public/index.php index 9982c21..c0037a8 100644 --- a/public/index.php +++ b/public/index.php @@ -4,6 +4,6 @@ require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; -return function (array $context) { +return static function (array $context) { return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); }; diff --git a/public/spec.yaml b/public/spec.yaml index f3707c6..64c098b 100644 --- a/public/spec.yaml +++ b/public/spec.yaml @@ -1,4 +1,4 @@ -openapi: 3.1.0 +openapi: 3.2.0 info: title: 'Event Database' description: 'API for the Event Database' @@ -1800,9 +1800,7 @@ components: tags: type: array items: - type: - - string - - 'null' + type: string responses: { } parameters: { } examples: { } diff --git a/rector.php b/rector.php index 37ea484..9a2a485 100644 --- a/rector.php +++ b/rector.php @@ -13,7 +13,7 @@ // Coding style and import (`use`) management are owned by php-cs-fixer // (PostToolUse hook / coding standards), so Rector does not touch them. // - // Modernize to the language level declared in composer.json (PHP >= 8.3). + // Modernize to the language level declared in composer.json (PHP >= 8.5). ->withPhpSets() // Version-based upgrade + quality rules resolved from the installed package // versions (Symfony 7.4, PHPUnit 13). No domain Doctrine here — the entities diff --git a/src/Api/Dto/Vocabulary.php b/src/Api/Dto/Vocabulary.php index 8f88f82..7bbc618 100644 --- a/src/Api/Dto/Vocabulary.php +++ b/src/Api/Dto/Vocabulary.php @@ -54,6 +54,9 @@ )] readonly class Vocabulary { + /** + * @param list $tags + */ public function __construct( public string $name, #[ApiProperty( diff --git a/src/Command/ApiKeysAddCommand.php b/src/Command/ApiKeysAddCommand.php index a343f19..6cc0c7b 100644 --- a/src/Command/ApiKeysAddCommand.php +++ b/src/Command/ApiKeysAddCommand.php @@ -28,7 +28,7 @@ class ApiKeysAddCommand extends Command private const string ENV_LINE_PATTERN = '/^APP_API_KEYS=(?:\'[^\']*\'|"(?:[^"\\\\]|\\\\.)*"|.*)$/m'; public function __construct( - #[Autowire('%kernel.project_dir%')] + #[Autowire(param: 'kernel.project_dir')] private readonly string $projectDir, ) { parent::__construct(); @@ -187,7 +187,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int */ private function parseApiKeys(string $contents): array { - $value = (new Dotenv())->parse($contents)[self::ENV_VAR] ?? '[]'; + $value = new Dotenv()->parse($contents)[self::ENV_VAR] ?? '[]'; return json_decode($value, true, 512, JSON_THROW_ON_ERROR); } diff --git a/src/Service/ElasticSearch/ElasticIndexException.php b/src/Service/ElasticSearch/ElasticIndexException.php index 7b0074d..3c1aa3c 100644 --- a/src/Service/ElasticSearch/ElasticIndexException.php +++ b/src/Service/ElasticSearch/ElasticIndexException.php @@ -35,7 +35,7 @@ private function parse400(string $message): string $message = json_decode($message, false, 512, JSON_THROW_ON_ERROR); // Convert snake_case type to readable format (e.g., "parse_exception" -> "Parse exception") - $type = (new UnicodeString($message->error->root_cause[0]->type)) + $type = new UnicodeString($message->error->root_cause[0]->type) ->replace('_', ' ') ->title() ->toString(); diff --git a/symfony.lock b/symfony.lock index f948f8f..7100066 100644 --- a/symfony.lock +++ b/symfony.lock @@ -19,16 +19,16 @@ "repo": "github.com/symfony/recipes", "branch": "main", "version": "1.0", - "ref": "87424683adc81d7dc305eefec1fced883084aab9" + "ref": "fdd756167454623e21f1d769c5b814b243782a67" } }, "friendsofphp/php-cs-fixer": { - "version": "3.40", + "version": "3.95", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "3.0", - "ref": "be2103eb4a20942e28a6dd87736669b757132435" + "version": "3.39", + "ref": "97aaf9026490db73b86c23d49e5774bc89d2b232" }, "files": [ ".php-cs-fixer.dist.php" @@ -71,18 +71,18 @@ ] }, "phpunit/phpunit": { - "version": "12.3", + "version": "13.4", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", "version": "11.1", - "ref": "c6658a60fc9d594805370eacdf542c3d6b5c0869" + "ref": "ca0bc067abfb40a8de1b2561b96cbfc2b833c314" }, "files": [ ".env.test", + "bin/phpunit", "phpunit.dist.xml", - "tests/bootstrap.php", - "bin/phpunit" + "tests/bootstrap.php" ] }, "symfony/console": { @@ -111,12 +111,12 @@ ] }, "symfony/framework-bundle": { - "version": "7.3", + "version": "7.4", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "7.3", - "ref": "5a1497d539f691b96afd45ae397ce5fe30beb4b9" + "version": "7.4", + "ref": "5ea2ed9cd29ca8fc2cb9bca9cb7b7e0a8d2be1dc" }, "files": [ ".editorconfig", @@ -152,12 +152,12 @@ ] }, "symfony/routing": { - "version": "7.3", + "version": "7.4", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "7.0", - "ref": "21b72649d5622d8f7da329ffb5afb232a023619d" + "version": "7.4", + "ref": "bc94c4fd86f393f3ab3947c18b830ea343e51ded" }, "files": [ "config/packages/routing.yaml", @@ -165,12 +165,12 @@ ] }, "symfony/security-bundle": { - "version": "6.4", + "version": "7.4", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "6.4", - "ref": "2ae08430db28c8eb4476605894296c82a642028f" + "version": "7.4", + "ref": "02d47835088cd548c827e5d53b3c4b361bca3390" }, "files": [ "config/packages/security.yaml", @@ -178,12 +178,12 @@ ] }, "symfony/twig-bundle": { - "version": "6.4", + "version": "7.4", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", "version": "6.4", - "ref": "cab5fd2a13a45c266d45a7d9337e28dee6272877" + "ref": "06dacf16872358cb1f2494e089070ff2d045233a" }, "files": [ "config/packages/twig.yaml", @@ -216,12 +216,12 @@ ] }, "vincentlanglet/twig-cs-fixer": { - "version": "3.7", + "version": "4.1", "recipe": { "repo": "github.com/symfony/recipes-contrib", "branch": "main", "version": "3.0", - "ref": "d42582ae1bce86fd43491d6264c738b0867f8ffe" + "ref": "0a2d420aa6554f632804a3f21624e16314fe8588" } } } diff --git a/tests/ApiPlatform/AbstractApiTestCase.php b/tests/ApiPlatform/AbstractApiTestCase.php index 36075f9..efd7fd7 100644 --- a/tests/ApiPlatform/AbstractApiTestCase.php +++ b/tests/ApiPlatform/AbstractApiTestCase.php @@ -10,6 +10,7 @@ abstract class AbstractApiTestCase extends ApiTestCase { + #[\Override] protected static ?bool $alwaysBootKernel = false; protected static string $requestPath; @@ -52,7 +53,7 @@ protected function get(array $query, ?string $path = null, bool $authenticated = protected static function formatDateTime(string $datetime): string { - return (new \DateTimeImmutable($datetime))->format(\DateTimeImmutable::ATOM); + return new \DateTimeImmutable($datetime)->format(\DateTimeImmutable::ATOM); } /** diff --git a/tests/ApiPlatform/AuthenticationTest.php b/tests/ApiPlatform/AuthenticationTest.php index 17c391e..d209526 100644 --- a/tests/ApiPlatform/AuthenticationTest.php +++ b/tests/ApiPlatform/AuthenticationTest.php @@ -12,6 +12,7 @@ */ final class AuthenticationTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/events'; #[DataProvider('protectedEndpointProvider')] diff --git a/tests/ApiPlatform/Consumer/AarhusguidenContractTest.php b/tests/ApiPlatform/Consumer/AarhusguidenContractTest.php index 99b7146..27120c8 100644 --- a/tests/ApiPlatform/Consumer/AarhusguidenContractTest.php +++ b/tests/ApiPlatform/Consumer/AarhusguidenContractTest.php @@ -23,6 +23,7 @@ */ final class AarhusguidenContractTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/daily_occurrences'; // Calendar / tag view: public events carrying a tag, within a date window, diff --git a/tests/ApiPlatform/Consumer/Os2displayContractTest.php b/tests/ApiPlatform/Consumer/Os2displayContractTest.php index 5811f6b..a6a9db8 100644 --- a/tests/ApiPlatform/Consumer/Os2displayContractTest.php +++ b/tests/ApiPlatform/Consumer/Os2displayContractTest.php @@ -30,6 +30,7 @@ */ final class Os2displayContractTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/occurrences'; // Subscription poster: upcoming occurrences (end[gt]) for a tag/location. diff --git a/tests/ApiPlatform/Contract/CollectionContractTest.php b/tests/ApiPlatform/Contract/CollectionContractTest.php index 7c65a30..95b5fd6 100644 --- a/tests/ApiPlatform/Contract/CollectionContractTest.php +++ b/tests/ApiPlatform/Contract/CollectionContractTest.php @@ -19,6 +19,7 @@ */ final class CollectionContractTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/events'; #[DataProvider('collectionProvider')] diff --git a/tests/ApiPlatform/Contract/ContentNegotiationContractTest.php b/tests/ApiPlatform/Contract/ContentNegotiationContractTest.php index a075060..643da98 100644 --- a/tests/ApiPlatform/Contract/ContentNegotiationContractTest.php +++ b/tests/ApiPlatform/Contract/ContentNegotiationContractTest.php @@ -16,6 +16,7 @@ */ final class ContentNegotiationContractTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/events'; public function testLdJsonIsSupported(): void @@ -23,7 +24,7 @@ public function testLdJsonIsSupported(): void $response = $this->requestWithAccept('application/ld+json'); $this->assertSame(Response::HTTP_OK, $response->getStatusCode()); - $this->assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8'); + $this->assertResponseHeaderSame('content-type', 'application/ld+json'); } public function testPlainJsonIsNotAcceptable(): void diff --git a/tests/ApiPlatform/Contract/DateFormatContractTest.php b/tests/ApiPlatform/Contract/DateFormatContractTest.php index eb49f13..c0e9e72 100644 --- a/tests/ApiPlatform/Contract/DateFormatContractTest.php +++ b/tests/ApiPlatform/Contract/DateFormatContractTest.php @@ -13,6 +13,7 @@ */ final class DateFormatContractTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/events'; private const string ISO_8601_OFFSET = '/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2}$/'; diff --git a/tests/ApiPlatform/Contract/ErrorContractTest.php b/tests/ApiPlatform/Contract/ErrorContractTest.php index d5656a6..56a6111 100644 --- a/tests/ApiPlatform/Contract/ErrorContractTest.php +++ b/tests/ApiPlatform/Contract/ErrorContractTest.php @@ -22,6 +22,7 @@ */ final class ErrorContractTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/events'; public function testUnauthenticatedErrorShape(): void diff --git a/tests/ApiPlatform/Contract/ItemContractTest.php b/tests/ApiPlatform/Contract/ItemContractTest.php index 3c6ec51..045cb80 100644 --- a/tests/ApiPlatform/Contract/ItemContractTest.php +++ b/tests/ApiPlatform/Contract/ItemContractTest.php @@ -21,6 +21,7 @@ */ final class ItemContractTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/events'; #[DataProvider('collectionWrappedItemProvider')] diff --git a/tests/ApiPlatform/DailyOccurrencesFilterTest.php b/tests/ApiPlatform/DailyOccurrencesFilterTest.php index 1b9efb6..db92321 100644 --- a/tests/ApiPlatform/DailyOccurrencesFilterTest.php +++ b/tests/ApiPlatform/DailyOccurrencesFilterTest.php @@ -14,6 +14,7 @@ */ final class DailyOccurrencesFilterTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/daily_occurrences'; #[DataProvider('getDailyOccurrencesProvider')] diff --git a/tests/ApiPlatform/DailyOccurrencesTest.php b/tests/ApiPlatform/DailyOccurrencesTest.php index c7a7883..826d711 100644 --- a/tests/ApiPlatform/DailyOccurrencesTest.php +++ b/tests/ApiPlatform/DailyOccurrencesTest.php @@ -13,13 +13,17 @@ final class DailyOccurrencesTest extends AbstractApiTestCase use GetEntitiesTestTrait; use GetItemTestTrait; + #[\Override] protected static string $requestPath = '/api/v2/daily_occurrences'; + #[\Override] protected static string $resourceClass = DailyOccurrence::class; // Members are the raw Elasticsearch _source with no @id/@type, so API // Platform's self-generated collection schema does not apply (see D6). + #[\Override] protected static bool $assertsGeneratedCollectionSchema = false; + #[\Override] protected static int|string $itemId = 10; } diff --git a/tests/ApiPlatform/EventsFilterTest.php b/tests/ApiPlatform/EventsFilterTest.php index 32b5e0d..d906dab 100644 --- a/tests/ApiPlatform/EventsFilterTest.php +++ b/tests/ApiPlatform/EventsFilterTest.php @@ -15,6 +15,7 @@ */ final class EventsFilterTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/events'; #[DataProvider('getEventsProvider')] diff --git a/tests/ApiPlatform/EventsTest.php b/tests/ApiPlatform/EventsTest.php index 6b0f0d4..0c1c154 100644 --- a/tests/ApiPlatform/EventsTest.php +++ b/tests/ApiPlatform/EventsTest.php @@ -16,13 +16,17 @@ final class EventsTest extends AbstractApiTestCase use GetEntitiesTestTrait; use GetItemTestTrait; + #[\Override] protected static string $requestPath = '/api/v2/events'; + #[\Override] protected static string $resourceClass = Event::class; // Members are the raw Elasticsearch _source with no @id/@type, so API // Platform's self-generated collection schema does not apply (see D6). + #[\Override] protected static bool $assertsGeneratedCollectionSchema = false; + #[\Override] protected static int|string $itemId = 7; } diff --git a/tests/ApiPlatform/FilterErrorTest.php b/tests/ApiPlatform/FilterErrorTest.php index 8982021..daf88ec 100644 --- a/tests/ApiPlatform/FilterErrorTest.php +++ b/tests/ApiPlatform/FilterErrorTest.php @@ -19,6 +19,7 @@ */ final class FilterErrorTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/events'; #[DataProvider('invalidDateRangeProvider')] diff --git a/tests/ApiPlatform/LocationsFilterTest.php b/tests/ApiPlatform/LocationsFilterTest.php index 6866c51..a3c44b6 100644 --- a/tests/ApiPlatform/LocationsFilterTest.php +++ b/tests/ApiPlatform/LocationsFilterTest.php @@ -14,6 +14,7 @@ */ final class LocationsFilterTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/locations'; #[DataProvider('getLocationsProvider')] diff --git a/tests/ApiPlatform/LocationsTest.php b/tests/ApiPlatform/LocationsTest.php index 4db86b7..bf43a18 100644 --- a/tests/ApiPlatform/LocationsTest.php +++ b/tests/ApiPlatform/LocationsTest.php @@ -13,13 +13,17 @@ final class LocationsTest extends AbstractApiTestCase use GetEntitiesTestTrait; use GetItemTestTrait; + #[\Override] protected static string $requestPath = '/api/v2/locations'; + #[\Override] protected static string $resourceClass = Location::class; // Members are the raw Elasticsearch _source with no @id/@type, so API // Platform's self-generated collection schema does not apply (see D6). + #[\Override] protected static bool $assertsGeneratedCollectionSchema = false; + #[\Override] protected static int|string $itemId = 4; } diff --git a/tests/ApiPlatform/OccurrencesFilterTest.php b/tests/ApiPlatform/OccurrencesFilterTest.php index 6018da4..70993ef 100644 --- a/tests/ApiPlatform/OccurrencesFilterTest.php +++ b/tests/ApiPlatform/OccurrencesFilterTest.php @@ -15,6 +15,7 @@ */ final class OccurrencesFilterTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/occurrences'; #[DataProvider('getOccurrencesProvider')] diff --git a/tests/ApiPlatform/OccurrencesTest.php b/tests/ApiPlatform/OccurrencesTest.php index b516b84..a021486 100644 --- a/tests/ApiPlatform/OccurrencesTest.php +++ b/tests/ApiPlatform/OccurrencesTest.php @@ -13,13 +13,17 @@ final class OccurrencesTest extends AbstractApiTestCase use GetEntitiesTestTrait; use GetItemTestTrait; + #[\Override] protected static string $requestPath = '/api/v2/occurrences'; + #[\Override] protected static string $resourceClass = Occurrence::class; // Members are the raw Elasticsearch _source with no @id/@type, so API // Platform's self-generated collection schema does not apply (see D6). + #[\Override] protected static bool $assertsGeneratedCollectionSchema = false; + #[\Override] protected static int|string $itemId = 10; } diff --git a/tests/ApiPlatform/OrganizationsFilterTest.php b/tests/ApiPlatform/OrganizationsFilterTest.php index 73c5251..b84dcfc 100644 --- a/tests/ApiPlatform/OrganizationsFilterTest.php +++ b/tests/ApiPlatform/OrganizationsFilterTest.php @@ -14,6 +14,7 @@ */ final class OrganizationsFilterTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/organizations'; #[DataProvider('getOrganizationsProvider')] diff --git a/tests/ApiPlatform/OrganizationsTest.php b/tests/ApiPlatform/OrganizationsTest.php index 92e7eb6..bef3062 100644 --- a/tests/ApiPlatform/OrganizationsTest.php +++ b/tests/ApiPlatform/OrganizationsTest.php @@ -13,13 +13,17 @@ final class OrganizationsTest extends AbstractApiTestCase use GetEntitiesTestTrait; use GetItemTestTrait; + #[\Override] protected static string $requestPath = '/api/v2/organizations'; + #[\Override] protected static string $resourceClass = Organization::class; // Members are the raw Elasticsearch _source with no @id/@type, so API // Platform's self-generated collection schema does not apply (see D6). + #[\Override] protected static bool $assertsGeneratedCollectionSchema = false; + #[\Override] protected static int|string $itemId = 9; } diff --git a/tests/ApiPlatform/PaginationTest.php b/tests/ApiPlatform/PaginationTest.php index 46d4adb..5e23950 100644 --- a/tests/ApiPlatform/PaginationTest.php +++ b/tests/ApiPlatform/PaginationTest.php @@ -12,6 +12,7 @@ */ final class PaginationTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/events'; #[DataProvider('resourceProvider')] diff --git a/tests/ApiPlatform/SortTest.php b/tests/ApiPlatform/SortTest.php index 7e707ad..bac6a23 100644 --- a/tests/ApiPlatform/SortTest.php +++ b/tests/ApiPlatform/SortTest.php @@ -16,6 +16,7 @@ */ final class SortTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/events'; public function testEventsAreSortedByTitleAscending(): void diff --git a/tests/ApiPlatform/TagsFilterTest.php b/tests/ApiPlatform/TagsFilterTest.php index f1a6d74..dc82b6e 100644 --- a/tests/ApiPlatform/TagsFilterTest.php +++ b/tests/ApiPlatform/TagsFilterTest.php @@ -15,6 +15,7 @@ */ final class TagsFilterTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/tags'; #[DataProvider('getTagsProvider')] diff --git a/tests/ApiPlatform/TagsTest.php b/tests/ApiPlatform/TagsTest.php index c3b0610..b958e32 100644 --- a/tests/ApiPlatform/TagsTest.php +++ b/tests/ApiPlatform/TagsTest.php @@ -16,11 +16,15 @@ final class TagsTest extends AbstractApiTestCase use GetEntitiesTestTrait; use GetItemTestTrait; + #[\Override] protected static string $requestPath = '/api/v2/tags'; + #[\Override] protected static string $resourceClass = Tag::class; + #[\Override] protected static int|string $itemId = 'aros'; + #[\Override] protected static int|string $unknownItemId = 'no-such-tag-slug'; } diff --git a/tests/ApiPlatform/Trait/GetEntitiesTestTrait.php b/tests/ApiPlatform/Trait/GetEntitiesTestTrait.php index eeb1880..1cc4153 100644 --- a/tests/ApiPlatform/Trait/GetEntitiesTestTrait.php +++ b/tests/ApiPlatform/Trait/GetEntitiesTestTrait.php @@ -17,7 +17,7 @@ public function testGetEntities(): void $response = $this->get([]); $this->assertResponseStatusCodeSame(Response::HTTP_OK); - $this->assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8'); + $this->assertResponseHeaderSame('content-type', 'application/ld+json'); $this->assertJson($response->getContent()); $data = $response->toArray(); diff --git a/tests/ApiPlatform/Trait/GetItemTestTrait.php b/tests/ApiPlatform/Trait/GetItemTestTrait.php index 6102c5e..24bbfd4 100644 --- a/tests/ApiPlatform/Trait/GetItemTestTrait.php +++ b/tests/ApiPlatform/Trait/GetItemTestTrait.php @@ -18,7 +18,7 @@ public function testGetItem(): void $response = $this->get([], $path); $this->assertResponseStatusCodeSame(Response::HTTP_OK); - $this->assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8'); + $this->assertResponseHeaderSame('content-type', 'application/ld+json'); $this->assertJson($response->getContent()); $this->assertMatchesResourceItemJsonSchema(static::$resourceClass); } diff --git a/tests/ApiPlatform/VocabulariesFilterTest.php b/tests/ApiPlatform/VocabulariesFilterTest.php index 51533e0..3870fff 100644 --- a/tests/ApiPlatform/VocabulariesFilterTest.php +++ b/tests/ApiPlatform/VocabulariesFilterTest.php @@ -15,6 +15,7 @@ */ final class VocabulariesFilterTest extends AbstractApiTestCase { + #[\Override] protected static string $requestPath = '/api/v2/vocabularies'; #[DataProvider('getVocabulariesProvider')] diff --git a/tests/ApiPlatform/VocabulariesTest.php b/tests/ApiPlatform/VocabulariesTest.php index 5f86b89..b569a95 100644 --- a/tests/ApiPlatform/VocabulariesTest.php +++ b/tests/ApiPlatform/VocabulariesTest.php @@ -16,11 +16,15 @@ final class VocabulariesTest extends AbstractApiTestCase use GetEntitiesTestTrait; use GetItemTestTrait; + #[\Override] protected static string $requestPath = '/api/v2/vocabularies'; + #[\Override] protected static string $resourceClass = Vocabulary::class; + #[\Override] protected static int|string $itemId = 'aarhusguiden'; + #[\Override] protected static int|string $unknownItemId = 'no-such-vocabulary-slug'; } diff --git a/tests/Command/ApiKeysAddCommandTest.php b/tests/Command/ApiKeysAddCommandTest.php index b3389ec..e5c1b79 100644 --- a/tests/Command/ApiKeysAddCommandTest.php +++ b/tests/Command/ApiKeysAddCommandTest.php @@ -60,7 +60,7 @@ public function testReplacesMultiLineValueAndKeepsOtherLines(): void $this->assertFileDoesNotExist($this->dir.'/.env.local.backup'); $this->assertFileDoesNotExist($this->dir.'/.env.local.temp'); - $env = (new Dotenv())->parse((string) file_get_contents($this->dir.'/.env.local')); + $env = new Dotenv()->parse((string) file_get_contents($this->dir.'/.env.local')); $this->assertSame('http://elasticsearch:9200', $env['INDEX_URL']); $this->assertSame('value', $env['OTHER']); $keys = $this->keys(); @@ -181,7 +181,7 @@ private function runCommand(string $username, array $answers = []): CommandTeste */ private function keys(): array { - $env = (new Dotenv())->parse((string) file_get_contents($this->dir.'/.env.local')); + $env = new Dotenv()->parse((string) file_get_contents($this->dir.'/.env.local')); return json_decode((string) $env['APP_API_KEYS'], true, 512, JSON_THROW_ON_ERROR); } diff --git a/tests/Unit/Service/ElasticSearch/SearchParamsBuilderTest.php b/tests/Unit/Service/ElasticSearch/SearchParamsBuilderTest.php index 7ba3c20..70ecf33 100644 --- a/tests/Unit/Service/ElasticSearch/SearchParamsBuilderTest.php +++ b/tests/Unit/Service/ElasticSearch/SearchParamsBuilderTest.php @@ -33,7 +33,7 @@ private function withFilters(array $clauses): array // Goal: with no filters the query defaults to match_all and pagination/sort are set. public function testDefaultsToMatchAllWithPagination(): void { - $params = (new SearchParamsBuilder())->buildParams(IndexName::Events->value, $this->noFilters(), 20, 5); + $params = new SearchParamsBuilder()->buildParams(IndexName::Events->value, $this->noFilters(), 20, 5); $this->assertSame(IndexName::Events->value, $params['index']); $this->assertEquals(['match_all' => (object) []], $params['body']['query']); @@ -45,7 +45,7 @@ public function testDefaultsToMatchAllWithPagination(): void // Goal: a single associative clause (e.g. a MatchFilter hit) is wrapped in bool/must. public function testSingleClauseWrappedInBoolMust(): void { - $params = (new SearchParamsBuilder())->buildParams( + $params = new SearchParamsBuilder()->buildParams( IndexName::Events->value, $this->withFilters([['match' => ['title' => 'x']]]), 0, @@ -59,7 +59,7 @@ public function testSingleClauseWrappedInBoolMust(): void // nested under numeric keys. public function testListClauseIsFlattenedIntoMust(): void { - $params = (new SearchParamsBuilder())->buildParams( + $params = new SearchParamsBuilder()->buildParams( IndexName::Events->value, $this->withFilters([[['terms' => ['organizer.entityId' => ['9'], 'boost' => 1.0]]]]), 0, @@ -72,7 +72,7 @@ public function testListClauseIsFlattenedIntoMust(): void // Goal: multiple clauses accumulate under a single bool/must. public function testMultipleClausesCombine(): void { - $params = (new SearchParamsBuilder())->buildParams( + $params = new SearchParamsBuilder()->buildParams( IndexName::Events->value, $this->withFilters([ ['match' => ['title' => 'x']], @@ -92,7 +92,7 @@ public function testMultipleClausesCombine(): void #[DataProvider('sortProvider')] public function testSortPerIndex(string $index, array $expectedSort): void { - $params = (new SearchParamsBuilder())->buildParams($index, $this->noFilters(), 0, 10); + $params = new SearchParamsBuilder()->buildParams($index, $this->noFilters(), 0, 10); $this->assertSame($expectedSort, $params['body']['sort']); } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 8e0530d..9d37f70 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -4,10 +4,10 @@ use Symfony\Component\Dotenv\Dotenv; -require dirname(__DIR__).'/vendor/autoload.php'; +require __DIR__.'/../vendor/autoload.php'; if (method_exists(Dotenv::class, 'bootEnv')) { - (new Dotenv())->bootEnv(dirname(__DIR__).'/.env'); + new Dotenv()->bootEnv(__DIR__.'/../.env'); } if ($_SERVER['APP_DEBUG']) {