diff --git a/.gitattributes b/.gitattributes index 16fef4dad..f086a4c83 100644 --- a/.gitattributes +++ b/.gitattributes @@ -18,6 +18,7 @@ /phpbench.json export-ignore /phpunit.xml.dist export-ignore /rector.php export-ignore +/structarmed.php export-ignore /renovate.json5 export-ignore *.stub linguist-language=PHP diff --git a/.github/workflows/quality-assurance.yml b/.github/workflows/quality-assurance.yml index 5d4963a94..a043cb278 100644 --- a/.github/workflows/quality-assurance.yml +++ b/.github/workflows/quality-assurance.yml @@ -45,3 +45,6 @@ jobs: - name: Running Rector run: php vendor/bin/rector --dry-run + + - name: Running StructArmed + run: php vendor/bin/structarmed analyze diff --git a/composer.json b/composer.json index d984674c5..4d6eb3c90 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,8 @@ "rector/rector": "^2.0", "phpbench/phpbench": "^1.3", "psr/http-message": "^2.0", - "php-ds/php-ds": "^1.8" + "php-ds/php-ds": "^1.8", + "boundwize/structarmed": "^0.17.9" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index cfb1a5108..4e7b0980b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,21 +4,21 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9ab8578e6511ca20718a66b1793ed10b", + "content-hash": "269b2d5a20f78cc9960496a746703d64", "packages": [], "packages-dev": [ { "name": "amphp/amp", - "version": "v3.1.1", + "version": "v3.1.3", "source": { "type": "git", "url": "https://github.com/amphp/amp.git", - "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f" + "reference": "73c38b323ff8d790abf0f76c56fcc892bda4111a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/fa0ab33a6f47a82929c38d03ca47ebb71086a93f", - "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f", + "url": "https://api.github.com/repos/amphp/amp/zipball/73c38b323ff8d790abf0f76c56fcc892bda4111a", + "reference": "73c38b323ff8d790abf0f76c56fcc892bda4111a", "shasum": "" }, "require": { @@ -28,7 +28,7 @@ "require-dev": { "amphp/php-cs-fixer-config": "^2", "phpunit/phpunit": "^9", - "psalm/phar": "5.23.1" + "psalm/phar": "6.16.1" }, "type": "library", "autoload": { @@ -78,7 +78,7 @@ ], "support": { "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v3.1.1" + "source": "https://github.com/amphp/amp/tree/v3.1.3" }, "funding": [ { @@ -86,7 +86,7 @@ "type": "github" } ], - "time": "2025-08-27T21:42:00+00:00" + "time": "2026-07-19T17:59:20+00:00" }, { "name": "amphp/byte-stream", @@ -230,16 +230,16 @@ }, { "name": "amphp/dns", - "version": "v2.4.0", + "version": "v2.4.1", "source": { "type": "git", "url": "https://github.com/amphp/dns.git", - "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71" + "reference": "ec5948bfafac808f410406e18bc7b52a2d4629b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/dns/zipball/78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", - "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", + "url": "https://api.github.com/repos/amphp/dns/zipball/ec5948bfafac808f410406e18bc7b52a2d4629b7", + "reference": "ec5948bfafac808f410406e18bc7b52a2d4629b7", "shasum": "" }, "require": { @@ -258,7 +258,7 @@ "amphp/php-cs-fixer-config": "^2", "amphp/phpunit-util": "^3", "phpunit/phpunit": "^9", - "psalm/phar": "5.20" + "psalm/phar": "6.16.1" }, "type": "library", "autoload": { @@ -307,7 +307,7 @@ ], "support": { "issues": "https://github.com/amphp/dns/issues", - "source": "https://github.com/amphp/dns/tree/v2.4.0" + "source": "https://github.com/amphp/dns/tree/v2.4.1" }, "funding": [ { @@ -315,20 +315,20 @@ "type": "github" } ], - "time": "2025-01-19T15:43:40+00:00" + "time": "2026-07-26T17:53:54+00:00" }, { "name": "amphp/parallel", - "version": "v2.3.3", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/amphp/parallel.git", - "reference": "296b521137a54d3a02425b464e5aee4c93db2c60" + "reference": "37f5b2754fadc229c00f9416bd68fb8d04529a81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/parallel/zipball/296b521137a54d3a02425b464e5aee4c93db2c60", - "reference": "296b521137a54d3a02425b464e5aee4c93db2c60", + "url": "https://api.github.com/repos/amphp/parallel/zipball/37f5b2754fadc229c00f9416bd68fb8d04529a81", + "reference": "37f5b2754fadc229c00f9416bd68fb8d04529a81", "shasum": "" }, "require": { @@ -348,7 +348,7 @@ "amphp/php-cs-fixer-config": "^2", "amphp/phpunit-util": "^3", "phpunit/phpunit": "^9", - "psalm/phar": "^5.18" + "psalm/phar": "6.16.1" }, "type": "library", "autoload": { @@ -391,7 +391,7 @@ ], "support": { "issues": "https://github.com/amphp/parallel/issues", - "source": "https://github.com/amphp/parallel/tree/v2.3.3" + "source": "https://github.com/amphp/parallel/tree/v2.4.0" }, "funding": [ { @@ -399,7 +399,7 @@ "type": "github" } ], - "time": "2025-11-15T06:23:42+00:00" + "time": "2026-05-16T16:54:01+00:00" }, { "name": "amphp/parser", @@ -465,16 +465,16 @@ }, { "name": "amphp/pipeline", - "version": "v1.2.3", + "version": "v1.2.7", "source": { "type": "git", "url": "https://github.com/amphp/pipeline.git", - "reference": "7b52598c2e9105ebcddf247fc523161581930367" + "reference": "cf2d67696c2015ea7c7fd8f6ec5f8ed7c2d17c17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/pipeline/zipball/7b52598c2e9105ebcddf247fc523161581930367", - "reference": "7b52598c2e9105ebcddf247fc523161581930367", + "url": "https://api.github.com/repos/amphp/pipeline/zipball/cf2d67696c2015ea7c7fd8f6ec5f8ed7c2d17c17", + "reference": "cf2d67696c2015ea7c7fd8f6ec5f8ed7c2d17c17", "shasum": "" }, "require": { @@ -486,7 +486,7 @@ "amphp/php-cs-fixer-config": "^2", "amphp/phpunit-util": "^3", "phpunit/phpunit": "^9", - "psalm/phar": "^5.18" + "psalm/phar": "6.16.1" }, "type": "library", "autoload": { @@ -520,7 +520,7 @@ ], "support": { "issues": "https://github.com/amphp/pipeline/issues", - "source": "https://github.com/amphp/pipeline/tree/v1.2.3" + "source": "https://github.com/amphp/pipeline/tree/v1.2.7" }, "funding": [ { @@ -528,20 +528,20 @@ "type": "github" } ], - "time": "2025-03-16T16:33:53+00:00" + "time": "2026-07-26T14:50:43+00:00" }, { "name": "amphp/process", - "version": "v2.0.3", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/amphp/process.git", - "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d" + "reference": "583959df17d00304ad7b0b32285373f985935643" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/process/zipball/52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d", - "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d", + "url": "https://api.github.com/repos/amphp/process/zipball/583959df17d00304ad7b0b32285373f985935643", + "reference": "583959df17d00304ad7b0b32285373f985935643", "shasum": "" }, "require": { @@ -555,7 +555,7 @@ "amphp/php-cs-fixer-config": "^2", "amphp/phpunit-util": "^3", "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" + "psalm/phar": "6.16.1" }, "type": "library", "autoload": { @@ -588,7 +588,7 @@ "homepage": "https://amphp.org/process", "support": { "issues": "https://github.com/amphp/process/issues", - "source": "https://github.com/amphp/process/tree/v2.0.3" + "source": "https://github.com/amphp/process/tree/v2.1.0" }, "funding": [ { @@ -596,28 +596,31 @@ "type": "github" } ], - "time": "2024-04-19T03:13:44+00:00" + "time": "2026-05-31T15:11:55+00:00" }, { "name": "amphp/serialization", - "version": "v1.0.0", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/amphp/serialization.git", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" + "reference": "fdf2834d78cebb0205fb2672676c1b1eb84371f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", + "url": "https://api.github.com/repos/amphp/serialization/zipball/fdf2834d78cebb0205fb2672676c1b1eb84371f0", + "reference": "fdf2834d78cebb0205fb2672676c1b1eb84371f0", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.4" }, "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "phpunit/phpunit": "^9 || ^8 || ^7" + "amphp/php-cs-fixer-config": "^2", + "ext-json": "*", + "ext-zlib": "*", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" }, "type": "library", "autoload": { @@ -652,22 +655,28 @@ ], "support": { "issues": "https://github.com/amphp/serialization/issues", - "source": "https://github.com/amphp/serialization/tree/master" + "source": "https://github.com/amphp/serialization/tree/v1.1.0" }, - "time": "2020-03-25T21:39:07+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2026-04-05T15:59:53+00:00" }, { "name": "amphp/socket", - "version": "v2.3.1", + "version": "v2.4.1", "source": { "type": "git", "url": "https://github.com/amphp/socket.git", - "reference": "58e0422221825b79681b72c50c47a930be7bf1e1" + "reference": "b347be5aff6b2cc025208bb4d896607eb470c018" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/socket/zipball/58e0422221825b79681b72c50c47a930be7bf1e1", - "reference": "58e0422221825b79681b72c50c47a930be7bf1e1", + "url": "https://api.github.com/repos/amphp/socket/zipball/b347be5aff6b2cc025208bb4d896607eb470c018", + "reference": "b347be5aff6b2cc025208bb4d896607eb470c018", "shasum": "" }, "require": { @@ -676,17 +685,17 @@ "amphp/dns": "^2", "ext-openssl": "*", "kelunik/certificate": "^1.1", - "league/uri": "^6.5 | ^7", - "league/uri-interfaces": "^2.3 | ^7", + "league/uri": "^7", + "league/uri-interfaces": "^7", "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "revolt/event-loop": "^1" }, "require-dev": { "amphp/php-cs-fixer-config": "^2", "amphp/phpunit-util": "^3", "amphp/process": "^2", "phpunit/phpunit": "^9", - "psalm/phar": "5.20" + "psalm/phar": "6.16.1" }, "type": "library", "autoload": { @@ -730,7 +739,7 @@ ], "support": { "issues": "https://github.com/amphp/socket/issues", - "source": "https://github.com/amphp/socket/tree/v2.3.1" + "source": "https://github.com/amphp/socket/tree/v2.4.1" }, "funding": [ { @@ -738,7 +747,7 @@ "type": "github" } ], - "time": "2024-04-21T14:33:03+00:00" + "time": "2026-08-22T18:13:20+00:00" }, { "name": "amphp/sync", @@ -815,6 +824,153 @@ ], "time": "2024-08-03T19:31:26+00:00" }, + { + "name": "boundwize/jsonrecast", + "version": "1.0.36", + "source": { + "type": "git", + "url": "https://github.com/boundwize/jsonrecast.git", + "reference": "c7cfac84d68ce0a89babfeb3aab234db80dce790" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/boundwize/jsonrecast/zipball/c7cfac84d68ce0a89babfeb3aab234db80dce790", + "reference": "c7cfac84d68ce0a89babfeb3aab234db80dce790", + "shasum": "" + }, + "require": { + "php": "^8.2" + }, + "require-dev": { + "boundwize/pyrameter": "^0.5", + "boundwize/structarmed": "^0.15", + "laminas/laminas-coding-standard": "^3.1", + "phpstan/phpstan": "^2.2", + "phpunit/phpunit": "^11.5", + "rector/rector": "^2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Boundwize\\JsonRecast\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Abdul Malik Ikhsan", + "email": "samsonasik@gmail.com", + "homepage": "http://samsonasik.wordpress.com", + "role": "Developer" + } + ], + "description": "Editable JSON AST with visitor traversal and formatting-preserving printing.", + "homepage": "https://github.com/boundwize/jsonrecast", + "keywords": [ + "ast", + "formatting", + "json", + "parser", + "refactoring" + ], + "support": { + "issues": "https://github.com/boundwize/jsonrecast/issues", + "source": "https://github.com/boundwize/jsonrecast/tree/1.0.36" + }, + "funding": [ + { + "url": "https://github.com/samsonasik", + "type": "github" + } + ], + "time": "2026-08-15T00:35:36+00:00" + }, + { + "name": "boundwize/structarmed", + "version": "0.17.9", + "source": { + "type": "git", + "url": "https://github.com/boundwize/structarmed.git", + "reference": "1e536cd74cd4db95677389b9a388a5e73ca21305" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/boundwize/structarmed/zipball/1e536cd74cd4db95677389b9a388a5e73ca21305", + "reference": "1e536cd74cd4db95677389b9a388a5e73ca21305", + "shasum": "" + }, + "require": { + "boundwize/jsonrecast": "^1.0", + "composer-runtime-api": "^2.0", + "fidry/cpu-core-counter": "^1.3", + "nikic/php-parser": "^5.8", + "php": "^8.2" + }, + "require-dev": { + "boundwize/pyrameter": "^0.5", + "laminas/laminas-coding-standard": "^3.1", + "phpstan/phpstan": "^2.2", + "phpunit/phpunit": "^11.5", + "rector/rector": "dev-main" + }, + "bin": [ + "bin/structarmed" + ], + "type": "library", + "autoload": { + "psr-4": { + "Boundwize\\StructArmed\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Abdul Malik Ikhsan", + "email": "samsonasik@gmail.com", + "homepage": "http://samsonasik.wordpress.com", + "role": "Developer" + } + ], + "description": "Configurable PHP architecture guards — define your layers and rules, then keep them enforced", + "homepage": "https://github.com/boundwize/structarmed", + "keywords": [ + "Enforcement", + "analysis", + "architecture", + "ddd", + "dev", + "layer", + "mvc", + "psr1", + "psr12", + "psr15", + "psr4", + "static analysis", + "yagni" + ], + "support": { + "issues": "https://github.com/boundwize/structarmed/issues", + "source": "https://github.com/boundwize/structarmed/tree/0.17.9" + }, + "funding": [ + { + "url": "https://github.com/samsonasik", + "type": "github" + } + ], + "time": "2026-09-16T10:22:23+00:00" + }, { "name": "clue/ndjson-react", "version": "v1.3.0", @@ -969,28 +1125,29 @@ }, { "name": "composer/pcre", - "version": "3.3.2", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + "reference": "d5a341b3fb61f3001970940afb1d332968a183ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "url": "https://api.github.com/repos/composer/pcre/zipball/d5a341b3fb61f3001970940afb1d332968a183ed", + "reference": "d5a341b3fb61f3001970940afb1d332968a183ed", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, "conflict": { - "phpstan/phpstan": "<1.11.10" + "phpstan/phpstan": "<2.2.2" }, "require-dev": { - "phpstan/phpstan": "^1.12 || ^2", - "phpstan/phpstan-strict-rules": "^1 || ^2", - "phpunit/phpunit": "^8 || ^9" + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^9" }, "type": "library", "extra": { @@ -1028,7 +1185,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.2" + "source": "https://github.com/composer/pcre/tree/3.4.0" }, "funding": [ { @@ -1038,13 +1195,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2024-11-12T16:29:46+00:00" + "time": "2026-06-07T11:47:49+00:00" }, { "name": "composer/semver", @@ -1401,29 +1554,29 @@ }, { "name": "doctrine/deprecations", - "version": "1.1.5", + "version": "1.1.6", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" + "phpunit/phpunit": "<=7.5 || >=14" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^13", - "phpstan/phpstan": "1.4.10 || 2.1.11", + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", "psr/log": "^1 || ^2 || ^3" }, "suggest": { @@ -1443,9 +1596,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" }, - "time": "2025-04-07T20:06:18+00:00" + "time": "2026-02-07T07:09:04+00:00" }, { "name": "doctrine/lexer", @@ -1524,6 +1677,75 @@ ], "time": "2024-02-05T11:56:58+00:00" }, + { + "name": "ergebnis/agent-detector", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/agent-detector.git", + "reference": "e211f17928c8b95a51e06040792d57f5462fb271" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/agent-detector/zipball/e211f17928c8b95a51e06040792d57f5462fb271", + "reference": "e211f17928c8b95a51e06040792d57f5462fb271", + "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/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", + "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", + "phpunit/phpunit": "^9.6.34", + "rector/rector": "^2.4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + }, + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, + "autoload": { + "psr-4": { + "Ergebnis\\AgentDetector\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides a detector for detecting the presence of an agent.", + "homepage": "https://github.com/ergebnis/agent-detector", + "support": { + "issues": "https://github.com/ergebnis/agent-detector/issues", + "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" + }, { "name": "evenement/evenement", "version": "v3.0.2", @@ -1690,22 +1912,23 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.93.0", + "version": "v3.95.25", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "50895a07cface1385082e4caa6a6786c4e033468" + "reference": "2cdfc1f3daf173d83a1ebb6177949b58c95de6ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/50895a07cface1385082e4caa6a6786c4e033468", - "reference": "50895a07cface1385082e4caa6a6786c4e033468", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2cdfc1f3daf173d83a1ebb6177949b58c95de6ff", + "reference": "2cdfc1f3daf173d83a1ebb6177949b58c95de6ff", "shasum": "" }, "require": { "clue/ndjson-react": "^1.3", "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.5", + "ergebnis/agent-detector": "^1.2", "ext-filter": "*", "ext-hash": "*", "ext-json": "*", @@ -1716,32 +1939,31 @@ "react/event-loop": "^1.5", "react/socket": "^1.16", "react/stream": "^1.4", - "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0", + "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.33", - "symfony/polyfill-php80": "^1.33", - "symfony/polyfill-php81": "^1.33", - "symfony/polyfill-php84": "^1.33", + "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" }, "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.7", - "infection/infection": "^0.32", - "justinrainbow/json-schema": "^6.6", + "facile-it/paraunit": "^1.3.1 || ^2.11.0", + "infection/infection": "^0.32.7", + "justinrainbow/json-schema": "^6.10.0", "keradus/cli-executor": "^2.3", - "mikey179/vfsstream": "^1.6.12", - "php-coveralls/php-coveralls": "^2.9", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", - "phpunit/phpunit": "^9.6.31 || ^10.5.60 || ^11.5.48", - "symfony/polyfill-php85": "^1.33", - "symfony/var-dumper": "^5.4.48 || ^6.4.26 || ^7.4.0 || ^8.0", - "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0" + "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 || ^12.5.31 || ^13.0.6", + "symfony/polyfill-php85": "^1.38", + "symfony/var-dumper": "^5.4.48 || ^6.4.36 || ^7.4.8 || ^8.1.1", + "symfony/yaml": "^5.4.53 || ^6.4.41 || ^7.4.13 || ^8.1.1" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -1782,7 +2004,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.93.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.25" }, "funding": [ { @@ -1790,7 +2012,7 @@ "type": "github" } ], - "time": "2026-01-23T17:33:21+00:00" + "time": "2026-09-08T11:11:37+00:00" }, { "name": "infection/abstract-testframework-adapter", @@ -1971,16 +2193,16 @@ }, { "name": "infection/infection", - "version": "0.32.3", + "version": "0.32.6", "source": { "type": "git", "url": "https://github.com/infection/infection.git", - "reference": "3654db483619b63b9bcb04c24caeb03677c6d057" + "reference": "4ed769947eaf2ecf42203027301bad2bedf037e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/infection/infection/zipball/3654db483619b63b9bcb04c24caeb03677c6d057", - "reference": "3654db483619b63b9bcb04c24caeb03677c6d057", + "url": "https://api.github.com/repos/infection/infection/zipball/4ed769947eaf2ecf42203027301bad2bedf037e5", + "reference": "4ed769947eaf2ecf42203027301bad2bedf037e5", "shasum": "" }, "require": { @@ -2001,11 +2223,11 @@ "ondram/ci-detector": "^4.1.0", "php": "^8.2", "psr/log": "^2.0 || ^3.0", - "sanmai/di-container": "^0.1.4", + "sanmai/di-container": "^0.1.12", "sanmai/duoclock": "^0.1.0", "sanmai/later": "^0.1.7", - "sanmai/pipeline": "^7.0", - "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0", + "sanmai/pipeline": "^7.2", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", "symfony/console": "^6.4 || ^7.0 || ^8.0", "symfony/filesystem": "^6.4 || ^7.0 || ^8.0", "symfony/finder": "^6.4 || ^7.0 || ^8.0", @@ -2091,7 +2313,7 @@ ], "support": { "issues": "https://github.com/infection/infection/issues", - "source": "https://github.com/infection/infection/tree/0.32.3" + "source": "https://github.com/infection/infection/tree/0.32.6" }, "funding": [ { @@ -2103,7 +2325,7 @@ "type": "open_collective" } ], - "time": "2026-01-13T14:23:38+00:00" + "time": "2026-02-26T14:34:26+00:00" }, { "name": "infection/mutator", @@ -2160,26 +2382,27 @@ }, { "name": "justinrainbow/json-schema", - "version": "6.6.4", + "version": "6.12.0", "source": { "type": "git", "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "2eeb75d21cf73211335888e7f5e6fd7440723ec7" + "reference": "8ef236a1a37df364b518b7411a4b5bb95b040d79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/2eeb75d21cf73211335888e7f5e6fd7440723ec7", - "reference": "2eeb75d21cf73211335888e7f5e6fd7440723ec7", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/8ef236a1a37df364b518b7411a4b5bb95b040d79", + "reference": "8ef236a1a37df364b518b7411a4b5bb95b040d79", "shasum": "" }, "require": { + "ext-filter": "*", "ext-json": "*", "marc-mabe/php-enum": "^4.4", "php": "^7.2 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "3.3.0", - "json-schema/json-schema-test-suite": "^23.2", + "json-schema/json-schema-test-suite": "dev-main", "marc-mabe/php-enum-phpstan": "^2.0", "phpspec/prophecy": "^1.19", "phpstan/phpstan": "^1.12", @@ -2205,20 +2428,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.", @@ -2229,9 +2441,9 @@ ], "support": { "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/6.6.4" + "source": "https://github.com/jsonrainbow/json-schema/tree/6.12.0" }, - "time": "2025-12-19T15:01:32+00:00" + "time": "2026-09-04T12:54:20+00:00" }, { "name": "kelunik/certificate", @@ -2293,20 +2505,20 @@ }, { "name": "league/uri", - "version": "7.8.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", - "reference": "4436c6ec8d458e4244448b069cc572d088230b76" + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/4436c6ec8d458e4244448b069cc572d088230b76", - "reference": "4436c6ec8d458e4244448b069cc572d088230b76", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", "shasum": "" }, "require": { - "league/uri-interfaces": "^7.8", + "league/uri-interfaces": "^7.8.1", "php": "^8.1", "psr/http-factory": "^1" }, @@ -2379,7 +2591,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/7.8.0" + "source": "https://github.com/thephpleague/uri/tree/7.8.1" }, "funding": [ { @@ -2387,20 +2599,20 @@ "type": "github" } ], - "time": "2026-01-14T17:24:56+00:00" + "time": "2026-03-15T20:22:25+00:00" }, { "name": "league/uri-interfaces", - "version": "7.8.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4" + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/c5c5cd056110fc8afaba29fa6b72a43ced42acd4", - "reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", "shasum": "" }, "require": { @@ -2463,7 +2675,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.0" + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" }, "funding": [ { @@ -2471,7 +2683,7 @@ "type": "github" } ], - "time": "2026-01-15T06:54:53+00:00" + "time": "2026-03-08T20:05:35+00:00" }, { "name": "marc-mabe/php-enum", @@ -2548,26 +2760,26 @@ }, { "name": "marcocesarato/php-conventional-changelog", - "version": "1.17.3", + "version": "1.19.0", "source": { "type": "git", "url": "https://github.com/marcocesarato/php-conventional-changelog.git", - "reference": "c49b4a69ddf9ecbf055e8029c65e54a956d7ffa2" + "reference": "78019bf73153945193b6e6e4e3067d9c9f548ae9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/marcocesarato/php-conventional-changelog/zipball/c49b4a69ddf9ecbf055e8029c65e54a956d7ffa2", - "reference": "c49b4a69ddf9ecbf055e8029c65e54a956d7ffa2", + "url": "https://api.github.com/repos/marcocesarato/php-conventional-changelog/zipball/78019bf73153945193b6e6e4e3067d9c9f548ae9", + "reference": "78019bf73153945193b6e6e4e3067d9c9f548ae9", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", "php": ">=7.1.3", - "symfony/console": "^4 || ^5 || ^6 || ^7 || ^8" + "symfony/console": "^3.4 || ^4 || ^5 || ^6 || ^7 || ^8" }, "require-dev": { - "brainmaestro/composer-git-hooks": "^2.8", + "brainmaestro/composer-git-hooks": "^2.8 || ^3.0", "friendsofphp/php-cs-fixer": "^3.8", "php-mock/php-mock": "^2.3", "php-mock/php-mock-phpunit": "^2.6", @@ -2620,9 +2832,9 @@ ], "support": { "issues": "https://github.com/marcocesarato/php-conventional-changelog/issues", - "source": "https://github.com/marcocesarato/php-conventional-changelog/tree/v1.17.3" + "source": "https://github.com/marcocesarato/php-conventional-changelog/tree/v1.19.0" }, - "time": "2026-01-21T11:40:14+00:00" + "time": "2026-09-06T14:25:24+00:00" }, { "name": "mikey179/vfsstream", @@ -2678,20 +2890,20 @@ }, { "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", @@ -2726,28 +2938,28 @@ ], "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" }, { "name": "netresearch/jsonmapper", - "version": "v5.0.0", + "version": "v5.0.1", "source": { "type": "git", "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c" + "reference": "980674efdda65913492d29a8fd51c82270dd37bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c", - "reference": "8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/980674efdda65913492d29a8fd51c82270dd37bb", + "reference": "980674efdda65913492d29a8fd51c82270dd37bb", "shasum": "" }, "require": { @@ -2783,26 +2995,25 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v5.0.0" + "source": "https://github.com/cweiske/jsonmapper/tree/v5.0.1" }, - "time": "2024-09-08T10:20:00+00:00" + "time": "2026-02-22T16:28:03+00:00" }, { "name": "nikic/php-parser", - "version": "v5.7.0", + "version": "v5.9.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9e33da9553fe7786f0962b35f4e4ecf01be89def", + "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def", "shasum": "" }, "require": { - "ext-ctype": "*", "ext-json": "*", "ext-tokenizer": "*", "php": ">=7.4" @@ -2841,9 +3052,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.9.0" }, - "time": "2025-12-06T11:56:16+00:00" + "time": "2026-09-13T18:51:52+00:00" }, { "name": "ondram/ci-detector", @@ -3149,16 +3360,16 @@ }, { "name": "phpbench/phpbench", - "version": "1.4.3", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/phpbench/phpbench.git", - "reference": "b641dde59d969ea42eed70a39f9b51950bc96878" + "reference": "3d13c0d5dcf8730a67b70fa7fb03b4556b5cc0fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpbench/phpbench/zipball/b641dde59d969ea42eed70a39f9b51950bc96878", - "reference": "b641dde59d969ea42eed70a39f9b51950bc96878", + "url": "https://api.github.com/repos/phpbench/phpbench/zipball/3d13c0d5dcf8730a67b70fa7fb03b4556b5cc0fe", + "reference": "3d13c0d5dcf8730a67b70fa7fb03b4556b5cc0fe", "shasum": "" }, "require": { @@ -3169,7 +3380,7 @@ "ext-reflection": "*", "ext-spl": "*", "ext-tokenizer": "*", - "php": "^8.1", + "php": "^8.2", "phpbench/container": "^2.2", "psr/log": "^1.1 || ^2.0 || ^3.0", "seld/jsonlint": "^1.1", @@ -3183,14 +3394,15 @@ "require-dev": { "dantleech/invoke": "^2.0", "ergebnis/composer-normalize": "^2.39", - "jangregor/phpstan-prophecy": "^1.0", + "jangregor/phpstan-prophecy": "^2.0", "php-cs-fixer/shim": "^3.9", "phpspec/prophecy": "^1.22", "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^10.4 || ^11.0", - "rector/rector": "^1.2", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^11.5", + "rector/rector": "^2.2", + "sebastian/exporter": "^6.3.2", "symfony/error-handler": "^6.1 || ^7.0 || ^8.0", "symfony/var-dumper": "^6.1 || ^7.0 || ^8.0" }, @@ -3235,7 +3447,7 @@ ], "support": { "issues": "https://github.com/phpbench/phpbench/issues", - "source": "https://github.com/phpbench/phpbench/tree/1.4.3" + "source": "https://github.com/phpbench/phpbench/tree/1.7.0" }, "funding": [ { @@ -3243,7 +3455,7 @@ "type": "github" } ], - "time": "2025-11-06T19:07:31+00:00" + "time": "2026-06-08T19:09:20+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -3300,16 +3512,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "6.0.1", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "2f5cbed597cb261d1ea458f3da3a9ad32e670b1e" + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/2f5cbed597cb261d1ea458f3da3a9ad32e670b1e", - "reference": "2f5cbed597cb261d1ea458f3da3a9ad32e670b1e", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/7bae67520aa9f5ecc506d646810bd40d9da54582", + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582", "shasum": "" }, "require": { @@ -3359,9 +3571,9 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.1" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.3" }, - "time": "2026-01-20T15:30:42+00:00" + "time": "2026-03-18T20:49:53+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -3423,16 +3635,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.2", + "version": "2.3.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" + "reference": "148cefffaf0233e4c08cc13db8a195a56dd6dfe9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", - "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/148cefffaf0233e4c08cc13db8a195a56dd6dfe9", + "reference": "148cefffaf0233e4c08cc13db8a195a56dd6dfe9", "shasum": "" }, "require": { @@ -3464,17 +3676,17 @@ "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.2" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.5" }, - "time": "2026-01-25T14:56:51+00:00" + "time": "2026-08-31T16:05:28+00:00" }, { "name": "phpstan/phpstan", - "version": "2.1.37", + "version": "2.2.14", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/28cd424c5ea984128c95cfa7ea658808e8954e49", - "reference": "28cd424c5ea984128c95cfa7ea658808e8954e49", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9c672e7a8e791dfc3d30e55f683e73fc0b63a3ac", + "reference": "9c672e7a8e791dfc3d30e55f683e73fc0b63a3ac", "shasum": "" }, "require": { @@ -3497,6 +3709,17 @@ "license": [ "MIT" ], + "authors": [ + { + "name": "Ondřej Mirtes" + }, + { + "name": "Markus Staab" + }, + { + "name": "Vincent Langlet" + } + ], "description": "PHPStan - PHP Static Analysis Tool", "keywords": [ "dev", @@ -3519,25 +3742,26 @@ "type": "github" } ], - "time": "2026-01-24T08:21:55+00:00" + "time": "2026-09-12T21:39:33+00:00" }, { "name": "phpstan/phpstan-phpunit", - "version": "2.0.12", + "version": "2.0.18", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "e4c5a22bf43d3d2bd5a780ad261a622ff62c49a4" + "reference": "f5dc20ff8082d02339b60cab68ec3eb0d859fb30" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/e4c5a22bf43d3d2bd5a780ad261a622ff62c49a4", - "reference": "e4c5a22bf43d3d2bd5a780ad261a622ff62c49a4", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/f5dc20ff8082d02339b60cab68ec3eb0d859fb30", + "reference": "f5dc20ff8082d02339b60cab68ec3eb0d859fb30", "shasum": "" }, "require": { + "phar-io/version": "^3.2", "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.1.32" + "phpstan/phpstan": "^2.2.3" }, "conflict": { "phpunit/phpunit": "<7.0" @@ -3547,7 +3771,8 @@ "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/phpstan-deprecation-rules": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^9.6" + "phpunit/phpunit": "^9.6", + "shipmonk/name-collision-detector": "^2.1" }, "type": "phpstan-extension", "extra": { @@ -3568,35 +3793,39 @@ "MIT" ], "description": "PHPUnit extensions and rules for PHPStan", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.12" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.18" }, - "time": "2026-01-22T13:40:00+00:00" + "time": "2026-07-04T12:16:09+00:00" }, { "name": "phpstan/phpstan-strict-rules", - "version": "2.0.8", + "version": "2.0.12", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "1ed9e626a37f7067b594422411539aa807190573" + "reference": "2bc5ae19ae965663b62ac907ee6342c3903ec93b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/1ed9e626a37f7067b594422411539aa807190573", - "reference": "1ed9e626a37f7067b594422411539aa807190573", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/2bc5ae19ae965663b62ac907ee6342c3903ec93b", + "reference": "2bc5ae19ae965663b62ac907ee6342c3903ec93b", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.1.29" + "phpstan/phpstan": "^2.1.52" }, "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": { @@ -3616,11 +3845,14 @@ "MIT" ], "description": "Extra strict and opinionated rules for PHPStan", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.8" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.12" }, - "time": "2026-01-27T08:10:25+00:00" + "time": "2026-07-19T07:24:06+00:00" }, { "name": "phpunit/php-code-coverage", @@ -3714,28 +3946,28 @@ }, { "name": "phpunit/php-file-iterator", - "version": "5.1.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903", + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -3763,15 +3995,27 @@ "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/5.1.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" } ], - "time": "2024-08-27T05:02:59+00:00" + "time": "2026-02-02T13:52:54+00:00" }, { "name": "phpunit/php-invoker", @@ -3959,31 +4203,31 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.50", + "version": "11.5.56", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "fdfc727f0fcacfeb8fcb30c7e5da173125b58be3" + "reference": "5f83edffa6967c3db468d48a695ec7bcb02e9256" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fdfc727f0fcacfeb8fcb30c7e5da173125b58be3", - "reference": "fdfc727f0fcacfeb8fcb30c7e5da173125b58be3", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5f83edffa6967c3db468d48a695ec7bcb02e9256", + "reference": "5f83edffa6967c3db468d48a695ec7bcb02e9256", "shasum": "" }, "require": { "ext-dom": "*", + "ext-filter": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", - "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.2", "phpunit/php-code-coverage": "^11.0.12", - "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-file-iterator": "^5.1.1", "phpunit/php-invoker": "^5.0.1", "phpunit/php-text-template": "^4.0.1", "phpunit/php-timer": "^7.0.1", @@ -3995,6 +4239,7 @@ "sebastian/exporter": "^6.3.2", "sebastian/global-state": "^7.0.2", "sebastian/object-enumerator": "^6.0.1", + "sebastian/recursion-context": "^6.0.3", "sebastian/type": "^5.1.3", "sebastian/version": "^5.0.2", "staabm/side-effects-detector": "^1.0.5" @@ -4040,31 +4285,15 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.50" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.56" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" + "url": "https://phpunit.de/sponsoring.html", + "type": "other" } ], - "time": "2026-01-27T05:59:18+00:00" + "time": "2026-07-06T14:52:39+00:00" }, { "name": "psr/cache", @@ -4952,21 +5181,21 @@ }, { "name": "rector/rector", - "version": "2.3.5", + "version": "2.6.7", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "9442f4037de6a5347ae157fe8e6c7cda9d909070" + "reference": "f4aa224edb9b0630fb43826d4cb6a49b62e48d4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/9442f4037de6a5347ae157fe8e6c7cda9d909070", - "reference": "9442f4037de6a5347ae157fe8e6c7cda9d909070", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/f4aa224edb9b0630fb43826d4cb6a49b62e48d4c", + "reference": "f4aa224edb9b0630fb43826d4cb6a49b62e48d4c", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.1.36" + "phpstan/phpstan": "^2.2.14" }, "conflict": { "rector/rector-doctrine": "*", @@ -4974,9 +5203,6 @@ "rector/rector-phpunit": "*", "rector/rector-symfony": "*" }, - "suggest": { - "ext-dom": "To manipulate phpunit.xml via the custom-rule command" - }, "bin": [ "bin/rector" ], @@ -5000,7 +5226,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.3.5" + "source": "https://github.com/rectorphp/rector/tree/2.6.7" }, "funding": [ { @@ -5008,20 +5234,20 @@ "type": "github" } ], - "time": "2026-01-28T15:22:48+00:00" + "time": "2026-09-13T20:17:44+00:00" }, { "name": "revolt/event-loop", - "version": "v1.0.8", + "version": "v1.0.9", "source": { "type": "git", "url": "https://github.com/revoltphp/event-loop.git", - "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c" + "reference": "44061cf513e53c6200372fc935ac42271566295d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/b6fc06dce8e9b523c9946138fa5e62181934f91c", - "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/44061cf513e53c6200372fc935ac42271566295d", + "reference": "44061cf513e53c6200372fc935ac42271566295d", "shasum": "" }, "require": { @@ -5031,7 +5257,7 @@ "ext-json": "*", "jetbrains/phpstorm-stubs": "^2019.3", "phpunit/phpunit": "^9", - "psalm/phar": "^5.15" + "psalm/phar": "6.16.*" }, "type": "library", "extra": { @@ -5078,28 +5304,28 @@ ], "support": { "issues": "https://github.com/revoltphp/event-loop/issues", - "source": "https://github.com/revoltphp/event-loop/tree/v1.0.8" + "source": "https://github.com/revoltphp/event-loop/tree/v1.0.9" }, - "time": "2025-08-27T21:33:23+00:00" + "time": "2026-05-16T17:55:38+00:00" }, { "name": "sanmai/di-container", - "version": "0.1.12", + "version": "0.1.23", "source": { "type": "git", "url": "https://github.com/sanmai/di-container.git", - "reference": "8b9ad72f6ac1f9e185e5bd060dc9479cb5191d8b" + "reference": "8cf59c091f33297389d0a5a27ea0d688df15c376" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sanmai/di-container/zipball/8b9ad72f6ac1f9e185e5bd060dc9479cb5191d8b", - "reference": "8b9ad72f6ac1f9e185e5bd060dc9479cb5191d8b", + "url": "https://api.github.com/repos/sanmai/di-container/zipball/8cf59c091f33297389d0a5a27ea0d688df15c376", + "reference": "8cf59c091f33297389d0a5a27ea0d688df15c376", "shasum": "" }, "require": { "php": ">=8.2", "psr/container": "^1.1.2 || ^2.0", - "sanmai/pipeline": "^6.17 || ^7.0" + "sanmai/pipeline": "^7.10" }, "require-dev": { "ergebnis/composer-normalize": "^2.8", @@ -5151,7 +5377,7 @@ ], "support": { "issues": "https://github.com/sanmai/di-container/issues", - "source": "https://github.com/sanmai/di-container/tree/0.1.12" + "source": "https://github.com/sanmai/di-container/tree/0.1.23" }, "funding": [ { @@ -5159,7 +5385,7 @@ "type": "github" } ], - "time": "2026-01-27T08:25:46+00:00" + "time": "2026-08-11T00:58:41+00:00" }, { "name": "sanmai/duoclock", @@ -5226,16 +5452,16 @@ }, { "name": "sanmai/later", - "version": "0.1.7", + "version": "0.1.8", "source": { "type": "git", "url": "https://github.com/sanmai/later.git", - "reference": "72a82d783864bca90412d8a26c1878f8981fee97" + "reference": "c56aeb8fa7fdf81eda2640a68b51884685963d13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sanmai/later/zipball/72a82d783864bca90412d8a26c1878f8981fee97", - "reference": "72a82d783864bca90412d8a26c1878f8981fee97", + "url": "https://api.github.com/repos/sanmai/later/zipball/c56aeb8fa7fdf81eda2640a68b51884685963d13", + "reference": "c56aeb8fa7fdf81eda2640a68b51884685963d13", "shasum": "" }, "require": { @@ -5278,7 +5504,7 @@ "description": "Later: deferred wrapper object", "support": { "issues": "https://github.com/sanmai/later/issues", - "source": "https://github.com/sanmai/later/tree/0.1.7" + "source": "https://github.com/sanmai/later/tree/0.1.8" }, "funding": [ { @@ -5286,20 +5512,20 @@ "type": "github" } ], - "time": "2025-05-11T01:48:00+00:00" + "time": "2026-06-29T07:24:33+00:00" }, { "name": "sanmai/pipeline", - "version": "7.9", + "version": "7.10", "source": { "type": "git", "url": "https://github.com/sanmai/pipeline.git", - "reference": "d7046ecce91ae57fca403be694888371a21250eb" + "reference": "a8e4e57a6031efc7a92defd13fed9c1c4c73fc71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sanmai/pipeline/zipball/d7046ecce91ae57fca403be694888371a21250eb", - "reference": "d7046ecce91ae57fca403be694888371a21250eb", + "url": "https://api.github.com/repos/sanmai/pipeline/zipball/a8e4e57a6031efc7a92defd13fed9c1c4c73fc71", + "reference": "a8e4e57a6031efc7a92defd13fed9c1c4c73fc71", "shasum": "" }, "require": { @@ -5314,7 +5540,7 @@ "php-coveralls/php-coveralls": "^2.4.1", "phpstan/extension-installer": "^1.4", "phpstan/phpstan": "^2", - "phpunit/phpunit": ">=9.4 <12", + "phpunit/phpunit": "^11 || ^12", "sanmai/phpstan-rules": "^0.3.11", "sanmai/phpunit-double-colon-syntax": "^0.1.1", "vimeo/psalm": ">=2" @@ -5346,7 +5572,7 @@ "description": "General-purpose collections pipeline", "support": { "issues": "https://github.com/sanmai/pipeline/issues", - "source": "https://github.com/sanmai/pipeline/tree/7.9" + "source": "https://github.com/sanmai/pipeline/tree/7.10" }, "funding": [ { @@ -5354,7 +5580,7 @@ "type": "github" } ], - "time": "2026-01-16T11:54:05+00:00" + "time": "2026-08-03T04:56:22+00:00" }, { "name": "sebastian/cli-parser", @@ -6344,16 +6570,16 @@ }, { "name": "seld/jsonlint", - "version": "1.11.0", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2" + "reference": "9a90eb5d32d5a500296bf43f946d60246444d5f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/1748aaf847fc731cfad7725aec413ee46f0cc3a2", - "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9a90eb5d32d5a500296bf43f946d60246444d5f7", + "reference": "9a90eb5d32d5a500296bf43f946d60246444d5f7", "shasum": "" }, "require": { @@ -6392,7 +6618,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.11.0" + "source": "https://github.com/Seldaek/jsonlint/tree/1.12.1" }, "funding": [ { @@ -6404,7 +6630,7 @@ "type": "tidelift" } ], - "time": "2024-07-11T14:55:45+00:00" + "time": "2026-06-12T11:32:29+00:00" }, { "name": "spatie/array-to-xml", @@ -6528,16 +6754,16 @@ }, { "name": "symfony/console", - "version": "v7.4.4", + "version": "v7.4.19", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894" + "reference": "3a1973458b153f566a8d7499bc06ece323d60063" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/41e38717ac1dd7a46b6bda7d6a82af2d98a78894", - "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894", + "url": "https://api.github.com/repos/symfony/console/zipball/3a1973458b153f566a8d7499bc06ece323d60063", + "reference": "3a1973458b153f566a8d7499bc06ece323d60063", "shasum": "" }, "require": { @@ -6602,7 +6828,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.4" + "source": "https://github.com/symfony/console/tree/v7.4.19" }, "funding": [ { @@ -6622,20 +6848,20 @@ "type": "tidelift" } ], - "time": "2026-01-13T11:36:38+00:00" + "time": "2026-09-13T10:38:41+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.6.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", "shasum": "" }, "require": { @@ -6648,7 +6874,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -6673,7 +6899,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" }, "funding": [ { @@ -6684,25 +6910,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.4.4", + "version": "v7.4.17", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "dc2c0eba1af673e736bb851d747d266108aea746" + "reference": "d269974ee93c61d03620ffee358355bfdb471d66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dc2c0eba1af673e736bb851d747d266108aea746", - "reference": "dc2c0eba1af673e736bb851d747d266108aea746", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d269974ee93c61d03620ffee358355bfdb471d66", + "reference": "d269974ee93c61d03620ffee358355bfdb471d66", "shasum": "" }, "require": { @@ -6754,7 +6984,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.4" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.17" }, "funding": [ { @@ -6774,20 +7004,20 @@ "type": "tidelift" } ], - "time": "2026-01-05T11:45:34+00:00" + "time": "2026-08-21T17:40:08+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.6.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c7de7a00ffb67842132da02ea92988a39ccd9f4e", + "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e", "shasum": "" }, "require": { @@ -6801,7 +7031,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -6834,7 +7064,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.1" }, "funding": [ { @@ -6845,25 +7075,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/filesystem", - "version": "v7.4.0", + "version": "v7.4.18", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "d551b38811096d0be9c4691d406991b47c0c630a" + "reference": "90d412aa5277c6819db39e7605aa46b1019e3232" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a", - "reference": "d551b38811096d0be9c4691d406991b47c0c630a", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/90d412aa5277c6819db39e7605aa46b1019e3232", + "reference": "90d412aa5277c6819db39e7605aa46b1019e3232", "shasum": "" }, "require": { @@ -6900,7 +7134,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.4.0" + "source": "https://github.com/symfony/filesystem/tree/v7.4.18" }, "funding": [ { @@ -6920,20 +7154,20 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2026-08-23T10:03:40+00:00" }, { "name": "symfony/finder", - "version": "v7.4.5", + "version": "v7.4.19", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb" + "reference": "1b900bc6ae5ba60c5eee69c11ba44566190576fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ad4daa7c38668dcb031e63bc99ea9bd42196a2cb", - "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb", + "url": "https://api.github.com/repos/symfony/finder/zipball/1b900bc6ae5ba60c5eee69c11ba44566190576fe", + "reference": "1b900bc6ae5ba60c5eee69c11ba44566190576fe", "shasum": "" }, "require": { @@ -6968,7 +7202,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.5" + "source": "https://github.com/symfony/finder/tree/v7.4.19" }, "funding": [ { @@ -6988,20 +7222,20 @@ "type": "tidelift" } ], - "time": "2026-01-26T15:07:59+00:00" + "time": "2026-09-10T19:14:10+00:00" }, { "name": "symfony/options-resolver", - "version": "v7.4.0", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "b38026df55197f9e39a44f3215788edf83187b80" + "reference": "2888fcdc4dc2fd5f7c7397be78631e8af12e02b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/b38026df55197f9e39a44f3215788edf83187b80", - "reference": "b38026df55197f9e39a44f3215788edf83187b80", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/2888fcdc4dc2fd5f7c7397be78631e8af12e02b4", + "reference": "2888fcdc4dc2fd5f7c7397be78631e8af12e02b4", "shasum": "" }, "require": { @@ -7039,7 +7273,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.4.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.4.8" }, "funding": [ { @@ -7059,20 +7293,20 @@ "type": "tidelift" } ], - "time": "2025-11-12T15:39:26+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { @@ -7122,7 +7356,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { @@ -7142,20 +7376,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", + "version": "v1.41.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", "shasum": "" }, "require": { @@ -7204,7 +7438,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.41.0" }, "funding": [ { @@ -7224,20 +7458,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2026-07-28T08:25:59+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "version": "v1.42.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/aa20edea75bd9c48cfecc8360922e5a6e5c44502", + "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502", "shasum": "" }, "require": { @@ -7289,7 +7523,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.42.0" }, "funding": [ { @@ -7309,20 +7543,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-08-07T06:33:24+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "version": "v1.38.2", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", "shasum": "" }, "require": { @@ -7374,7 +7608,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" }, "funding": [ { @@ -7394,20 +7628,20 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2026-05-27T06:59:30+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", "shasum": "" }, "require": { @@ -7458,7 +7692,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" }, "funding": [ { @@ -7478,20 +7712,20 @@ "type": "tidelift" } ], - "time": "2025-01-02T08:10:11+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + "reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/6bfb9c766cacffbc8e118cb87217d08ed84e5cd7", + "reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7", "shasum": "" }, "require": { @@ -7538,7 +7772,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.38.1" }, "funding": [ { @@ -7558,20 +7792,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-05-26T12:45:58+00:00" }, { "name": "symfony/polyfill-php84", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", "shasum": "" }, "require": { @@ -7618,7 +7852,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" }, "funding": [ { @@ -7638,20 +7872,20 @@ "type": "tidelift" } ], - "time": "2025-06-24T13:30:11+00:00" + "time": "2026-05-26T12:51:13+00:00" }, { "name": "symfony/polyfill-php85", - "version": "v1.33.0", + "version": "v1.41.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/255fab485aaa1006ed411040c42aecd7b5302d7a", + "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a", "shasum": "" }, "require": { @@ -7698,7 +7932,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.41.0" }, "funding": [ { @@ -7718,20 +7952,20 @@ "type": "tidelift" } ], - "time": "2025-06-23T16:12:55+00:00" + "time": "2026-07-01T12:47:55+00:00" }, { "name": "symfony/process", - "version": "v7.4.5", + "version": "v7.4.19", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "608476f4604102976d687c483ac63a79ba18cc97" + "reference": "ed0ae095b86994d370d5791612e55984f15aa30e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/608476f4604102976d687c483ac63a79ba18cc97", - "reference": "608476f4604102976d687c483ac63a79ba18cc97", + "url": "https://api.github.com/repos/symfony/process/zipball/ed0ae095b86994d370d5791612e55984f15aa30e", + "reference": "ed0ae095b86994d370d5791612e55984f15aa30e", "shasum": "" }, "require": { @@ -7763,7 +7997,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.4.5" + "source": "https://github.com/symfony/process/tree/v7.4.19" }, "funding": [ { @@ -7783,20 +8017,20 @@ "type": "tidelift" } ], - "time": "2026-01-26T15:07:59+00:00" + "time": "2026-09-02T12:38:34+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.6.1", + "version": "v3.7.3", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", "shasum": "" }, "require": { @@ -7814,7 +8048,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -7850,7 +8084,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.3" }, "funding": [ { @@ -7870,20 +8104,20 @@ "type": "tidelift" } ], - "time": "2025-07-15T11:30:57+00:00" + "time": "2026-07-27T15:39:01+00:00" }, { "name": "symfony/stopwatch", - "version": "v7.4.0", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "8a24af0a2e8a872fb745047180649b8418303084" + "reference": "70a852d72fec4d51efb1f48dcd968efcaf5ccb89" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8a24af0a2e8a872fb745047180649b8418303084", - "reference": "8a24af0a2e8a872fb745047180649b8418303084", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/70a852d72fec4d51efb1f48dcd968efcaf5ccb89", + "reference": "70a852d72fec4d51efb1f48dcd968efcaf5ccb89", "shasum": "" }, "require": { @@ -7916,7 +8150,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.4.0" + "source": "https://github.com/symfony/stopwatch/tree/v7.4.8" }, "funding": [ { @@ -7936,20 +8170,20 @@ "type": "tidelift" } ], - "time": "2025-08-04T07:05:15+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/string", - "version": "v7.4.4", + "version": "v7.4.19", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f" + "reference": "02731ce2bd26514bec9efc0baef2cd0b0cf67f46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/1c4b10461bf2ec27537b5f36105337262f5f5d6f", - "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f", + "url": "https://api.github.com/repos/symfony/string/zipball/02731ce2bd26514bec9efc0baef2cd0b0cf67f46", + "reference": "02731ce2bd26514bec9efc0baef2cd0b0cf67f46", "shasum": "" }, "require": { @@ -8007,7 +8241,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.4.4" + "source": "https://github.com/symfony/string/tree/v7.4.19" }, "funding": [ { @@ -8027,20 +8261,20 @@ "type": "tidelift" } ], - "time": "2026-01-12T10:54:30+00:00" + "time": "2026-09-11T14:46:58+00:00" }, { "name": "thecodingmachine/safe", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/thecodingmachine/safe.git", - "reference": "2cdd579eeaa2e78e51c7509b50cc9fb89a956236" + "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/2cdd579eeaa2e78e51c7509b50cc9fb89a956236", - "reference": "2cdd579eeaa2e78e51c7509b50cc9fb89a956236", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/705683a25bacf0d4860c7dea4d7947bfd09eea19", + "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19", "shasum": "" }, "require": { @@ -8150,7 +8384,7 @@ "description": "PHP core functions that throw exceptions instead of returning FALSE on error", "support": { "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v3.3.0" + "source": "https://github.com/thecodingmachine/safe/tree/v3.4.0" }, "funding": [ { @@ -8161,12 +8395,16 @@ "url": "https://github.com/shish", "type": "github" }, + { + "url": "https://github.com/silasjoisten", + "type": "github" + }, { "url": "https://github.com/staabm", "type": "github" } ], - "time": "2025-05-14T06:15:44+00:00" + "time": "2026-02-04T18:08:13+00:00" }, { "name": "theseer/tokenizer", @@ -8220,16 +8458,16 @@ }, { "name": "vimeo/psalm", - "version": "6.14.3", + "version": "6.17.2", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "d0b040a91f280f071c1abcb1b77ce3822058725a" + "reference": "dd625545733d24633e5d386a26c13004dae80e19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/d0b040a91f280f071c1abcb1b77ce3822058725a", - "reference": "d0b040a91f280f071c1abcb1b77ce3822058725a", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/dd625545733d24633e5d386a26c13004dae80e19", + "reference": "dd625545733d24633e5d386a26c13004dae80e19", "shasum": "" }, "require": { @@ -8251,9 +8489,9 @@ "felixfbecker/language-server-protocol": "^1.5.3", "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", "netresearch/jsonmapper": "^5.0", - "nikic/php-parser": "^5.0.0", + "nikic/php-parser": "^5.2.0", "php": "~8.1.31 || ~8.2.27 || ~8.3.16 || ~8.4.3 || ~8.5.0", - "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0", "spatie/array-to-xml": "^2.17.0 || ^3.0", "symfony/console": "^6.0 || ^7.0 || ^8.0", "symfony/filesystem": "~6.3.12 || ~6.4.3 || ^7.0.3 || ^8.0", @@ -8334,20 +8572,20 @@ "issues": "https://github.com/vimeo/psalm/issues", "source": "https://github.com/vimeo/psalm" }, - "time": "2025-12-23T15:36:48+00:00" + "time": "2026-09-15T12:34:23+00:00" }, { "name": "webmozart/assert", - "version": "2.1.2", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649" + "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/ce6a2f100c404b2d32a1dd1270f9b59ad4f57649", - "reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/2ccb7c2e821038c03a3e6e1700c570c158c55f70", + "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70", "shasum": "" }, "require": { @@ -8363,7 +8601,11 @@ }, "type": "library", "extra": { + "psalm": { + "pluginClass": "Webmozart\\Assert\\PsalmPlugin" + }, "branch-alias": { + "dev-master": "2.0-dev", "dev-feature/2-0": "2.0-dev" } }, @@ -8394,9 +8636,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.1.2" + "source": "https://github.com/webmozarts/assert/tree/2.4.1" }, - "time": "2026-01-13T14:02:24+00:00" + "time": "2026-06-15T15:31:57+00:00" }, { "name": "webmozart/glob", diff --git a/qa/PHPStan/Extension/SuppressPureErrors.php b/qa/PHPStan/Extension/SuppressPureErrors.php index 28ff61e69..267afbb36 100644 --- a/qa/PHPStan/Extension/SuppressPureErrors.php +++ b/qa/PHPStan/Extension/SuppressPureErrors.php @@ -40,7 +40,7 @@ public function shouldIgnore(Error $error, Node $node, Scope $scope): bool return false; } - if (! Polyfill::array_find($type->getObjectClassNames(), fn (string $className) => $className === MapperBuilder::class || $className === NormalizerBuilder::class)) { + if (! Polyfill::array_find($type->getObjectClassNames(), static fn (string $className) => $className === MapperBuilder::class || $className === NormalizerBuilder::class)) { return false; } diff --git a/rector.php b/rector.php index c6b95aa47..800081118 100644 --- a/rector.php +++ b/rector.php @@ -7,7 +7,6 @@ use Rector\Php74\Rector\Closure\ClosureToArrowFunctionRector; use Rector\Php74\Rector\Property\RestoreDefaultNullToNullableTypePropertyRector; use Rector\Php80\Rector\Class_\ClassPropertyAssignToConstructorPromotionRector; -use Rector\Php81\Rector\FuncCall\NullToStrictStringFuncCallArgRector; use Rector\Php81\Rector\Property\ReadOnlyPropertyRector; return RectorConfig::configure() @@ -22,7 +21,6 @@ ->withParallel() ->withSkip([ ClassPropertyAssignToConstructorPromotionRector::class, - NullToStrictStringFuncCallArgRector::class, ReadOnlyPropertyRector::class, RestoreDefaultNullToNullableTypePropertyRector::class => [ __DIR__ . '/tests/Integration/Mapping/Strictness/UndefinedValuesMappingTest.php', diff --git a/src/Compiler/Native/AnonymousClassNode.php b/src/Compiler/Native/AnonymousClassNode.php index 016b45d64..eba12fa48 100644 --- a/src/Compiler/Native/AnonymousClassNode.php +++ b/src/Compiler/Native/AnonymousClassNode.php @@ -93,7 +93,7 @@ public function hasMethod(string $name): bool public function compile(Compiler $compiler): Compiler { $arguments = implode(', ', array_map( - fn (Node $argument) => $compiler->sub()->compile($argument)->code(), + static fn (Node $argument) => $compiler->sub()->compile($argument)->code(), $this->arguments, )); @@ -107,11 +107,11 @@ public function compile(Compiler $compiler): Compiler $body = [ ...array_map( - fn (PropertyDeclarationNode $property) => $compiler->sub()->indent()->compile($property)->code(), + static fn (PropertyDeclarationNode $property) => $compiler->sub()->indent()->compile($property)->code(), $this->properties, ), ...array_map( - fn (MethodNode $method) => $compiler->sub()->indent()->compile($method)->code(), + static fn (MethodNode $method) => $compiler->sub()->indent()->compile($method)->code(), $this->methods, ), ]; diff --git a/src/Compiler/Native/CallNode.php b/src/Compiler/Native/CallNode.php index 31c1c651f..19fae54af 100644 --- a/src/Compiler/Native/CallNode.php +++ b/src/Compiler/Native/CallNode.php @@ -27,7 +27,7 @@ public function compile(Compiler $compiler): Compiler if ($this->arguments !== []) { $arguments = array_map( - fn (Node $argument) => $compiler->sub()->compile($argument)->code(), + static fn (Node $argument) => $compiler->sub()->compile($argument)->code(), $this->arguments, ); diff --git a/src/Compiler/Native/ClosureNode.php b/src/Compiler/Native/ClosureNode.php index b113d4609..4d045130b 100644 --- a/src/Compiler/Native/ClosureNode.php +++ b/src/Compiler/Native/ClosureNode.php @@ -31,7 +31,7 @@ public function __construct(Node ...$nodes) public function uses(string ...$names): self { $self = clone $this; - $self->use = array_map(fn (string $name) => '$' . $name, $names); + $self->use = array_map(static fn (string $name) => '$' . $name, $names); return $self; } diff --git a/src/Compiler/Native/MethodNode.php b/src/Compiler/Native/MethodNode.php index 89ad45463..16522cc9c 100644 --- a/src/Compiler/Native/MethodNode.php +++ b/src/Compiler/Native/MethodNode.php @@ -28,7 +28,7 @@ public function __construct( public function compile(Compiler $compiler): Compiler { $parameters = implode(', ', array_map( - fn (ParameterDeclarationNode $parameter) => $compiler->sub()->compile($parameter)->code(), + static fn (ParameterDeclarationNode $parameter) => $compiler->sub()->compile($parameter)->code(), $this->parameters, )); diff --git a/src/Compiler/Native/NewClassNode.php b/src/Compiler/Native/NewClassNode.php index 9c5ede365..991445325 100644 --- a/src/Compiler/Native/NewClassNode.php +++ b/src/Compiler/Native/NewClassNode.php @@ -31,7 +31,7 @@ public function __construct(string $className, Node ...$arguments) public function compile(Compiler $compiler): Compiler { $arguments = array_map( - fn (Node $argument) => $compiler->sub()->compile($argument)->code(), + static fn (Node $argument) => $compiler->sub()->compile($argument)->code(), $this->arguments, ); $arguments = implode(', ', $arguments); diff --git a/src/Compiler/Native/ShortClosureNode.php b/src/Compiler/Native/ShortClosureNode.php index cbe5abaf8..cbd2bb1fe 100644 --- a/src/Compiler/Native/ShortClosureNode.php +++ b/src/Compiler/Native/ShortClosureNode.php @@ -34,7 +34,7 @@ public function witParameters(ParameterDeclarationNode ...$parameters): self public function compile(Compiler $compiler): Compiler { $parameters = implode(', ', array_map( - fn (ParameterDeclarationNode $parameter) => $compiler->sub()->compile($parameter)->code(), + static fn (ParameterDeclarationNode $parameter) => $compiler->sub()->compile($parameter)->code(), $this->parameters, )); diff --git a/src/Definition/Attributes.php b/src/Definition/Attributes.php index 28fcafbaf..79fab869c 100644 --- a/src/Definition/Attributes.php +++ b/src/Definition/Attributes.php @@ -43,7 +43,7 @@ public static function empty(): self public function forCallable(callable $callable): self { return new self(...array_map( - fn (AttributeDefinition $attribute) => $attribute->forCallable($callable), + static fn (AttributeDefinition $attribute) => $attribute->forCallable($callable), $this->attributes, )); } diff --git a/src/Definition/Parameters.php b/src/Definition/Parameters.php index 9d1ca3313..b13023a07 100644 --- a/src/Definition/Parameters.php +++ b/src/Definition/Parameters.php @@ -74,7 +74,7 @@ public function count(): int public function forCallable(callable $callable): self { return new self(...array_map( - fn (ParameterDefinition $parameter) => $parameter->forCallable($callable), + static fn (ParameterDefinition $parameter) => $parameter->forCallable($callable), $this->parameters )); } diff --git a/src/Definition/Repository/Cache/Compiler/TypeCompiler.php b/src/Definition/Repository/Cache/Compiler/TypeCompiler.php index 971d9b24e..3dbdf03bb 100644 --- a/src/Definition/Repository/Cache/Compiler/TypeCompiler.php +++ b/src/Definition/Repository/Cache/Compiler/TypeCompiler.php @@ -188,7 +188,7 @@ public function compile(Type $type): string $pattern = var_export($type->pattern(), true); $cases = array_map( - fn (string|int $key, UnitEnum $case) => var_export($key, true) . ' => ' . var_export($case, true), + static fn (string|int $key, UnitEnum $case) => var_export($key, true) . ' => ' . var_export($case, true), array_keys($type->cases()), $type->cases() ); diff --git a/src/Definition/Repository/Reflection/ReflectionClassDefinitionRepository.php b/src/Definition/Repository/Reflection/ReflectionClassDefinitionRepository.php index 65ad5ef2d..5ab46f9e9 100644 --- a/src/Definition/Repository/Reflection/ReflectionClassDefinitionRepository.php +++ b/src/Definition/Repository/Reflection/ReflectionClassDefinitionRepository.php @@ -119,7 +119,7 @@ private function vacantTypes(ObjectType $type, array $generics): array // PHP8.5 use pipes $aliasCollision = array_filter( array_count_values($keys), - fn (int $count) => $count > 1 + static fn (int $count) => $count > 1 ); foreach ($aliasCollision as $alias => $numberOfCollisions) { @@ -162,10 +162,10 @@ private function properties(ObjectType $type, ReflectionTypeResolver $typeResolv while ($reflection) { $currentProperties = array_map( - fn (ReflectionProperty $property) => $properties[$property->name], + static fn (ReflectionProperty $property) => $properties[$property->name], array_filter( $reflection->getProperties(), - fn (ReflectionProperty $property) => isset($properties[$property->name]), + static fn (ReflectionProperty $property) => isset($properties[$property->name]), ), ); diff --git a/src/Definition/Repository/Reflection/TypeResolver/ClassParentTypeResolver.php b/src/Definition/Repository/Reflection/TypeResolver/ClassParentTypeResolver.php index 5cfd40fdd..32d533f7d 100644 --- a/src/Definition/Repository/Reflection/TypeResolver/ClassParentTypeResolver.php +++ b/src/Definition/Repository/Reflection/TypeResolver/ClassParentTypeResolver.php @@ -178,7 +178,7 @@ private function extractParentTypeFromDocBlock(ReflectionClass $reflection): arr $annotations = Annotations::forParents($reflection->name); return array_map( - fn (TokenizedAnnotation $annotation) => $annotation->raw(), + static fn (TokenizedAnnotation $annotation) => $annotation->raw(), $annotations, ); } diff --git a/src/Definition/Repository/Reflection/TypeResolver/ParameterTypeResolver.php b/src/Definition/Repository/Reflection/TypeResolver/ParameterTypeResolver.php index 4501ef8fb..c6c8b846a 100644 --- a/src/Definition/Repository/Reflection/TypeResolver/ParameterTypeResolver.php +++ b/src/Definition/Repository/Reflection/TypeResolver/ParameterTypeResolver.php @@ -29,9 +29,7 @@ public function resolveTypeFor(ReflectionParameter $reflection): Type $docBlockType = Annotations::forProperty($property); } - if ($docBlockType === null) { - $docBlockType = $this->extractTypeFromDocBlock($reflection); - } + $docBlockType ??= $this->extractTypeFromDocBlock($reflection); $type = $this->typeResolver->resolveType($reflection->getType(), $docBlockType); diff --git a/src/Library/Container.php b/src/Library/Container.php index 7b8cd0306..a8ed917ce 100644 --- a/src/Library/Container.php +++ b/src/Library/Container.php @@ -249,7 +249,7 @@ public function __construct(Settings $settings) return new InMemoryFunctionDefinitionRepository($repository); }, - TypeParserFactory::class => fn () => new TypeParserFactory(), + TypeParserFactory::class => static fn () => new TypeParserFactory(), TypeParser::class => fn () => $this->get(TypeParserFactory::class)->buildDefaultTypeParser(), @@ -270,7 +270,7 @@ public function __construct(Settings $settings) $this->get(ObjectBuilderFactory::class), ), - Cache::class => fn () => new KeySanitizerCache($settings->cache, $settings), + Cache::class => static fn () => new KeySanitizerCache($settings->cache, $settings), TypeFilesWatcher::class => function () use ($settings) { $classDefinitionRepository = new ReflectionClassDefinitionRepository( diff --git a/src/Library/Settings.php b/src/Library/Settings.php index 934bf1cdf..d8da07d78 100644 --- a/src/Library/Settings.php +++ b/src/Library/Settings.php @@ -90,7 +90,7 @@ final class Settings public function __construct() { $this->inferredMapping[DateTimeInterface::class] = static fn () => DateTimeImmutable::class; - $this->exceptionFilter = fn (Throwable $exception) => throw $exception; + $this->exceptionFilter = static fn (Throwable $exception) => throw $exception; } /** @@ -159,7 +159,7 @@ public function hash(): string $this->allowPermissiveTypes, $this->mapperConverterAttributes, $this->normalizerTransformerAttributes, - implode('', array_map(function (callable $callable) { + implode('', array_map(static function (callable $callable) { $reflection = new ReflectionFunction(Closure::fromCallable($callable)); return ($reflection->getClosureCalledClass()->name ?? $reflection->getFileName()) . $reflection->getStartLine() . $reflection->getEndLine(); diff --git a/src/Mapper/Object/Factory/ConstructorObjectBuilderFactory.php b/src/Mapper/Object/Factory/ConstructorObjectBuilderFactory.php index 78e34fd01..810122530 100644 --- a/src/Mapper/Object/Factory/ConstructorObjectBuilderFactory.php +++ b/src/Mapper/Object/Factory/ConstructorObjectBuilderFactory.php @@ -119,7 +119,7 @@ private function builders(ClassDefinition $class): array } if ($class->type instanceof EnumType) { - $buildersWithOneArguments = array_filter($builders, fn (ObjectBuilder $builder) => $builder->describeArguments()->count() === 1); + $buildersWithOneArguments = array_filter($builders, static fn (ObjectBuilder $builder) => $builder->describeArguments()->count() === 1); if (count($buildersWithOneArguments) === 0) { $builders[] = new NativeEnumObjectBuilder($class->type); diff --git a/src/Mapper/Source/Modifier/PathMapping.php b/src/Mapper/Source/Modifier/PathMapping.php index 2bc53d6eb..5a1a34ef2 100644 --- a/src/Mapper/Source/Modifier/PathMapping.php +++ b/src/Mapper/Source/Modifier/PathMapping.php @@ -46,7 +46,7 @@ private function map(iterable $source, array $mappings, int $depth = 0): array foreach ($source as $key => $value) { /** @var int|string $key */ - $newMappings = array_filter($mappings, fn (Mapping $mapping) => $mapping->matches($key, $depth)); + $newMappings = array_filter($mappings, static fn (Mapping $mapping) => $mapping->matches($key, $depth)); $newKey = $this->findMapping($newMappings, $depth, $key); diff --git a/src/Mapper/Tree/Builder/UnionNodeBuilder.php b/src/Mapper/Tree/Builder/UnionNodeBuilder.php index 7bac2cdb6..3d7afc0bf 100644 --- a/src/Mapper/Tree/Builder/UnionNodeBuilder.php +++ b/src/Mapper/Tree/Builder/UnionNodeBuilder.php @@ -110,7 +110,7 @@ public function build(Shell $shell): Node } elseif ($scalars !== []) { usort( $scalars, - fn (array $a, array $b): int => TypeHelper::scalarTypePriority($b['type']) <=> TypeHelper::scalarTypePriority($a['type']), + static fn (array $a, array $b): int => TypeHelper::scalarTypePriority($b['type']) <=> TypeHelper::scalarTypePriority($a['type']), ); return $scalars[0]['node']; diff --git a/src/Mapper/Tree/Exception/ObjectImplementationNotRegistered.php b/src/Mapper/Tree/Exception/ObjectImplementationNotRegistered.php index 6501eae7b..01f22a618 100644 --- a/src/Mapper/Tree/Exception/ObjectImplementationNotRegistered.php +++ b/src/Mapper/Tree/Exception/ObjectImplementationNotRegistered.php @@ -18,7 +18,7 @@ final class ObjectImplementationNotRegistered extends RuntimeException */ public function __construct(string $implementation, string $name, array $allowed) { - $allowed = implode('`, `', array_map(fn (ClassType $type) => $type->toString(), $allowed)); + $allowed = implode('`, `', array_map(static fn (ClassType $type) => $type->toString(), $allowed)); parent::__construct( "Invalid implementation `$implementation` for `$name`, it should be one of `$allowed`.", diff --git a/src/Mapper/Tree/Message/Messages.php b/src/Mapper/Tree/Message/Messages.php index 2d778fa23..77f559fec 100644 --- a/src/Mapper/Tree/Message/Messages.php +++ b/src/Mapper/Tree/Message/Messages.php @@ -69,7 +69,7 @@ public function __construct(NodeMessage ...$messages) public function errors(): self { $clone = clone $this; - $clone->messages = array_filter($this->messages, fn (NodeMessage $message) => $message->isError()); + $clone->messages = array_filter($this->messages, static fn (NodeMessage $message) => $message->isError()); return $clone; } diff --git a/src/Mapper/TypeArgumentsMapper.php b/src/Mapper/TypeArgumentsMapper.php index e9da3365d..0b83594a0 100644 --- a/src/Mapper/TypeArgumentsMapper.php +++ b/src/Mapper/TypeArgumentsMapper.php @@ -29,7 +29,7 @@ public function mapArguments(callable $callable, mixed $source): array $function = $this->functionDefinitionRepository->for($callable); $elements = array_map( - fn (ParameterDefinition $parameter) => new ShapedArrayElement( + static fn (ParameterDefinition $parameter) => new ShapedArrayElement( new StringValueType($parameter->name), $parameter->type, $parameter->isOptional, diff --git a/src/Normalizer/Transformer/Compiler/TypeFormatter/RegisteredTransformersFormatter.php b/src/Normalizer/Transformer/Compiler/TypeFormatter/RegisteredTransformersFormatter.php index 6fc8a6805..a5d098548 100644 --- a/src/Normalizer/Transformer/Compiler/TypeFormatter/RegisteredTransformersFormatter.php +++ b/src/Normalizer/Transformer/Compiler/TypeFormatter/RegisteredTransformersFormatter.php @@ -62,7 +62,7 @@ public function manipulateTransformerClass(AnonymousClassNode $class, Transforme )->asStatement(), ...array_map( - fn (int $key, Type $transformerType) => if_( + static fn (int $key, Type $transformerType) => if_( condition: new TypeAcceptNode(variable('value'), $transformerType), body: variable('next')->assign( shortClosure( diff --git a/src/Normalizer/Transformer/Compiler/TypeFormatter/ShapedArrayFormatter.php b/src/Normalizer/Transformer/Compiler/TypeFormatter/ShapedArrayFormatter.php index 65fa67285..40a210907 100644 --- a/src/Normalizer/Transformer/Compiler/TypeFormatter/ShapedArrayFormatter.php +++ b/src/Normalizer/Transformer/Compiler/TypeFormatter/ShapedArrayFormatter.php @@ -73,7 +73,7 @@ public function manipulateTransformerClass(AnonymousClassNode $class, Transforme key: 'key', item: 'item', body: variable('result')->key(variable('key'))->assign( - (function () use ($defaultDefinition, $elementsDefinitions) { + (static function () use ($defaultDefinition, $elementsDefinitions) { $match = match_(variable('key')); foreach ($elementsDefinitions as $name => $definition) { diff --git a/src/Normalizer/Transformer/Compiler/TypeFormatter/ShapedListFormatter.php b/src/Normalizer/Transformer/Compiler/TypeFormatter/ShapedListFormatter.php index 956bb2c4f..01ef03cd4 100644 --- a/src/Normalizer/Transformer/Compiler/TypeFormatter/ShapedListFormatter.php +++ b/src/Normalizer/Transformer/Compiler/TypeFormatter/ShapedListFormatter.php @@ -71,7 +71,7 @@ public function manipulateTransformerClass(AnonymousClassNode $class, Transforme key: 'key', item: 'item', body: variable('result')->key(variable('key'))->assign( - (function () use ($defaultDefinition, $elementsDefinitions) { + (static function () use ($defaultDefinition, $elementsDefinitions) { $match = match_(variable('key')); foreach ($elementsDefinitions as $name => $definition) { diff --git a/src/Normalizer/Transformer/RecursiveTransformer.php b/src/Normalizer/Transformer/RecursiveTransformer.php index 69542bc0f..f2ca4ca46 100644 --- a/src/Normalizer/Transformer/RecursiveTransformer.php +++ b/src/Normalizer/Transformer/RecursiveTransformer.php @@ -80,7 +80,7 @@ private function doTransform(mixed $value, WeakMap $references, array $attribute // First chunk of transformers to be used: attributes, coming from // class or property. ...array_map( - fn (AttributeDefinition $attribute) => $attribute->instantiate()->normalize(...), // @phpstan-ignore-line / We know the method exists + static fn (AttributeDefinition $attribute) => $attribute->instantiate()->normalize(...), // @phpstan-ignore-line / We know the method exists $attributes, ), // Second chunk of transformers to be used: registered transformers. @@ -100,7 +100,7 @@ private function nextTransformer(array $transformers, mixed $value): callable $transformer = array_shift($transformers); if ($transformers === []) { - return fn () => $transformer($value); + return static fn () => $transformer($value); } $function = $this->functionDefinitionRepository->for($transformer); diff --git a/src/Type/Parser/Exception/Callable/ExpectedClosingParenthesisAfterCallable.php b/src/Type/Parser/Exception/Callable/ExpectedClosingParenthesisAfterCallable.php index 46dab4b99..df23a895b 100644 --- a/src/Type/Parser/Exception/Callable/ExpectedClosingParenthesisAfterCallable.php +++ b/src/Type/Parser/Exception/Callable/ExpectedClosingParenthesisAfterCallable.php @@ -19,7 +19,7 @@ final class ExpectedClosingParenthesisAfterCallable extends RuntimeException imp */ public function __construct(array $parameters) { - $parameters = implode(', ', array_map(fn (Type $type) => $type->toString(), $parameters)); + $parameters = implode(', ', array_map(static fn (Type $type) => $type->toString(), $parameters)); parent::__construct("Expected closing parenthesis after `callable($parameters`."); } diff --git a/src/Type/Parser/Exception/Callable/ExpectedColonAfterCallableClosingParenthesis.php b/src/Type/Parser/Exception/Callable/ExpectedColonAfterCallableClosingParenthesis.php index 3d23a9129..539e10684 100644 --- a/src/Type/Parser/Exception/Callable/ExpectedColonAfterCallableClosingParenthesis.php +++ b/src/Type/Parser/Exception/Callable/ExpectedColonAfterCallableClosingParenthesis.php @@ -19,7 +19,7 @@ final class ExpectedColonAfterCallableClosingParenthesis extends RuntimeExceptio */ public function __construct(array $parameters) { - $parameters = implode(', ', array_map(fn (Type $type) => $type->toString(), $parameters)); + $parameters = implode(', ', array_map(static fn (Type $type) => $type->toString(), $parameters)); parent::__construct("Expected `:` to define return type after `callable($parameters)`."); } diff --git a/src/Type/Parser/Exception/Callable/ExpectedReturnTypeAfterCallableColon.php b/src/Type/Parser/Exception/Callable/ExpectedReturnTypeAfterCallableColon.php index 5814dd438..2eac36aac 100644 --- a/src/Type/Parser/Exception/Callable/ExpectedReturnTypeAfterCallableColon.php +++ b/src/Type/Parser/Exception/Callable/ExpectedReturnTypeAfterCallableColon.php @@ -19,7 +19,7 @@ final class ExpectedReturnTypeAfterCallableColon extends RuntimeException implem */ public function __construct(array $parameters) { - $parameters = implode(', ', array_map(fn (Type $type) => $type->toString(), $parameters)); + $parameters = implode(', ', array_map(static fn (Type $type) => $type->toString(), $parameters)); parent::__construct("Expected return type after `callable($parameters):`."); } diff --git a/src/Type/Parser/Exception/Callable/UnexpectedTokenAfterCallableClosingParenthesis.php b/src/Type/Parser/Exception/Callable/UnexpectedTokenAfterCallableClosingParenthesis.php index a0476b59c..cd663eac6 100644 --- a/src/Type/Parser/Exception/Callable/UnexpectedTokenAfterCallableClosingParenthesis.php +++ b/src/Type/Parser/Exception/Callable/UnexpectedTokenAfterCallableClosingParenthesis.php @@ -20,7 +20,7 @@ final class UnexpectedTokenAfterCallableClosingParenthesis extends RuntimeExcept */ public function __construct(array $parameters, Token $token) { - $parameters = implode(', ', array_map(fn (Type $type) => $type->toString(), $parameters)); + $parameters = implode(', ', array_map(static fn (Type $type) => $type->toString(), $parameters)); parent::__construct( "Expected `:` to define return type after `callable($parameters)`, got `{$token->symbol()}`.", diff --git a/src/Type/Parser/Exception/Generic/CannotAssignGeneric.php b/src/Type/Parser/Exception/Generic/CannotAssignGeneric.php index fe83f6d6a..06649e1e0 100644 --- a/src/Type/Parser/Exception/Generic/CannotAssignGeneric.php +++ b/src/Type/Parser/Exception/Generic/CannotAssignGeneric.php @@ -24,7 +24,7 @@ final class CannotAssignGeneric extends RuntimeException implements InvalidType public function __construct(string $className, array $templates, array $generics) { $generics = array_slice($generics, count($templates)); - $list = implode('`, `', array_map(fn (Type $type) => $type->toString(), $generics)); + $list = implode('`, `', array_map(static fn (Type $type) => $type->toString(), $generics)); parent::__construct("Could not find a template to assign the generic(s) `$list` for the class `$className`."); } diff --git a/src/Type/Parser/Exception/Generic/GenericClosingBracketMissing.php b/src/Type/Parser/Exception/Generic/GenericClosingBracketMissing.php index 0a6cde56f..573df0bd7 100644 --- a/src/Type/Parser/Exception/Generic/GenericClosingBracketMissing.php +++ b/src/Type/Parser/Exception/Generic/GenericClosingBracketMissing.php @@ -20,7 +20,7 @@ final class GenericClosingBracketMissing extends RuntimeException implements Inv */ public function __construct(string $className, array $generics) { - $signature = $className . '<' . implode(', ', array_map(fn (Type $type) => $type->toString(), $generics)) . '>'; + $signature = $className . '<' . implode(', ', array_map(static fn (Type $type) => $type->toString(), $generics)) . '>'; parent::__construct("The closing bracket is missing for the generic `$signature`."); } diff --git a/src/Type/Parser/Exception/Generic/GenericCommaMissing.php b/src/Type/Parser/Exception/Generic/GenericCommaMissing.php index 1a5cf7b37..bbac38591 100644 --- a/src/Type/Parser/Exception/Generic/GenericCommaMissing.php +++ b/src/Type/Parser/Exception/Generic/GenericCommaMissing.php @@ -20,7 +20,7 @@ final class GenericCommaMissing extends RuntimeException implements InvalidType */ public function __construct(string $className, array $generics) { - $signature = $className . '<' . implode(', ', array_map(fn (Type $type) => $type->toString(), $generics)) . ', ?>'; + $signature = $className . '<' . implode(', ', array_map(static fn (Type $type) => $type->toString(), $generics)) . ', ?>'; parent::__construct("A comma is missing for the generic `$signature`."); } diff --git a/src/Type/Parser/Exception/Generic/MissingGenerics.php b/src/Type/Parser/Exception/Generic/MissingGenerics.php index 709d44789..d0befec2a 100644 --- a/src/Type/Parser/Exception/Generic/MissingGenerics.php +++ b/src/Type/Parser/Exception/Generic/MissingGenerics.php @@ -25,7 +25,7 @@ public function __construct(string $className, array $generics, array $templates { /** @var positive-int $missing */ $missing = count($templates) - count($generics); - $generics = array_map(fn (Type $type) => $type->toString(), $generics); + $generics = array_map(static fn (Type $type) => $type->toString(), $generics); $generics += array_fill(count($generics), $missing, '?'); $signature = $className . '<' . implode(', ', $generics) . '>'; diff --git a/src/Type/Parser/Exception/Iterable/ShapedArrayUnexpectedTokenAfterSealedType.php b/src/Type/Parser/Exception/Iterable/ShapedArrayUnexpectedTokenAfterSealedType.php index 528ca1c69..93d01b468 100644 --- a/src/Type/Parser/Exception/Iterable/ShapedArrayUnexpectedTokenAfterSealedType.php +++ b/src/Type/Parser/Exception/Iterable/ShapedArrayUnexpectedTokenAfterSealedType.php @@ -20,7 +20,7 @@ final class ShapedArrayUnexpectedTokenAfterSealedType extends RuntimeException i */ public function __construct(string $signature, Type $unsealedType, array $unexpectedTokens) { - $unexpected = implode('', array_map(fn (Token $token) => $token->symbol(), $unexpectedTokens)); + $unexpected = implode('', array_map(static fn (Token $token) => $token->symbol(), $unexpectedTokens)); $signature .= ', ...' . $unsealedType->toString() . $unexpected; diff --git a/src/Type/Parser/Exception/Iterable/ShapedListMixedKeys.php b/src/Type/Parser/Exception/Iterable/ShapedListMixedKeys.php index 02b6acb65..732078d0b 100644 --- a/src/Type/Parser/Exception/Iterable/ShapedListMixedKeys.php +++ b/src/Type/Parser/Exception/Iterable/ShapedListMixedKeys.php @@ -20,7 +20,7 @@ final class ShapedListMixedKeys extends RuntimeException implements InvalidType */ public function __construct(array $elements) { - $hasOptional = array_filter($elements, fn (ShapedArrayElement $element) => $element->isOptional()) !== []; + $hasOptional = array_filter($elements, static fn (ShapedArrayElement $element) => $element->isOptional()) !== []; $parts = array_map( static fn (ShapedArrayElement $element) => $hasOptional ? $element->key()->value() . ($element->isOptional() ? '?: ' : ': ') . $element->type()->toString() diff --git a/src/Type/Parser/Lexer/Token/KeyOfToken.php b/src/Type/Parser/Lexer/Token/KeyOfToken.php index 9373b9f64..b6ae5e655 100644 --- a/src/Type/Parser/Lexer/Token/KeyOfToken.php +++ b/src/Type/Parser/Lexer/Token/KeyOfToken.php @@ -46,7 +46,7 @@ public function traverse(TokenStream $stream): Type if ($subType instanceof EnumType) { $keys = array_map( - fn (UnitEnum $case) => StringValueType::quoted("'$case->name'"), + static fn (UnitEnum $case) => StringValueType::quoted("'$case->name'"), array_values($subType->cases()), ); diff --git a/src/Type/Parser/Lexer/Token/ValueOfToken.php b/src/Type/Parser/Lexer/Token/ValueOfToken.php index 62f511e77..ee87e750b 100644 --- a/src/Type/Parser/Lexer/Token/ValueOfToken.php +++ b/src/Type/Parser/Lexer/Token/ValueOfToken.php @@ -48,7 +48,7 @@ public function traverse(TokenStream $stream): Type if ($subType instanceof EnumType && is_a($subType->className(), BackedEnum::class, true)) { $cases = array_map( // @phpstan-ignore-next-line / We know it's a BackedEnum - fn (BackedEnum $case) => ValueTypeFactory::from($case->value), + static fn (BackedEnum $case) => ValueTypeFactory::from($case->value), array_values($subType->cases()), ); @@ -61,7 +61,7 @@ public function traverse(TokenStream $stream): Type if ($subType instanceof ShapedArrayType || $subType instanceof ShapedListType) { $types = array_map( - fn ($element) => $element->type(), + static fn ($element) => $element->type(), array_values($subType->elements), ); diff --git a/src/Type/Types/EnumType.php b/src/Type/Types/EnumType.php index 4af15f892..dec153400 100644 --- a/src/Type/Types/EnumType.php +++ b/src/Type/Types/EnumType.php @@ -150,7 +150,7 @@ public function readableSignature(): string { // PHP8.5 use pipes return implode('|', array_map( - fn ($key) => is_string($key) ? "'$key'" : $key, + static fn ($key) => is_string($key) ? "'$key'" : $key, array_keys($this->cases), )); } diff --git a/src/Type/Types/IntersectionType.php b/src/Type/Types/IntersectionType.php index e72430c09..25d32bcdc 100644 --- a/src/Type/Types/IntersectionType.php +++ b/src/Type/Types/IntersectionType.php @@ -61,7 +61,7 @@ public function accepts(mixed $value): bool public function compiledAccept(Node $node): Node { return logicalAnd(...array_map( - fn (Type $type) => $type->compiledAccept($node), + static fn (Type $type) => $type->compiledAccept($node), $this->types, )); } diff --git a/src/Type/Types/ShapedArrayType.php b/src/Type/Types/ShapedArrayType.php index c8073d2b7..7bd352b3e 100644 --- a/src/Type/Types/ShapedArrayType.php +++ b/src/Type/Types/ShapedArrayType.php @@ -108,7 +108,7 @@ public function compiledAccept(Node $node): Node { $conditions = [ call('is_array', [$node]), - ...array_map(function (ShapedArrayElement $element) use ($node) { + ...array_map(static function (ShapedArrayElement $element) use ($node) { $key = value($element->key()->value()); return ternary( @@ -230,7 +230,7 @@ public function traverse(): array public function replace(callable $callback): Type { $elements = array_map( - fn (ShapedArrayElement $element) => new ShapedArrayElement( + static fn (ShapedArrayElement $element) => new ShapedArrayElement( $element->key(), $callback($element->type()), $element->isOptional(), diff --git a/src/Type/Types/ShapedListType.php b/src/Type/Types/ShapedListType.php index 1cff5b903..12d0a1af2 100644 --- a/src/Type/Types/ShapedListType.php +++ b/src/Type/Types/ShapedListType.php @@ -113,7 +113,7 @@ public function compiledAccept(Node $node): Node $conditions = [ call('is_array', [$node]), call('array_is_list', [$node]), - ...array_map(function (ShapedArrayElement $element) use ($node) { + ...array_map(static function (ShapedArrayElement $element) use ($node) { $key = value($element->key()->value()); return ternary( @@ -228,7 +228,7 @@ public function traverse(): array public function replace(callable $callback): Type { $elements = array_map( - fn (ShapedArrayElement $element) => new ShapedArrayElement( + static fn (ShapedArrayElement $element) => new ShapedArrayElement( $element->key(), $callback($element->type()), $element->isOptional(), diff --git a/src/Type/Types/UnionType.php b/src/Type/Types/UnionType.php index 9dd516cc4..bfddda64e 100644 --- a/src/Type/Types/UnionType.php +++ b/src/Type/Types/UnionType.php @@ -77,7 +77,7 @@ public function compiledAccept(Node $node): Node { return logicalOr( ...array_map( - fn (Type $type) => $type->compiledAccept($node), + static fn (Type $type) => $type->compiledAccept($node), $this->types, ) ); diff --git a/src/Utility/ValueDumper.php b/src/Utility/ValueDumper.php index f1406d20f..48642598c 100644 --- a/src/Utility/ValueDumper.php +++ b/src/Utility/ValueDumper.php @@ -131,7 +131,7 @@ private static function doDump(mixed $value, bool $goDeeper = true): string /** * @param iterable $iterable - * @return array + * @return list */ private static function listValues(iterable $iterable): array { diff --git a/structarmed.php b/structarmed.php new file mode 100644 index 000000000..1050cfe84 --- /dev/null +++ b/structarmed.php @@ -0,0 +1,94 @@ +layer('Source', ['qa', 'src']) + + // layers definition for ruleset uses + ->layer('Utility', 'src/Utility') + ->layer('UtilityReflection', 'src/Utility/Reflection') + ->layer('UtilityString', 'src/Utility/String') + ->layer('Compiler', 'src/Compiler') + ->layer('CompilerLibrary', 'src/Compiler/Library') + ->layer('CompilerNative', 'src/Compiler/Native') + ->layer('Type', 'src/Type') + ->layer('TypeDumper', 'src/Type/Dumper') + ->layer('TypeParser', 'src/Type/Parser') + ->layer('TypeTypes', 'src/Type/Types') + ->layer('Definition', 'src/Definition') + ->layer('DefinitionRepository', 'src/Definition/Repository') + ->layer('DefinitionRepositoryCache', 'src/Definition/Repository/Cache') + ->layer('DefinitionRepositoryReflection', 'src/Definition/Repository/Reflection') + ->layer('Cache', 'src/Cache') + ->layer('CacheException', 'src/Cache/Exception') + ->layer('CacheWarmup', 'src/Cache/Warmup') + ->layer('Mapper', 'src/Mapper') + ->layer('MapperConfigurator', 'src/Mapper/Configurator') + ->layer('MapperException', 'src/Mapper/Exception') + ->layer('MapperHttp', 'src/Mapper/Http') + ->layer('MapperObject', 'src/Mapper/Object') + ->layer('MapperSource', 'src/Mapper/Source') + ->layer('MapperTree', 'src/Mapper/Tree') + ->layer('MapperTreeBuilder', 'src/Mapper/Tree/Builder') + ->layer('MapperTreeException', 'src/Mapper/Tree/Exception') + ->layer('MapperTreeMessage', 'src/Mapper/Tree/Message') + ->layer('Normalizer', 'src/Normalizer') + ->layer('NormalizerConfigurator', 'src/Normalizer/Configurator') + ->layer('NormalizerException', 'src/Normalizer/Exception') + ->layer('NormalizerFormatter', 'src/Normalizer/Formatter') + ->layer('NormalizerTransformer', 'src/Normalizer/Transformer') + ->layer('Library', 'src/Library') + ->layer('Builder', [ + 'src/MapperBuilder.php', + 'src/NormalizerBuilder.php', + ]) + ->layer('QA', [ + 'qa/Benchmark', + 'qa/PHPStan', + 'qa/Psalm', + ]) + ->ruleset([ + 'UtilityString' => [], + 'UtilityReflection' => ['TypeParser'], + 'Utility' => ['MapperHttp', 'Type'], + 'Compiler' => [], + 'CompilerNative' => ['Compiler'], + 'CompilerLibrary' => ['Compiler', 'Definition', 'Type'], + 'Type' => ['Compiler', 'MapperTreeMessage'], + 'TypeParser' => ['Type', 'Utility'], + 'TypeTypes' => ['Compiler', '+Definition', 'MapperTreeMessage'], + 'TypeDumper' => ['+Definition', 'MapperObject', 'MapperTreeBuilder', 'MapperTreeException'], + 'Definition' => ['Type', 'Utility'], + 'DefinitionRepository' => ['Definition', 'Type'], + 'DefinitionRepositoryCache' => ['Cache', 'Definition', 'Type', 'UtilityReflection'], + 'DefinitionRepositoryReflection' => ['Definition', 'Mapper', 'Normalizer', 'Type', 'UtilityReflection'], + 'Cache' => ['+Definition', 'Library'], + 'CacheException' => ['TypeTypes'], + 'CacheWarmup' => ['CacheException', 'DefinitionRepository', 'MapperObject', 'MapperTreeBuilder', 'Type', 'Utility'], + 'MapperTreeMessage' => ['UtilityString'], + 'MapperException' => ['Definition', 'Type'], + 'MapperHttp' => ['MapperException'], + 'Mapper' => ['Definition', 'TypeParser', 'TypeTypes', 'Utility'], + 'MapperConfigurator' => ['Builder', 'Mapper'], + 'MapperSource' => ['MapperConfigurator'], + 'MapperObject' => ['Builder', '+Definition', 'MapperTreeException', 'MapperTreeMessage'], + 'MapperTree' => ['+Definition', 'Library'], + 'MapperTreeException' => ['+Definition', '+MapperException', 'MapperObject', 'MapperTree'], + 'MapperTreeBuilder' => ['+Definition', 'MapperConfigurator', 'MapperHttp', 'MapperObject', 'MapperTree'], + 'Normalizer' => [], + 'NormalizerException' => ['Definition', 'Type'], + 'NormalizerConfigurator' => ['Builder', 'Normalizer'], + 'NormalizerTransformer' => ['Cache', 'Compiler', '+Definition', '+NormalizerException'], + 'NormalizerFormatter' => ['NormalizerConfigurator', 'NormalizerException', 'NormalizerTransformer'], + 'Library' => ['Cache', 'Definition', 'Mapper', 'Normalizer', 'TypeDumper', 'TypeParser'], + 'Builder' => ['Cache', 'Library', 'Mapper', 'Normalizer'], + 'QA' => ['Builder', 'Mapper', 'Utility'], + ]) + + ->withPresets(Preset::PSR4(), Preset::CODEQUALITY()); diff --git a/tests/Integration/Mapping/Type/ShapedListMappingTest.php b/tests/Integration/Mapping/Type/ShapedListMappingTest.php index 807c70c63..08c3c34fa 100644 --- a/tests/Integration/Mapping/Type/ShapedListMappingTest.php +++ b/tests/Integration/Mapping/Type/ShapedListMappingTest.php @@ -84,10 +84,7 @@ public function test_unsealed_list_accepts_extra_elements(): void public function test_unsealed_list_without_type_accepts_any_extra_elements_with_permissive_types(): void { try { - /** - * @var array $result - * @phpstan-ignore varTag.type - */ + /** @var array $result */ $result = $this->mapperBuilder() ->allowPermissiveTypes() ->mapper()