From 21fd6977ca7da4a0855fb444fd3fb87f474a2822 Mon Sep 17 00:00:00 2001 From: roxblnfk Date: Tue, 8 Sep 2026 10:44:18 +0400 Subject: [PATCH 1/4] refactor: replace the in-tree DI container with internal/container Drops src/Service/Container.php in favour of internal/container's ObjectContainer, whose public surface is a superset of the old one. yiisoft/injector leaves the root require and becomes a transitive dependency. Config hydration moved out of a hard-coded namespace check in make() into a container inflector. ConfigInflector and its attributes are ported verbatim from the reference implementation under Buggregator\Trap\Application\Config\Internal (only Testo\Common\ErrorReporter is swapped for the Trap Logger), so the whole subtree can later be extracted into a package or container module by swapping the namespace alone. Config classes now opt in with the #[InflectableConfig] marker attribute instead of relying on their FQCN prefix. Assisted-By: Claude Opus 4.8 (1M context) --- composer.json | 4 +- composer.lock | 868 ++++++++++-------- src/Application.php | 2 +- .../Internal/Attribute/ConfigAttribute.php | 12 + .../Config/Internal/Attribute/Env.php | 23 + .../Internal/Attribute/InflectableConfig.php | 13 + .../Internal/Attribute/InputArgument.php | 23 + .../Config/Internal/Attribute/InputOption.php | 23 + .../Config/Internal/Attribute/PhpIni.php | 23 + .../Config/Internal/Attribute/XPath.php | 25 + .../Config/Internal/Attribute/XPathEmbed.php | 26 + .../Internal/Attribute/XPathEmbedList.php | 26 + .../Config/Internal/ConfigInflector.php | 277 ++++++ src/Bootstrap.php | 14 +- src/Command/Run.php | 2 +- src/Config/Server/App.php | 4 +- src/Config/Server/Files/SPX.php | 4 +- src/Config/Server/Files/XDebug.php | 4 +- src/Config/Server/Files/XHProf.php | 6 +- src/Config/Server/Frontend.php | 8 +- src/Config/Server/Frontend/EventStorage.php | 4 +- src/Config/Server/TcpPorts.php | 6 +- src/Service/Config/ConfigAttribute.php | 10 - src/Service/Config/ConfigLoader.php | 111 --- src/Service/Config/Env.php | 16 - src/Service/Config/InputArgument.php | 16 - src/Service/Config/InputOption.php | 16 - src/Service/Config/PhpIni.php | 16 - src/Service/Config/XPath.php | 17 - src/Service/Container.php | 124 --- src/Service/FilesObserver/Handler.php | 2 +- .../Config/Internal/ConfigInflectorTest.php} | 44 +- 32 files changed, 1011 insertions(+), 758 deletions(-) create mode 100644 src/Application/Config/Internal/Attribute/ConfigAttribute.php create mode 100644 src/Application/Config/Internal/Attribute/Env.php create mode 100644 src/Application/Config/Internal/Attribute/InflectableConfig.php create mode 100644 src/Application/Config/Internal/Attribute/InputArgument.php create mode 100644 src/Application/Config/Internal/Attribute/InputOption.php create mode 100644 src/Application/Config/Internal/Attribute/PhpIni.php create mode 100644 src/Application/Config/Internal/Attribute/XPath.php create mode 100644 src/Application/Config/Internal/Attribute/XPathEmbed.php create mode 100644 src/Application/Config/Internal/Attribute/XPathEmbedList.php create mode 100644 src/Application/Config/Internal/ConfigInflector.php delete mode 100644 src/Service/Config/ConfigAttribute.php delete mode 100644 src/Service/Config/ConfigLoader.php delete mode 100644 src/Service/Config/Env.php delete mode 100644 src/Service/Config/InputArgument.php delete mode 100644 src/Service/Config/InputOption.php delete mode 100644 src/Service/Config/PhpIni.php delete mode 100644 src/Service/Config/XPath.php delete mode 100644 src/Service/Container.php rename tests/Unit/{Service/Config/ConfigLoaderTest.php => Application/Config/Internal/ConfigInflectorTest.php} (69%) diff --git a/composer.json b/composer.json index a2fef773..066a9732 100644 --- a/composer.json +++ b/composer.json @@ -41,6 +41,7 @@ "ext-filter": "*", "ext-sockets": "*", "clue/stream-filter": "^1.6", + "internal/container": "^1.0", "internal/destroy": "^1.0", "nyholm/psr7": "^1.8", "php-http/message": "^1.15", @@ -48,8 +49,7 @@ "psr/http-message": "^1.1 || ^2", "psr/log": "^2 || ^3", "symfony/console": "^6.4 || ^7 || ^8", - "symfony/var-dumper": "^6.3 || ^7 || ^8", - "yiisoft/injector": "^1.2" + "symfony/var-dumper": "^6.3 || ^7 || ^8" }, "require-dev": { "dereuromark/composer-prefer-lowest": "^0.1.10", diff --git a/composer.lock b/composer.lock index cb7d7713..d229eb4e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "801a4d8130bec361cced423e73f5c798", + "content-hash": "4938a1b4bcbf20d13de777cf634dbd3c", "packages": [ { "name": "clue/stream-filter", @@ -72,6 +72,75 @@ ], "time": "2023-12-20T15:40:13+00:00" }, + { + "name": "internal/container", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-internal/container.git", + "reference": "3ea996260fe8459b6fd17e575bef11a0f022df92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-internal/container/zipball/3ea996260fe8459b6fd17e575bef11a0f022df92", + "reference": "3ea996260fe8459b6fd17e575bef11a0f022df92", + "shasum": "" + }, + "require": { + "internal/destroy": "^1.0", + "php": ">=8.2", + "psr/container": "1 - 2", + "yiisoft/injector": "^1.2" + }, + "provide": { + "psr/container-implementation": "1.0 - 2.0" + }, + "require-dev": { + "llm/skills": "^1.12", + "revolt/event-loop": "^1.0", + "spiral/code-style": "^2.3.1", + "testo/codecov": "^0.2.1", + "testo/fiber": "^0.1.3", + "testo/testo": "^0.10.46", + "vimeo/psalm": "^6.10 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Internal\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Lightweight PSR-11 container for CLI tools: autowiring, scopes, inflectors and explicit destruction without a DI framework.", + "keywords": [ + "Autowiring", + "PSR-11", + "cli", + "console", + "container", + "dependency injection" + ], + "support": { + "issues": "https://github.com/php-internal/container/issues", + "source": "https://github.com/php-internal/container/tree/1.0.1" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-09-07T21:11:07+00:00" + }, { "name": "internal/destroy", "version": "1.0.0", @@ -491,47 +560,49 @@ }, { "name": "symfony/console", - "version": "v6.4.30", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "1b2813049506b39eb3d7e64aff033fd5ca26c97e" + "reference": "b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1b2813049506b39eb3d7e64aff033fd5ca26c97e", - "reference": "1b2813049506b39eb3d7e64aff033fd5ca26c97e", + "url": "https://api.github.com/repos/symfony/console/zipball/b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d", + "reference": "b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.4.1", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php85": "^1.32", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0|^7.0" + "symfony/string": "^7.4.6|^8.0.6" }, "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" + "symfony/dependency-injection": "<8.1", + "symfony/event-dispatcher": "<8.1" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^8.1", + "symfony/event-dispatcher": "^8.1", + "symfony/filesystem": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/lock": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -565,7 +636,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.30" + "source": "https://github.com/symfony/console/tree/v8.1.1" }, "funding": [ { @@ -585,20 +656,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T13:47:41+00:00" + "time": "2026-06-16T12:55:20+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": { @@ -611,7 +682,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -636,7 +707,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": [ { @@ -647,25 +718,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/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": { @@ -715,7 +790,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": [ { @@ -735,20 +810,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.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "reference": "e9247d281d694a5120554d9afaf54e070e88a603" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603", + "reference": "e9247d281d694a5120554d9afaf54e070e88a603", "shasum": "" }, "require": { @@ -797,7 +872,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1" }, "funding": [ { @@ -817,20 +892,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2026-05-26T05:58:03+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "version": "v1.38.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", "shasum": "" }, "require": { @@ -882,7 +957,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0" }, "funding": [ { @@ -902,20 +977,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-05-25T13:48:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "version": "v1.38.2", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", "shasum": "" }, "require": { @@ -967,7 +1042,87 @@ "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": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-27T06:59:30+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.38.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", + "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.38.1" }, "funding": [ { @@ -987,20 +1142,20 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2026-05-26T02:25:22+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.6.1", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/c0a284bab1ed8aa0417e3d69250ab437739563a0", + "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0", "shasum": "" }, "require": { @@ -1018,7 +1173,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -1054,7 +1209,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.1" }, "funding": [ { @@ -1074,37 +1229,38 @@ "type": "tidelift" } ], - "time": "2025-07-15T11:30:57+00:00" + "time": "2026-06-16T09:55:08+00:00" }, { "name": "symfony/string", - "version": "v6.4.30", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb" + "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb", + "url": "https://api.github.com/repos/symfony/string/zipball/afd5944f4005862d961efb85c8bbd5c523c4e3c9", + "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/intl": "^6.2|^7.0", + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" + "symfony/var-exporter": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -1143,7 +1299,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.30" + "source": "https://github.com/symfony/string/tree/v8.1.0" }, "funding": [ { @@ -1163,37 +1319,36 @@ "type": "tidelift" } ], - "time": "2025-11-21T18:03:05+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.26", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "cfae1497a2f1eaad78dbc0590311c599c7178d4a" + "reference": "40096a2515a979f3125c5c928603995b8664c62a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cfae1497a2f1eaad78dbc0590311c599c7178d4a", - "reference": "cfae1497a2f1eaad78dbc0590311c599c7178d4a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/40096a2515a979f3125c5c928603995b8664c62a", + "reference": "40096a2515a979f3125c5c928603995b8664c62a", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=8.4.1", + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<7.4", + "symfony/error-handler": "<7.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^6.3|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/console": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", + "twig/twig": "^3.12" }, "bin": [ "Resources/bin/var-dump-server" @@ -1231,7 +1386,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.26" + "source": "https://github.com/symfony/var-dumper/tree/v8.1.1" }, "funding": [ { @@ -1251,7 +1406,7 @@ "type": "tidelift" } ], - "time": "2025-09-25T15:37:27+00:00" + "time": "2026-06-09T10:54:51+00:00" }, { "name": "yiisoft/injector", @@ -1333,16 +1488,16 @@ "packages-dev": [ { "name": "amphp/amp", - "version": "v3.1.1", + "version": "v3.1.2", "source": { "type": "git", "url": "https://github.com/amphp/amp.git", - "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f" + "reference": "2f3ebed5a4f663968a0590dbb7654a8b32cb63cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/fa0ab33a6f47a82929c38d03ca47ebb71086a93f", - "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f", + "url": "https://api.github.com/repos/amphp/amp/zipball/2f3ebed5a4f663968a0590dbb7654a8b32cb63cb", + "reference": "2f3ebed5a4f663968a0590dbb7654a8b32cb63cb", "shasum": "" }, "require": { @@ -1352,7 +1507,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": { @@ -1402,7 +1557,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.2" }, "funding": [ { @@ -1410,7 +1565,7 @@ "type": "github" } ], - "time": "2025-08-27T21:42:00+00:00" + "time": "2026-06-21T13:59:44+00:00" }, { "name": "amphp/byte-stream", @@ -1643,16 +1798,16 @@ }, { "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": { @@ -1672,7 +1827,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": { @@ -1715,7 +1870,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": [ { @@ -1723,7 +1878,7 @@ "type": "github" } ], - "time": "2025-11-15T06:23:42+00:00" + "time": "2026-05-16T16:54:01+00:00" }, { "name": "amphp/parser", @@ -1789,16 +1944,16 @@ }, { "name": "amphp/pipeline", - "version": "v1.2.3", + "version": "v1.2.5", "source": { "type": "git", "url": "https://github.com/amphp/pipeline.git", - "reference": "7b52598c2e9105ebcddf247fc523161581930367" + "reference": "92f121dde31cd1d89d5d0f9eba64ac40271b236e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/pipeline/zipball/7b52598c2e9105ebcddf247fc523161581930367", - "reference": "7b52598c2e9105ebcddf247fc523161581930367", + "url": "https://api.github.com/repos/amphp/pipeline/zipball/92f121dde31cd1d89d5d0f9eba64ac40271b236e", + "reference": "92f121dde31cd1d89d5d0f9eba64ac40271b236e", "shasum": "" }, "require": { @@ -1810,7 +1965,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": { @@ -1844,7 +1999,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.5" }, "funding": [ { @@ -1852,20 +2007,20 @@ "type": "github" } ], - "time": "2025-03-16T16:33:53+00:00" + "time": "2026-06-27T14:17:20+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": { @@ -1879,7 +2034,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": { @@ -1912,7 +2067,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": [ { @@ -1920,28 +2075,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": { @@ -1976,22 +2134,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.0", "source": { "type": "git", "url": "https://github.com/amphp/socket.git", - "reference": "58e0422221825b79681b72c50c47a930be7bf1e1" + "reference": "dadb63c5d3179fd83803e29dfeac27350e619314" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/socket/zipball/58e0422221825b79681b72c50c47a930be7bf1e1", - "reference": "58e0422221825b79681b72c50c47a930be7bf1e1", + "url": "https://api.github.com/repos/amphp/socket/zipball/dadb63c5d3179fd83803e29dfeac27350e619314", + "reference": "dadb63c5d3179fd83803e29dfeac27350e619314", "shasum": "" }, "require": { @@ -2000,17 +2164,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": { @@ -2054,7 +2218,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.0" }, "funding": [ { @@ -2062,7 +2226,7 @@ "type": "github" } ], - "time": "2024-04-21T14:33:03+00:00" + "time": "2026-04-19T15:09:56+00:00" }, { "name": "amphp/sync", @@ -2363,22 +2527,22 @@ }, { "name": "danog/advanced-json-rpc", - "version": "v3.2.2", + "version": "v3.2.3", "source": { "type": "git", "url": "https://github.com/danog/php-advanced-json-rpc.git", - "reference": "aadb1c4068a88c3d0530cfe324b067920661efcb" + "reference": "ae703ea7b4811797a10590b6078de05b3b33dd91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/danog/php-advanced-json-rpc/zipball/aadb1c4068a88c3d0530cfe324b067920661efcb", - "reference": "aadb1c4068a88c3d0530cfe324b067920661efcb", + "url": "https://api.github.com/repos/danog/php-advanced-json-rpc/zipball/ae703ea7b4811797a10590b6078de05b3b33dd91", + "reference": "ae703ea7b4811797a10590b6078de05b3b33dd91", "shasum": "" }, "require": { "netresearch/jsonmapper": "^5", "php": ">=8.1", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0 || ^6" }, "replace": { "felixfbecker/php-advanced-json-rpc": "^3" @@ -2409,9 +2573,9 @@ "description": "A more advanced JSONRPC implementation", "support": { "issues": "https://github.com/danog/php-advanced-json-rpc/issues", - "source": "https://github.com/danog/php-advanced-json-rpc/tree/v3.2.2" + "source": "https://github.com/danog/php-advanced-json-rpc/tree/v3.2.3" }, - "time": "2025-02-14T10:55:15+00:00" + "time": "2026-01-12T21:07:10+00:00" }, { "name": "daverandom/libdns", @@ -2545,29 +2709,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": { @@ -2587,32 +2751,32 @@ "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": "ergebnis/phpunit-slow-test-detector", - "version": "2.20.0", + "version": "2.24.0", "source": { "type": "git", "url": "https://github.com/ergebnis/phpunit-slow-test-detector.git", - "reference": "36225d36071cb0e7aae3e05a8baa82ace28e1094" + "reference": "e713c1397b09e07892657cdf909731d29481ff4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/phpunit-slow-test-detector/zipball/36225d36071cb0e7aae3e05a8baa82ace28e1094", - "reference": "36225d36071cb0e7aae3e05a8baa82ace28e1094", + "url": "https://api.github.com/repos/ergebnis/phpunit-slow-test-detector/zipball/e713c1397b09e07892657cdf909731d29481ff4c", + "reference": "e713c1397b09e07892657cdf909731d29481ff4c", "shasum": "" }, "require": { "php": "~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", - "phpunit/phpunit": "^6.5.0 || ^7.5.0 || ^8.5.19 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0" + "phpunit/phpunit": "^6.5.0 || ^7.5.0 || ^8.5.19 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.47.0", - "ergebnis/license": "^2.6.0", - "ergebnis/php-cs-fixer-config": "^6.52.0", + "ergebnis/composer-normalize": "^2.50.0", + "ergebnis/license": "^2.7.0", + "ergebnis/php-cs-fixer-config": "^6.60.1", "fakerphp/faker": "~1.20.0", "phpstan/extension-installer": "^1.4.3", "phpstan/phpstan": "^1.12.11", @@ -2662,7 +2826,7 @@ "security": "https://github.com/ergebnis/phpunit-slow-test-detector/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/phpunit-slow-test-detector" }, - "time": "2025-08-19T07:48:39+00:00" + "time": "2026-03-13T10:52:55+00:00" }, { "name": "felixfbecker/language-server-protocol", @@ -2783,23 +2947,23 @@ }, { "name": "google/protobuf", - "version": "v4.33.2", + "version": "v4.33.6", "source": { "type": "git", "url": "https://github.com/protocolbuffers/protobuf-php.git", - "reference": "fbd96b7bf1343f4b0d8fb358526c7ba4d72f1318" + "reference": "84b008c23915ed94536737eae46f41ba3bccfe67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/fbd96b7bf1343f4b0d8fb358526c7ba4d72f1318", - "reference": "fbd96b7bf1343f4b0d8fb358526c7ba4d72f1318", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/84b008c23915ed94536737eae46f41ba3bccfe67", + "reference": "84b008c23915ed94536737eae46f41ba3bccfe67", "shasum": "" }, "require": { "php": ">=8.1.0" }, "require-dev": { - "phpunit/phpunit": ">=5.0.0 <8.5.27" + "phpunit/phpunit": ">=10.5.62 <11.0.0" }, "suggest": { "ext-bcmath": "Need to support JSON deserialization" @@ -2821,9 +2985,9 @@ "proto" ], "support": { - "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.33.2" + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.33.6" }, - "time": "2025-12-05T22:12:22+00:00" + "time": "2026-03-18T17:32:05+00:00" }, { "name": "kelunik/certificate", @@ -2885,20 +3049,20 @@ }, { "name": "league/uri", - "version": "7.7.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", - "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807" + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/8d587cddee53490f9b82bf203d3a9aa7ea4f9807", - "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", "shasum": "" }, "require": { - "league/uri-interfaces": "^7.7", + "league/uri-interfaces": "^7.8.1", "php": "^8.1", "psr/http-factory": "^1" }, @@ -2912,11 +3076,11 @@ "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", "ext-uri": "to use the PHP native URI class", - "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", - "league/uri-components": "Needed to easily manipulate URI objects components", - "league/uri-polyfill": "Needed to backport the PHP URI extension for older versions of PHP", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", "php-64bit": "to improve IPV4 host parsing", - "rowbot/url": "to handle WHATWG URL", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", @@ -2971,7 +3135,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.7.0" + "source": "https://github.com/thephpleague/uri/tree/7.8.1" }, "funding": [ { @@ -2979,20 +3143,20 @@ "type": "github" } ], - "time": "2025-12-07T16:02:06+00:00" + "time": "2026-03-15T20:22:25+00:00" }, { "name": "league/uri-interfaces", - "version": "7.7.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c" + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/62ccc1a0435e1c54e10ee6022df28d6c04c2946c", - "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", "shasum": "" }, "require": { @@ -3005,7 +3169,7 @@ "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", "php-64bit": "to improve IPV4 host parsing", - "rowbot/url": "to handle WHATWG URL", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", @@ -3055,7 +3219,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.7.0" + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" }, "funding": [ { @@ -3063,7 +3227,7 @@ "type": "github" } ], - "time": "2025-12-07T16:03:21+00:00" + "time": "2026-03-08T20:05:35+00:00" }, { "name": "myclabs/deep-copy", @@ -3127,16 +3291,16 @@ }, { "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": { @@ -3172,9 +3336,9 @@ "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", @@ -3354,16 +3518,16 @@ }, { "name": "php-cs-fixer/shim", - "version": "v3.92.3", + "version": "v3.95.11", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/shim.git", - "reference": "85907503d29473dfbb2f5950c84f5c00cb1b7297" + "reference": "87c59806c6ec3da0c554ca154a14c7e970fe5f26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/85907503d29473dfbb2f5950c84f5c00cb1b7297", - "reference": "85907503d29473dfbb2f5950c84f5c00cb1b7297", + "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/87c59806c6ec3da0c554ca154a14c7e970fe5f26", + "reference": "87c59806c6ec3da0c554ca154a14c7e970fe5f26", "shasum": "" }, "require": { @@ -3400,9 +3564,9 @@ "description": "A tool to automatically fix PHP code style", "support": { "issues": "https://github.com/PHP-CS-Fixer/shim/issues", - "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.92.3" + "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.95.11" }, - "time": "2025-12-18T10:45:25+00:00" + "time": "2026-06-25T14:17:29+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -3459,16 +3623,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.6", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8" + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/5cee1d3dfc2d2aa6599834520911d246f656bcb8", - "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/7bae67520aa9f5ecc506d646810bd40d9da54582", + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582", "shasum": "" }, "require": { @@ -3476,8 +3640,8 @@ "ext-filter": "*", "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.7", - "phpstan/phpdoc-parser": "^1.7|^2.0", + "phpdocumentor/type-resolver": "^2.0", + "phpstan/phpdoc-parser": "^2.0", "webmozart/assert": "^1.9.1 || ^2" }, "require-dev": { @@ -3487,7 +3651,8 @@ "phpstan/phpstan-mockery": "^1.1", "phpstan/phpstan-webmozart-assert": "^1.2", "phpunit/phpunit": "^9.5", - "psalm/phar": "^5.26" + "psalm/phar": "^5.26", + "shipmonk/dead-code-detector": "^0.5.1" }, "type": "library", "extra": { @@ -3517,44 +3682,44 @@ "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/5.6.6" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.3" }, - "time": "2025-12-22T21:13:58+00:00" + "time": "2026-03-18T20:49:53+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.12.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195" + "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195", - "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/327a05bbee54120d4786a0dc67aad30226ad4cf9", + "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9", "shasum": "" }, "require": { "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", + "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.18|^2.0" + "phpstan/phpdoc-parser": "^2.0" }, "require-dev": { "ext-tokenizer": "*", "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" + "psalm/phar": "^4" }, "type": "library", "extra": { "branch-alias": { - "dev-1.x": "1.x-dev" + "dev-1.x": "1.x-dev", + "dev-2.x": "2.x-dev" } }, "autoload": { @@ -3575,22 +3740,22 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/2.0.0" }, - "time": "2025-11-21T15:09:14+00:00" + "time": "2026-01-06T21:53:42+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.0", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { @@ -3622,17 +3787,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.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" }, - "time": "2025-08-30T15:50:23+00:00" + "time": "2026-01-25T14:56:51+00:00" }, { "name": "phpstan/phpstan", - "version": "1.12.32", + "version": "1.12.33", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/2770dcdf5078d0b0d53f94317e06affe88419aa8", - "reference": "2770dcdf5078d0b0d53f94317e06affe88419aa8", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/37982d6fc7cbb746dda7773530cda557cdf119e1", + "reference": "37982d6fc7cbb746dda7773530cda557cdf119e1", "shasum": "" }, "require": { @@ -3677,7 +3842,7 @@ "type": "github" } ], - "time": "2025-09-30T10:16:31+00:00" + "time": "2026-02-28T20:30:03+00:00" }, { "name": "phpunit/php-code-coverage", @@ -4002,16 +4167,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.60", + "version": "10.5.63", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f2e26f52f80ef77832e359205f216eeac00e320c" + "reference": "33198268dad71e926626b618f3ec3966661e4d90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f2e26f52f80ef77832e359205f216eeac00e320c", - "reference": "f2e26f52f80ef77832e359205f216eeac00e320c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/33198268dad71e926626b618f3ec3966661e4d90", + "reference": "33198268dad71e926626b618f3ec3966661e4d90", "shasum": "" }, "require": { @@ -4032,7 +4197,7 @@ "phpunit/php-timer": "^6.0.0", "sebastian/cli-parser": "^2.0.1", "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.4", + "sebastian/comparator": "^5.0.5", "sebastian/diff": "^5.1.1", "sebastian/environment": "^6.1.0", "sebastian/exporter": "^5.1.4", @@ -4083,7 +4248,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.60" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.63" }, "funding": [ { @@ -4107,7 +4272,7 @@ "type": "tidelift" } ], - "time": "2025-12-06T07:50:42+00:00" + "time": "2026-01-27T05:48:37+00:00" }, { "name": "rector/rector", @@ -4170,16 +4335,16 @@ }, { "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": { @@ -4189,7 +4354,7 @@ "ext-json": "*", "jetbrains/phpstorm-stubs": "^2019.3", "phpunit/phpunit": "^9", - "psalm/phar": "^5.15" + "psalm/phar": "6.16.*" }, "type": "library", "extra": { @@ -4236,35 +4401,35 @@ ], "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": "roxblnfk/unpoly", - "version": "1.8.1.1", + "version": "1.8.4.6", "source": { "type": "git", "url": "https://github.com/roxblnfk/unpoly.git", - "reference": "ec84dc56c97320acde5ab8875a39de36fdce36a9" + "reference": "ad31e0109d3c74f320532f1150929aa4a58f7876" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/roxblnfk/unpoly/zipball/ec84dc56c97320acde5ab8875a39de36fdce36a9", - "reference": "ec84dc56c97320acde5ab8875a39de36fdce36a9", + "url": "https://api.github.com/repos/roxblnfk/unpoly/zipball/ad31e0109d3c74f320532f1150929aa4a58f7876", + "reference": "ad31e0109d3c74f320532f1150929aa4a58f7876", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.4" }, "replace": { - "symfony/polyfill-php70": "*", - "symfony/polyfill-php71": "*", - "symfony/polyfill-php72": "*", "symfony/polyfill-php73": "*", "symfony/polyfill-php74": "*", "symfony/polyfill-php80": "*", - "symfony/polyfill-php81": "*" + "symfony/polyfill-php81": "*", + "symfony/polyfill-php82": "*", + "symfony/polyfill-php83": "*", + "symfony/polyfill-php84": "*" }, "type": "metapackage", "notification-url": "https://packagist.org/downloads/", @@ -4286,7 +4451,7 @@ ], "support": { "issues": "https://github.com/roxblnfk/unpoly/issues", - "source": "https://github.com/roxblnfk/unpoly/tree/1.8.1.1" + "source": "https://github.com/roxblnfk/unpoly/tree/1.8.4.6" }, "funding": [ { @@ -4294,7 +4459,7 @@ "type": "patreon" } ], - "time": "2024-02-06T20:26:09+00:00" + "time": "2025-11-20T19:51:54+00:00" }, { "name": "sebastian/cli-parser", @@ -4466,16 +4631,16 @@ }, { "name": "sebastian/comparator", - "version": "5.0.4", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "e8e53097718d2b53cfb2aa859b06a41abf58c62e" + "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e8e53097718d2b53cfb2aa859b06a41abf58c62e", - "reference": "e8e53097718d2b53cfb2aa859b06a41abf58c62e", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55dfef806eb7dfeb6e7a6935601fef866f8ca48d", + "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d", "shasum": "" }, "require": { @@ -4531,7 +4696,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.4" + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.5" }, "funding": [ { @@ -4551,7 +4716,7 @@ "type": "tidelift" } ], - "time": "2025-09-07T05:25:07+00:00" + "time": "2026-01-24T09:25:16+00:00" }, { "name": "sebastian/complexity", @@ -5375,25 +5540,26 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.30", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789" + "reference": "99aec13b82b4967ec5088222c4a3ecca955949c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/441c6b69f7222aadae7cbf5df588496d5ee37789", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/99aec13b82b4967ec5088222c4a3ecca955949c2", + "reference": "99aec13b82b4967ec5088222c4a3ecca955949c2", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^5.4|^6.4|^7.0" + "symfony/process": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -5421,7 +5587,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.30" + "source": "https://github.com/symfony/filesystem/tree/v8.1.0" }, "funding": [ { @@ -5441,27 +5607,27 @@ "type": "tidelift" } ], - "time": "2025-11-26T14:43:45+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/finder", - "version": "v6.4.27", + "version": "v8.1.1", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a1b6aa435d2fba50793b994a839c32b6064f063b" + "reference": "e2989e762c70f9490fa3a00a0ac0fae5aa97a531" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a1b6aa435d2fba50793b994a839c32b6064f063b", - "reference": "a1b6aa435d2fba50793b994a839c32b6064f063b", + "url": "https://api.github.com/repos/symfony/finder/zipball/e2989e762c70f9490fa3a00a0ac0fae5aa97a531", + "reference": "e2989e762c70f9490fa3a00a0ac0fae5aa97a531", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.4.1" }, "require-dev": { - "symfony/filesystem": "^6.0|^7.0" + "symfony/filesystem": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -5489,7 +5655,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.27" + "source": "https://github.com/symfony/finder/tree/v8.1.1" }, "funding": [ { @@ -5509,108 +5675,28 @@ "type": "tidelift" } ], - "time": "2025-10-15T18:32:00+00:00" - }, - { - "name": "symfony/polyfill-php84", - "version": "v1.33.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php84\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-06-24T13:30:11+00:00" + "time": "2026-06-27T09:05:56+00:00" }, { "name": "ta-tikoma/phpunit-architecture-test", - "version": "0.8.5", + "version": "0.8.7", "source": { "type": "git", "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", - "reference": "cf6fb197b676ba716837c886baca842e4db29005" + "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/cf6fb197b676ba716837c886baca842e4db29005", - "reference": "cf6fb197b676ba716837c886baca842e4db29005", + "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/1248f3f506ca9641d4f68cebcd538fa489754db8", + "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8", "shasum": "" }, "require": { "nikic/php-parser": "^4.18.0 || ^5.0.0", "php": "^8.1.0", - "phpdocumentor/reflection-docblock": "^5.3.0", - "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0", - "symfony/finder": "^6.4.0 || ^7.0.0" + "phpdocumentor/reflection-docblock": "^5.3.0 || ^6.0.0", + "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0 || ^13.0.0", + "symfony/finder": "^6.4.0 || ^7.0.0 || ^8.0.0" }, "require-dev": { "laravel/pint": "^1.13.7", @@ -5646,9 +5732,9 @@ ], "support": { "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", - "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.5" + "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.7" }, - "time": "2025-04-20T20:23:40+00:00" + "time": "2026-02-17T17:25:14+00:00" }, { "name": "theseer/tokenizer", @@ -5702,16 +5788,16 @@ }, { "name": "vimeo/psalm", - "version": "6.14.3", + "version": "6.16.1", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "d0b040a91f280f071c1abcb1b77ce3822058725a" + "reference": "f1f5de594dc76faf8784e02d3dc4716c91c6f6ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/d0b040a91f280f071c1abcb1b77ce3822058725a", - "reference": "d0b040a91f280f071c1abcb1b77ce3822058725a", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/f1f5de594dc76faf8784e02d3dc4716c91c6f6ac", + "reference": "f1f5de594dc76faf8784e02d3dc4716c91c6f6ac", "shasum": "" }, "require": { @@ -5735,7 +5821,7 @@ "netresearch/jsonmapper": "^5.0", "nikic/php-parser": "^5.0.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", "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", @@ -5816,27 +5902,27 @@ "issues": "https://github.com/vimeo/psalm/issues", "source": "https://github.com/vimeo/psalm" }, - "time": "2025-12-23T15:36:48+00:00" + "time": "2026-03-19T10:56:09+00:00" }, { "name": "webmozart/assert", - "version": "1.12.1", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" + "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/2ccb7c2e821038c03a3e6e1700c570c158c55f70", + "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70", "shasum": "" }, "require": { "ext-ctype": "*", "ext-date": "*", "ext-filter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.2" }, "suggest": { "ext-intl": "", @@ -5845,8 +5931,12 @@ }, "type": "library", "extra": { + "psalm": { + "pluginClass": "Webmozart\\Assert\\PsalmPlugin" + }, "branch-alias": { - "dev-master": "1.10-dev" + "dev-master": "2.0-dev", + "dev-feature/2-0": "2.0-dev" } }, "autoload": { @@ -5862,6 +5952,10 @@ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" + }, + { + "name": "Woody Gilk", + "email": "woody.gilk@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", @@ -5872,9 +5966,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.12.1" + "source": "https://github.com/webmozarts/assert/tree/2.4.1" }, - "time": "2025-10-29T15:56:20+00:00" + "time": "2026-06-15T15:31:57+00:00" } ], "aliases": [], @@ -5889,5 +5983,5 @@ "ext-sockets": "*" }, "platform-dev": {}, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/src/Application.php b/src/Application.php index eed8d2e0..59f68d3f 100644 --- a/src/Application.php +++ b/src/Application.php @@ -14,7 +14,7 @@ use Buggregator\Trap\Handler\Http\Handler\Websocket; use Buggregator\Trap\Handler\Http\Middleware; use Buggregator\Trap\Proto\Buffer; -use Buggregator\Trap\Service\Container; +use Internal\Container\Container; use Buggregator\Trap\Socket\Client; use Buggregator\Trap\Socket\Server; use Buggregator\Trap\Socket\SocketStream; diff --git a/src/Application/Config/Internal/Attribute/ConfigAttribute.php b/src/Application/Config/Internal/Attribute/ConfigAttribute.php new file mode 100644 index 00000000..1e6144ab --- /dev/null +++ b/src/Application/Config/Internal/Attribute/ConfigAttribute.php @@ -0,0 +1,12 @@ + $key Index in the result array (if XPath returns multiple items) + */ + public function __construct( + public string $path, + public int $key = 0, + ) {} +} diff --git a/src/Application/Config/Internal/Attribute/XPathEmbed.php b/src/Application/Config/Internal/Attribute/XPathEmbed.php new file mode 100644 index 00000000..f2b425eb --- /dev/null +++ b/src/Application/Config/Internal/Attribute/XPathEmbed.php @@ -0,0 +1,26 @@ +info('SimpleXML extension is not loaded.'); + } else { + $this->xml = \simplexml_load_string($xml, options: \LIBXML_NOERROR) ?: null; + } + } + } + + /** + * Hydrates a configuration object with values from the configured sources. + */ + #[\Override] + public function inflect(object $object, Container $container): object + { + # Detect inflectable config + $reflection = new \ReflectionObject($object); + if ($reflection->getAttributes(InflectableConfig::class) === []) { + return $object; + } + + # Read class properties + foreach ($reflection->getProperties() as $property) { + $attributes = $property->getAttributes(ConfigAttribute::class, \ReflectionAttribute::IS_INSTANCEOF); + if (\count($attributes) === 0) { + continue; + } + + $this->injectValue($container, $object, $property, $attributes); + } + + return $object; + } + + /** + * Injects values into a property based on its configuration attributes. + * + * @param list<\ReflectionAttribute> $attributes + */ + private function injectValue( + Container $container, + object $config, + \ReflectionProperty $property, + array $attributes, + ): void { + foreach ($attributes as $attribute) { + try { + $attribute = $attribute->newInstance(); + + /** @var mixed $value */ + $value = match (true) { + $attribute instanceof XPath => $this->getXPath($attribute), + $attribute instanceof XPathEmbed => $this->getXPathEmbedded($container, $attribute), + $attribute instanceof XPathEmbedList => $this->getXPathEmbeddedList($container, $attribute), + $attribute instanceof Env => $this->env[$attribute->name] ?? null, + $attribute instanceof InputOption => $this->inputOptions[$attribute->name] ?? null, + $attribute instanceof InputArgument => $this->inputArguments[$attribute->name] ?? null, + $attribute instanceof PhpIni => (static fn(string|false $value): ?string => match ($value) { + // Option does not exist or set to null + '', false => null, + default => $value, + })(\ini_get($attribute->option)), + default => null, + }; + + if (\in_array($value, [null, []], true)) { + continue; + } + + // Cast value to the property type + $type = $property->getType(); + + /** @var mixed $result */ + $result = match (true) { + !$type instanceof \ReflectionNamedType => $value, + $type->allowsNull() && $value === '' => null, + $type->isBuiltin() => match ($type->getName()) { + 'int' => (int) $value, + 'float' => (float) $value, + 'bool' => \filter_var($value, FILTER_VALIDATE_BOOLEAN), + 'array' => match (true) { + \is_array($value) => $value, + \is_string($value) => \explode(',', $value), + default => [$value], + }, + default => $value, + }, + \enum_exists($type->getName()) => (static function (mixed $value) use ($type): \UnitEnum { + /** @var class-string<\BackedEnum> $class */ + $class = $type->getName(); + + // Get Enum values type + $cases = (new \ReflectionEnum($class))->getCases(); + + // If the value is stringable, convert it to string first + $value = (string) $value; + + // Convert value to the backing type + if ($cases[0] instanceof \ReflectionEnumBackedCase) { + // Find case by backing value + \is_int($cases[0]->getBackingValue()) and $value = (int) $value; + return $class::from($value); + } + + // Find case by name + $value = \strtolower($value); + foreach ($cases as $case) { + if (\strtolower($case->getName()) === $value) { + return $case->getValue(); + } + } + + throw new \ValueError(\sprintf( + 'Invalid enum value `%s` for enum `%s`.', + $value, + $class, + )); + })($value), + default => $value, + }; + + // todo Validation + + // Set the property value + $property->setValue($config, $result); + return; + } catch (\Throwable $e) { + # Config injection failed for this attribute. Resolve the logger lazily from the + # container (it is not available at inflector construction time) and surface the error; + # ignore a failure to even resolve the logger, which can happen too early in bootstrap. + try { + $container->get(Logger::class)->exception($e, important: true); + } catch (\Throwable) { + # Ignore + } + } + } + } + + /** + * Gets a value from XML using an XPath expression. + */ + private function getXPath(XPath $attribute): mixed + { + $value = $this->xpath($attribute->path); + + return \is_array($value) && \array_key_exists($attribute->key, $value) + ? $value[$attribute->key] + : null; + } + + /** + * Gets a single object from XML using an XPath expression. + */ + private function getXPathEmbedded(Container $container, XPathEmbed $attribute): ?object + { + if ($this->xml === null) { + return null; + } + + $value = $this->xpath($attribute->path); + if (!\is_array($value) || empty($value)) { + return null; + } + + $xml = $value[0]; + + // Instantiate + /** @psalm-suppress MixedMethodCall */ + $item = new $attribute->class(); + + $this->withXml($xml)->inflect($item, $container); + return $item; + } + + /** + * Gets a list of objects from XML using an XPath expression. + */ + private function getXPathEmbeddedList(Container $container, XPathEmbedList $attribute): array + { + if ($this->xml === null) { + return []; + } + + $result = []; + $value = $this->xpath($attribute->path); + \is_array($value) or throw new \Exception(\sprintf('Invalid XPath `%s`', $attribute->path)); + + foreach ($value as $xml) { + // Instantiate + /** @psalm-suppress MixedMethodCall */ + $item = new $attribute->class(); + + $this->withXml($xml)->inflect($item, $container); + $result[] = $item; + } + + return $result; + } + + /** + * Runs an XPath query with libxml's parse diagnostics suppressed: an invalid expression is a + * config-author mistake the callers already handle, and the raw PHP warning it would otherwise + * raise is noise on the report a consumer parses. + * + * @return array|false|null `null` when no XML is configured, `false` + * on an invalid expression, otherwise the (possibly empty) match list. + */ + private function xpath(string $path): array|false|null + { + if ($this->xml === null) { + return null; + } + + $previous = \libxml_use_internal_errors(true); + try { + return $this->xml->xpath($path); + } finally { + \libxml_clear_errors(); + \libxml_use_internal_errors($previous); + } + } + + /** + * Creates a new loader instance with the specified XML element. + */ + private function withXml(\SimpleXMLElement $xml): self + { + $self = clone $this; + $self->xml = $xml; + return $self; + } +} diff --git a/src/Bootstrap.php b/src/Bootstrap.php index 99f9c267..5dbb1e6e 100644 --- a/src/Bootstrap.php +++ b/src/Bootstrap.php @@ -4,8 +4,9 @@ namespace Buggregator\Trap; -use Buggregator\Trap\Service\Config\ConfigLoader; -use Buggregator\Trap\Service\Container; +use Buggregator\Trap\Application\Config\Internal\ConfigInflector; +use Internal\Container\Container; +use Internal\Container\ObjectContainer; /** * Build the container based on the configuration. @@ -15,10 +16,10 @@ final class Bootstrap { private function __construct( - private Container $container, + private ObjectContainer $container, ) {} - public static function init(Container $container = new Container()): self + public static function init(ObjectContainer $container = new ObjectContainer()): self { return new self($container); } @@ -49,8 +50,9 @@ public function withConfig( // XML config file $xml === null or $args['xml'] = $this->readXml($xml); - // Register bindings - $this->container->bind(ConfigLoader::class, $args); + // Register config hydration as an inflector: every object produced by the container passes + // through it, and inflectable config classes get their properties filled from the sources above. + $this->container->addInflector($this->container->make(ConfigInflector::class, $args)); return $this; } diff --git a/src/Command/Run.php b/src/Command/Run.php index 2af8eef0..5b53960b 100644 --- a/src/Command/Run.php +++ b/src/Command/Run.php @@ -11,7 +11,7 @@ use Buggregator\Trap\Info; use Buggregator\Trap\Logger; use Buggregator\Trap\Sender; -use Buggregator\Trap\Service\Container; +use Internal\Container\Container; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Command\SignalableCommandInterface; diff --git a/src/Config/Server/App.php b/src/Config/Server/App.php index d2bfb13b..ceea81c1 100644 --- a/src/Config/Server/App.php +++ b/src/Config/Server/App.php @@ -4,7 +4,8 @@ namespace Buggregator\Trap\Config\Server; -use Buggregator\Trap\Service\Config\Env; +use Buggregator\Trap\Application\Config\Internal\Attribute\Env; +use Buggregator\Trap\Application\Config\Internal\Attribute\InflectableConfig; /** * Common configuration for the application @@ -12,6 +13,7 @@ * @internal * @psalm-internal Buggregator\Trap */ +#[InflectableConfig] final class App { /** diff --git a/src/Config/Server/Files/SPX.php b/src/Config/Server/Files/SPX.php index 01ca54ef..73eb0c51 100644 --- a/src/Config/Server/Files/SPX.php +++ b/src/Config/Server/Files/SPX.php @@ -4,11 +4,13 @@ namespace Buggregator\Trap\Config\Server\Files; -use Buggregator\Trap\Service\Config\PhpIni; +use Buggregator\Trap\Application\Config\Internal\Attribute\InflectableConfig; +use Buggregator\Trap\Application\Config\Internal\Attribute\PhpIni; /** * @internal */ +#[InflectableConfig] final class SPX extends ObserverConfig { /** @var non-empty-string|null Path to SPX files */ diff --git a/src/Config/Server/Files/XDebug.php b/src/Config/Server/Files/XDebug.php index ba7badc0..5dc88b2a 100644 --- a/src/Config/Server/Files/XDebug.php +++ b/src/Config/Server/Files/XDebug.php @@ -4,11 +4,13 @@ namespace Buggregator\Trap\Config\Server\Files; -use Buggregator\Trap\Service\Config\PhpIni; +use Buggregator\Trap\Application\Config\Internal\Attribute\InflectableConfig; +use Buggregator\Trap\Application\Config\Internal\Attribute\PhpIni; /** * @internal */ +#[InflectableConfig] final class XDebug extends ObserverConfig { /** @var non-empty-string|null Path to XDebug files */ diff --git a/src/Config/Server/Files/XHProf.php b/src/Config/Server/Files/XHProf.php index 4f614564..fca0e05d 100644 --- a/src/Config/Server/Files/XHProf.php +++ b/src/Config/Server/Files/XHProf.php @@ -4,14 +4,16 @@ namespace Buggregator\Trap\Config\Server\Files; -use Buggregator\Trap\Service\Config\Env; -use Buggregator\Trap\Service\Config\PhpIni; +use Buggregator\Trap\Application\Config\Internal\Attribute\Env; +use Buggregator\Trap\Application\Config\Internal\Attribute\InflectableConfig; +use Buggregator\Trap\Application\Config\Internal\Attribute\PhpIni; use Buggregator\Trap\Service\FilesObserver\Converter\XHProf as Converter; use Buggregator\Trap\Service\FilesObserver\FrameConverter; /** * @internal */ +#[InflectableConfig] final class XHProf extends ObserverConfig { /** diff --git a/src/Config/Server/Frontend.php b/src/Config/Server/Frontend.php index 87a47d9b..1ddfdf0a 100644 --- a/src/Config/Server/Frontend.php +++ b/src/Config/Server/Frontend.php @@ -4,13 +4,15 @@ namespace Buggregator\Trap\Config\Server; -use Buggregator\Trap\Service\Config\InputOption; -use Buggregator\Trap\Service\Config\Env; -use Buggregator\Trap\Service\Config\XPath; +use Buggregator\Trap\Application\Config\Internal\Attribute\Env; +use Buggregator\Trap\Application\Config\Internal\Attribute\InflectableConfig; +use Buggregator\Trap\Application\Config\Internal\Attribute\InputOption; +use Buggregator\Trap\Application\Config\Internal\Attribute\XPath; /** * @internal */ +#[InflectableConfig] final class Frontend { /** @var int<1, 65535> */ diff --git a/src/Config/Server/Frontend/EventStorage.php b/src/Config/Server/Frontend/EventStorage.php index a902ae14..c140bb93 100644 --- a/src/Config/Server/Frontend/EventStorage.php +++ b/src/Config/Server/Frontend/EventStorage.php @@ -4,13 +4,15 @@ namespace Buggregator\Trap\Config\Server\Frontend; -use Buggregator\Trap\Service\Config\XPath; +use Buggregator\Trap\Application\Config\Internal\Attribute\InflectableConfig; +use Buggregator\Trap\Application\Config\Internal\Attribute\XPath; /** * Configuration for the frontend events buffer. * * @internal */ +#[InflectableConfig] final class EventStorage { /** diff --git a/src/Config/Server/TcpPorts.php b/src/Config/Server/TcpPorts.php index 4be1188e..228a56d9 100644 --- a/src/Config/Server/TcpPorts.php +++ b/src/Config/Server/TcpPorts.php @@ -4,8 +4,9 @@ namespace Buggregator\Trap\Config\Server; -use Buggregator\Trap\Service\Config\Env; -use Buggregator\Trap\Service\Config\InputOption; +use Buggregator\Trap\Application\Config\Internal\Attribute\Env; +use Buggregator\Trap\Application\Config\Internal\Attribute\InflectableConfig; +use Buggregator\Trap\Application\Config\Internal\Attribute\InputOption; /** * Config is a projection of plain TCP ports configuration via ENV and CLI @@ -13,6 +14,7 @@ * @internal * @psalm-internal Buggregator\Trap */ +#[InflectableConfig] final class TcpPorts { /** diff --git a/src/Service/Config/ConfigAttribute.php b/src/Service/Config/ConfigAttribute.php deleted file mode 100644 index 504597b3..00000000 --- a/src/Service/Config/ConfigAttribute.php +++ /dev/null @@ -1,10 +0,0 @@ -info('SimpleXML extension is not loaded.'); - } else { - $this->xml = \simplexml_load_string($xml, options: \LIBXML_NOERROR) ?: null; - } - } - } - - public function hidrate(object $config): void - { - // Read class properties - $reflection = new \ReflectionObject($config); - foreach ($reflection->getProperties() as $property) { - $attributes = $property->getAttributes(ConfigAttribute::class, \ReflectionAttribute::IS_INSTANCEOF); - if (\count($attributes) === 0) { - continue; - } - - $this->injectValue($config, $property, $attributes); - } - } - - /** - * @param list<\ReflectionAttribute> $attributes - */ - private function injectValue(object $config, \ReflectionProperty $property, array $attributes): void - { - foreach ($attributes as $attribute) { - try { - $attribute = $attribute->newInstance(); - - /** @var mixed $value */ - $value = match (true) { - $attribute instanceof XPath => (static fn(array|false|null $value, int $key): mixed - => \is_array($value) && \array_key_exists($key, $value) - ? $value[$key] - : null)($this->xml?->xpath($attribute->path), $attribute->key), - $attribute instanceof Env => $this->env[$attribute->name] ?? null, - $attribute instanceof InputOption => $this->inputOptions[$attribute->name] ?? null, - $attribute instanceof InputArgument => $this->inputArguments[$attribute->name] ?? null, - $attribute instanceof PhpIni => (static fn(string|false $value): ?string => match ($value) { - // Option does not exist or set to null - '', false => null, - default => $value, - })(\ini_get($attribute->option)), - default => null, - }; - - if (\in_array($value, [null, []], true)) { - continue; - } - - // Cast value to the property type - $type = $property->getType(); - - /** @var mixed $result */ - $result = match (true) { - !$type instanceof \ReflectionNamedType => $value, - $type->allowsNull() && $value === '' => null, - $type->isBuiltin() => match ($type->getName()) { - 'int' => (int) $value, - 'float' => (float) $value, - 'bool' => \filter_var($value, FILTER_VALIDATE_BOOLEAN), - 'array' => match (true) { - \is_array($value) => $value, - \is_string($value) => \explode(',', $value), - default => [$value], - }, - default => $value, - }, - default => $value, - }; - - // todo Validation - - // Set the property value - $property->setValue($config, $result); - return; - } catch (\Throwable $e) { - $this->logger->exception($e, important: true); - } - } - } -} diff --git a/src/Service/Config/Env.php b/src/Service/Config/Env.php deleted file mode 100644 index 44a8bd68..00000000 --- a/src/Service/Config/Env.php +++ /dev/null @@ -1,16 +0,0 @@ - */ - private array $cache = []; - - /** @var array */ - private array $factory = []; - - private readonly Injector $injector; - - /** - * @psalm-suppress PropertyTypeCoercion - */ - public function __construct() - { - $this->injector = (new Injector($this))->withCacheReflections(false); - $this->cache[Injector::class] = $this->injector; - $this->cache[self::class] = $this; - $this->cache[ContainerInterface::class] = $this; - } - - /** - * @template T - * @param class-string $id - * @param array $arguments Will be used if the object is created for the first time. - * @return T - * - * @psalm-suppress MoreSpecificImplementedParamType, InvalidReturnType - */ - public function get(string $id, array $arguments = []): object - { - /** @psalm-suppress InvalidReturnStatement */ - return $this->cache[$id] ??= $this->make($id, $arguments); - } - - /** - * @param class-string $id - * - * @psalm-suppress MoreSpecificImplementedParamType - */ - public function has(string $id): bool - { - return \array_key_exists($id, $this->cache) || \array_key_exists($id, $this->factory); - } - - /** - * @template T of object - * @param T $service - * @param class-string|null $id - */ - public function set(object $service, ?string $id = null): void - { - \assert($id === null || $service instanceof $id, "Service must be instance of {$id}."); - $this->cache[$id ?? \get_class($service)] = $service; - } - - /** - * Create an object of the specified class without caching. - * - * @template T - * @param class-string $class - * @return T - */ - public function make(string $class, array $arguments = []): object - { - $binding = $this->factory[$class] ?? null; - - if ($binding instanceof \Closure) { - $result = $binding($this); - } else { - try { - $result = $this->injector->make($class, \array_merge((array) $binding, $arguments)); - } catch (\Throwable $e) { - throw new class("Unable to create object of class $class.", previous: $e) extends \RuntimeException implements NotFoundExceptionInterface {}; - } - } - - \assert($result instanceof $class, "Created object must be instance of {$class}."); - - // Detect Trap related types - // Configs - if (\str_starts_with($class, 'Buggregator\\Trap\\Config\\')) { - // Hydrate config - $configLoader = $this->get(ConfigLoader::class); - $configLoader->hidrate($result); - } - - return $result; - } - - /** - * Declare a factory or predefined arguments for the specified class. - * - * @template T of object - * @param class-string $id - * @param array|\Closure(Container): T $binding - */ - public function bind(string $id, \Closure|array $binding): void - { - $this->factory[$id] = $binding; - } - - public function destroy(): void - { - unset($this->cache, $this->factory, $this->injector); - } -} diff --git a/src/Service/FilesObserver/Handler.php b/src/Service/FilesObserver/Handler.php index bda3f919..56e69adf 100644 --- a/src/Service/FilesObserver/Handler.php +++ b/src/Service/FilesObserver/Handler.php @@ -7,7 +7,7 @@ use Buggregator\Trap\Config\Server\Files\ObserverConfig as Config; use Buggregator\Trap\Logger; use Buggregator\Trap\Proto\Frame; -use Buggregator\Trap\Service\Container; +use Internal\Container\Container; use Buggregator\Trap\Support\Timer; /** diff --git a/tests/Unit/Service/Config/ConfigLoaderTest.php b/tests/Unit/Application/Config/Internal/ConfigInflectorTest.php similarity index 69% rename from tests/Unit/Service/Config/ConfigLoaderTest.php rename to tests/Unit/Application/Config/Internal/ConfigInflectorTest.php index 83614172..4b98f8c5 100644 --- a/tests/Unit/Service/Config/ConfigLoaderTest.php +++ b/tests/Unit/Application/Config/Internal/ConfigInflectorTest.php @@ -2,21 +2,22 @@ declare(strict_types=1); -namespace Buggregator\Trap\Tests\Unit\Service\Config; - -use Buggregator\Trap\Bootstrap; -use Buggregator\Trap\Service\Config\ConfigLoader; -use Buggregator\Trap\Service\Config\Env; -use Buggregator\Trap\Service\Config\InputArgument; -use Buggregator\Trap\Service\Config\InputOption; -use Buggregator\Trap\Service\Config\XPath; +namespace Buggregator\Trap\Tests\Unit\Application\Config\Internal; + +use Buggregator\Trap\Application\Config\Internal\Attribute\Env; +use Buggregator\Trap\Application\Config\Internal\Attribute\InflectableConfig; +use Buggregator\Trap\Application\Config\Internal\Attribute\InputArgument; +use Buggregator\Trap\Application\Config\Internal\Attribute\InputOption; +use Buggregator\Trap\Application\Config\Internal\Attribute\XPath; +use Buggregator\Trap\Application\Config\Internal\ConfigInflector; +use Internal\Container\ObjectContainer; use PHPUnit\Framework\TestCase; -final class ConfigLoaderTest extends TestCase +final class ConfigInflectorTest extends TestCase { public function testSimpleHydration(): void { - $dto = new class { + $dto = new #[InflectableConfig] class { #[XPath('/trap/container/@myBool')] public bool $myBool; @@ -39,7 +40,7 @@ public function testSimpleHydration(): void XML; - $this->createConfigLoader(xml: $xml)->hidrate($dto); + $this->inflect($dto, xml: $xml); self::assertTrue($dto->myBool); self::assertSame(200, $dto->myInt); @@ -49,7 +50,7 @@ public function testSimpleHydration(): void public function testNonExistingOptions(): void { - $dto = new class { + $dto = new #[InflectableConfig] class { #[XPath('/trap/container/Nothing/@value')] public float $none1 = 3.14; @@ -67,7 +68,7 @@ public function testNonExistingOptions(): void XML; - $this->createConfigLoader(xml: $xml)->hidrate($dto); + $this->inflect($dto, xml: $xml); self::assertSame(3.14, $dto->none1); self::assertSame(3.14, $dto->none2); @@ -77,7 +78,7 @@ public function testNonExistingOptions(): void public function testAttributesOrder(): void { - $dto = new class { + $dto = new #[InflectableConfig] class { #[XPath('/test/@foo')] #[InputArgument('test')] #[InputOption('test')] @@ -102,24 +103,21 @@ public function testAttributesOrder(): void XML; - $this - ->createConfigLoader(xml: $xml, opts: ['test' => 13], args: ['test' => 69], env: ['test' => 0]) - ->hidrate($dto); + $this->inflect($dto, xml: $xml, opts: ['test' => 13], args: ['test' => 69], env: ['test' => 0]); self::assertSame(42, $dto->int1); self::assertSame(0, $dto->int2); self::assertSame(69, $dto->int3); } - private function createConfigLoader( + private function inflect( + object $config, ?string $xml = null, array $opts = [], array $args = [], array $env = [], - ): ConfigLoader { - return Bootstrap::init() - ->withConfig($xml, $opts, $args, $env) - ->finish() - ->get(ConfigLoader::class); + ): void { + (new ConfigInflector(env: $env, inputArguments: $args, inputOptions: $opts, xml: $xml)) + ->inflect($config, new ObjectContainer()); } } From 04e3cb8e98e83200f8f88a696a0b004543225f0f Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 8 Sep 2026 07:05:43 +0000 Subject: [PATCH 2/4] style(php-cs-fixer): fix coding standards --- src/Client/TrapHandle.php | 42 +++++++++---------- .../TrapHandle/ContextProvider/Source.php | 4 +- src/Sender/Frontend/Http/EventAssets.php | 20 ++++----- src/Sender/Frontend/Service.php | 36 ++++++---------- src/Traffic/Dispatcher/Http.php | 4 +- 5 files changed, 47 insertions(+), 59 deletions(-) diff --git a/src/Client/TrapHandle.php b/src/Client/TrapHandle.php index c203b285..e8cdaab6 100644 --- a/src/Client/TrapHandle.php +++ b/src/Client/TrapHandle.php @@ -53,27 +53,6 @@ public static function logger(string $channel = 'trap'): LoggerInterface return self::$loggers[$channel] ??= self::createLogger($channel); } - /** - * @param non-empty-string $channel - */ - private static function createLogger(string $channel): TrapLogger - { - $host = self::getEnvValue('TRAP_MONOLOG_HOST', '127.0.0.1'); - $port = self::getEnvValue('TRAP_MONOLOG_PORT', '9913'); - - $port = \is_numeric($port) ? (int) $port : 9913; - - if ($port < 1 || $port > 65535) { - $port = 9913; - } - - return new TrapLogger( - host: $host, - port: $port, - channel: $channel, - ); - } - /** * Create a new instance with a single value. * @@ -253,6 +232,27 @@ public function __destruct() $this->haveToSend() and $this->sendDump(); } + /** + * @param non-empty-string $channel + */ + private static function createLogger(string $channel): TrapLogger + { + $host = self::getEnvValue('TRAP_MONOLOG_HOST', '127.0.0.1'); + $port = self::getEnvValue('TRAP_MONOLOG_PORT', '9913'); + + $port = \is_numeric($port) ? (int) $port : 9913; + + if ($port < 1 || $port > 65535) { + $port = 9913; + } + + return new TrapLogger( + host: $host, + port: $port, + channel: $channel, + ); + } + private static function getEnvValue(string $name, string $default): string { if (\array_key_exists($name, $_ENV)) { diff --git a/src/Client/TrapHandle/ContextProvider/Source.php b/src/Client/TrapHandle/ContextProvider/Source.php index 9ca0f349..5dca6802 100644 --- a/src/Client/TrapHandle/ContextProvider/Source.php +++ b/src/Client/TrapHandle/ContextProvider/Source.php @@ -111,7 +111,9 @@ private function htmlEncode(string $s): string { $html = ''; - $dumper = new HtmlDumper(static function (string $line) use (&$html): void { $html .= $line; }, $this->charset); + $dumper = new HtmlDumper(static function (string $line) use (&$html): void { + $html .= $line; + }, $this->charset); $dumper->setDumpHeader(''); $dumper->setDumpBoundaries('', ''); diff --git a/src/Sender/Frontend/Http/EventAssets.php b/src/Sender/Frontend/Http/EventAssets.php index c7a11193..9b3c160d 100644 --- a/src/Sender/Frontend/Http/EventAssets.php +++ b/src/Sender/Frontend/Http/EventAssets.php @@ -54,11 +54,9 @@ public function handle(ServerRequestInterface $request, callable $next): Respons * @param non-empty-string $eventId */ #[RegexpRoute(Method::Get, '#^api/smtp/(?[a-f0-9-]++)/html#')] - #[ - AssertSuccess(Method::Get, 'api/smtp/0145a0e0-0b1a-4e4a-9b1a/html', ['eventId' => '0145a0e0-0b1a-4e4a-9b1a']), + #[AssertSuccess(Method::Get, 'api/smtp/0145a0e0-0b1a-4e4a-9b1a/html', ['eventId' => '0145a0e0-0b1a-4e4a-9b1a']), AssertSuccess(Method::Get, 'api/smtp/0145a0e0-0b1a-4e4a-9b1a/html/', ['eventId' => '0145a0e0-0b1a-4e4a-9b1a']), - AssertFail(Method::Get, 'api/smtp/foo-bar-baz/html') - ] + AssertFail(Method::Get, 'api/smtp/foo-bar-baz/html')] public function smtpHtml(string $eventId): ?Response { // Find event @@ -87,14 +85,12 @@ public function smtpHtml(string $eventId): ?Response * @param non-empty-string $attachId */ #[RegexpRoute(Method::Get, '#^api/smtp/(?[a-f0-9-]++)/attachment/(?[a-f0-9-]++)$#')] - #[ - AssertSuccess( - Method::Get, - 'api/smtp/0145a0e0-0b1a-4e4a-9b1a/attachment/0145a0e0-0b1a-4e4a-9b1a', - ['eventId' => '0145a0e0-0b1a-4e4a-9b1a', 'attachId' => '0145a0e0-0b1a-4e4a-9b1a'], - ), - AssertFail(Method::Get, 'api/smtp/0145a0e0-0b1a-4e4a-9b1a/attachment/0145a0e0ZZZZzzzz') - ] + #[AssertSuccess( + Method::Get, + 'api/smtp/0145a0e0-0b1a-4e4a-9b1a/attachment/0145a0e0-0b1a-4e4a-9b1a', + ['eventId' => '0145a0e0-0b1a-4e4a-9b1a', 'attachId' => '0145a0e0-0b1a-4e4a-9b1a'], + ), + AssertFail(Method::Get, 'api/smtp/0145a0e0-0b1a-4e4a-9b1a/attachment/0145a0e0ZZZZzzzz')] public function attachment(string $eventId, string $attachId): ?Response { // Find event diff --git a/src/Sender/Frontend/Service.php b/src/Sender/Frontend/Service.php index 90a57f83..d8fe17dd 100644 --- a/src/Sender/Frontend/Service.php +++ b/src/Sender/Frontend/Service.php @@ -35,11 +35,9 @@ public function version(): Version } #[RegexpRoute(Method::Delete, '#^api/event/(?[a-f0-9-]++)$#i')] - #[ - AssertSuccess(Method::Delete, 'api/event/0145a0e0-0b1a-4e4a-9b1a', ['uuid' => '0145a0e0-0b1a-4e4a-9b1a']), + #[AssertSuccess(Method::Delete, 'api/event/0145a0e0-0b1a-4e4a-9b1a', ['uuid' => '0145a0e0-0b1a-4e4a-9b1a']), AssertFail(Method::Delete, 'api/event/foo-bar-baz'), - AssertFail(Method::Delete, 'api/event/'), - ] + AssertFail(Method::Delete, 'api/event/'),] public function eventDelete(string $uuid): Success { $this->debug('Delete event %s', $uuid); @@ -48,11 +46,9 @@ public function eventDelete(string $uuid): Success } #[RegexpRoute(Method::Get, '#^api/event/(?[a-f0-9-]++)$#i')] - #[ - AssertSuccess(Method::Get, 'api/event/0145a0e0-0b1a-4e4a-9b1a', ['uuid' => '0145a0e0-0b1a-4e4a-9b1a']), + #[AssertSuccess(Method::Get, 'api/event/0145a0e0-0b1a-4e4a-9b1a', ['uuid' => '0145a0e0-0b1a-4e4a-9b1a']), AssertFail(Method::Get, 'api/event/foo-bar-baz'), - AssertFail(Method::Get, 'api/event/'), - ] + AssertFail(Method::Get, 'api/event/'),] public function eventShow(string $uuid): Event|Success { $this->debug('Show event %s', $uuid); @@ -61,11 +57,9 @@ public function eventShow(string $uuid): Event|Success } #[RegexpRoute(Method::Get, '#^api/smtp/(?[a-f0-9-]++)/attachments$#i')] - #[ - AssertSuccess(Method::Get, 'api/smtp/018ff30e-a452-7316-b60f-a2d1c3fe16ab/attachments', [ + #[AssertSuccess(Method::Get, 'api/smtp/018ff30e-a452-7316-b60f-a2d1c3fe16ab/attachments', [ 'uuid' => '018ff30e-a452-7316-b60f-a2d1c3fe16ab', - ]), - ] + ]),] public function smtpAttachments(string $uuid): Attachments|Success { $this->debug('Show SMTP %s attachments', $uuid); @@ -84,11 +78,9 @@ public function smtpAttachments(string $uuid): Attachments|Success } #[StaticRoute(Method::Delete, 'api/events')] - #[ - AssertFail(Method::Delete, '/api/events'), + #[AssertFail(Method::Delete, '/api/events'), AssertFail(Method::Delete, 'api/events/'), - AssertFail(Method::Delete, 'api/event'), - ] + AssertFail(Method::Delete, 'api/event'),] public function eventsDelete(array $uuids = []): Success { $this->debug('Delete all events'); @@ -111,11 +103,9 @@ public function eventsDelete(array $uuids = []): Success } #[StaticRoute(Method::Get, 'api/events')] - #[ - AssertFail(Method::Get, 'api/event'), + #[AssertFail(Method::Get, 'api/event'), AssertFail(Method::Post, 'api/events'), - AssertFail(Method::Get, '/api/events'), - ] + AssertFail(Method::Get, '/api/events'),] public function eventsList(): EventCollection { $this->debug('List all events'); @@ -123,11 +113,9 @@ public function eventsList(): EventCollection } #[StaticRoute(Method::Get, 'api/settings')] - #[ - AssertFail(Method::Get, 'api/setting'), + #[AssertFail(Method::Get, 'api/setting'), AssertFail(Method::Post, 'api/settings'), - AssertFail(Method::Get, '/api/settings'), - ] + AssertFail(Method::Get, '/api/settings'),] public function settings(): Settings { $this->debug('List settings'); diff --git a/src/Traffic/Dispatcher/Http.php b/src/Traffic/Dispatcher/Http.php index 217c5334..b2949d34 100644 --- a/src/Traffic/Dispatcher/Http.php +++ b/src/Traffic/Dispatcher/Http.php @@ -48,7 +48,9 @@ public function __construct( $handlers, /** @see RequestHandler::handle() */ 'handle', - static function (): never { throw new \LogicException('No handler found for request.'); }, + static function (): never { + throw new \LogicException('No handler found for request.'); + }, 'never', ); } From 720e72e4f497abcd726798e96c27755eb33b9b37 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 8 Sep 2026 08:12:14 +0000 Subject: [PATCH 3/4] style(php-cs-fixer): fix coding standards --- src/Sender/Frontend/Service.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Sender/Frontend/Service.php b/src/Sender/Frontend/Service.php index d8fe17dd..c98dbf71 100644 --- a/src/Sender/Frontend/Service.php +++ b/src/Sender/Frontend/Service.php @@ -58,8 +58,8 @@ public function eventShow(string $uuid): Event|Success #[RegexpRoute(Method::Get, '#^api/smtp/(?[a-f0-9-]++)/attachments$#i')] #[AssertSuccess(Method::Get, 'api/smtp/018ff30e-a452-7316-b60f-a2d1c3fe16ab/attachments', [ - 'uuid' => '018ff30e-a452-7316-b60f-a2d1c3fe16ab', - ]),] + 'uuid' => '018ff30e-a452-7316-b60f-a2d1c3fe16ab', + ]),] public function smtpAttachments(string $uuid): Attachments|Success { $this->debug('Show SMTP %s attachments', $uuid); From bc7189553a7444114a150fcf15aa53c28c707960 Mon Sep 17 00:00:00 2001 From: roxblnfk Date: Tue, 8 Sep 2026 13:48:37 +0400 Subject: [PATCH 4/4] chore(dependencies): update dependencies --- composer.json | 8 +- composer.lock | 579 ++++++++++++++++++++++++-------------------------- 2 files changed, 286 insertions(+), 301 deletions(-) diff --git a/composer.json b/composer.json index 066a9732..5a849848 100644 --- a/composer.json +++ b/composer.json @@ -20,11 +20,11 @@ ], "authors": [ { - "name": "Aleksei Gagarin (roxblnfk)", + "name": "Aleksei Gagarin", "homepage": "https://github.com/roxblnfk" }, { - "name": "Pavel Buchnev (butschster)", + "name": "Pavel Buchnev", "homepage": "https://github.com/butschster" } ], @@ -41,7 +41,7 @@ "ext-filter": "*", "ext-sockets": "*", "clue/stream-filter": "^1.6", - "internal/container": "^1.0", + "internal/container": "^1.1", "internal/destroy": "^1.0", "nyholm/psr7": "^1.8", "php-http/message": "^1.15", @@ -54,7 +54,7 @@ "require-dev": { "dereuromark/composer-prefer-lowest": "^0.1.10", "ergebnis/phpunit-slow-test-detector": "^2.14", - "google/protobuf": "^3.25 || ^4.30", + "google/protobuf": "^3.25 || ^4.30 || ^v5.36.1", "phpunit/phpunit": "^10.5.10", "rector/rector": "^1.1", "roxblnfk/unpoly": "^1.8.1", diff --git a/composer.lock b/composer.lock index d229eb4e..5b651419 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4938a1b4bcbf20d13de777cf634dbd3c", + "content-hash": "456b60446244c7e36e4e30769d64025f", "packages": [ { "name": "clue/stream-filter", @@ -74,21 +74,21 @@ }, { "name": "internal/container", - "version": "1.0.1", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-internal/container.git", - "reference": "3ea996260fe8459b6fd17e575bef11a0f022df92" + "reference": "a1a0cc23601c4d09bc21511cbccba8653069d50c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-internal/container/zipball/3ea996260fe8459b6fd17e575bef11a0f022df92", - "reference": "3ea996260fe8459b6fd17e575bef11a0f022df92", + "url": "https://api.github.com/repos/php-internal/container/zipball/a1a0cc23601c4d09bc21511cbccba8653069d50c", + "reference": "a1a0cc23601c4d09bc21511cbccba8653069d50c", "shasum": "" }, "require": { "internal/destroy": "^1.0", - "php": ">=8.2", + "php": ">=8.1", "psr/container": "1 - 2", "yiisoft/injector": "^1.2" }, @@ -96,15 +96,22 @@ "psr/container-implementation": "1.0 - 2.0" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.8", "llm/skills": "^1.12", "revolt/event-loop": "^1.0", - "spiral/code-style": "^2.3.1", + "roxblnfk/unpoly": "^1.8", "testo/codecov": "^0.2.1", "testo/fiber": "^0.1.3", - "testo/testo": "^0.10.46", - "vimeo/psalm": "^6.10 || ^7.0" + "testo/testo": "^0.10.46" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false, + "target-directory": "tools" + } + }, "autoload": { "psr-4": { "Internal\\Container\\": "src/" @@ -131,7 +138,7 @@ ], "support": { "issues": "https://github.com/php-internal/container/issues", - "source": "https://github.com/php-internal/container/tree/1.0.1" + "source": "https://github.com/php-internal/container/tree/1.1.0" }, "funding": [ { @@ -139,7 +146,7 @@ "type": "boosty" } ], - "time": "2026-09-07T21:11:07+00:00" + "time": "2026-09-08T09:20:40+00:00" }, { "name": "internal/destroy", @@ -560,49 +567,47 @@ }, { "name": "symfony/console", - "version": "v8.1.1", + "version": "v6.4.45", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d" + "reference": "3b8473e0d14157f2d22b0a0d7259ad23483d1e6d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d", - "reference": "b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d", + "url": "https://api.github.com/repos/symfony/console/zipball/3b8473e0d14157f2d22b0a0d7259ad23483d1e6d", + "reference": "3b8473e0d14157f2d22b0a0d7259ad23483d1e6d", "shasum": "" }, "require": { - "php": ">=8.4.1", + "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php85": "^1.32", + "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^7.4.6|^8.0.6" + "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { - "symfony/dependency-injection": "<8.1", - "symfony/event-dispatcher": "<8.1" + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^7.4|^8.0", - "symfony/dependency-injection": "^8.1", - "symfony/event-dispatcher": "^8.1", - "symfony/filesystem": "^7.4|^8.0", - "symfony/http-foundation": "^7.4|^8.0", - "symfony/http-kernel": "^7.4|^8.0", - "symfony/lock": "^7.4|^8.0", - "symfony/messenger": "^7.4|^8.0", - "symfony/mime": "^7.4|^8.0", - "symfony/process": "^7.4|^8.0", - "symfony/stopwatch": "^7.4|^8.0", - "symfony/uid": "^7.4|^8.0", - "symfony/validator": "^7.4|^8.0", - "symfony/var-dumper": "^7.4|^8.0" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -636,7 +641,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v8.1.1" + "source": "https://github.com/symfony/console/tree/v6.4.45" }, "funding": [ { @@ -656,7 +661,7 @@ "type": "tidelift" } ], - "time": "2026-06-16T12:55:20+00:00" + "time": "2026-08-25T13:08:31+00:00" }, { "name": "symfony/deprecation-contracts", @@ -814,16 +819,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.38.1", + "version": "v1.41.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "e9247d281d694a5120554d9afaf54e070e88a603" + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603", - "reference": "e9247d281d694a5120554d9afaf54e070e88a603", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", "shasum": "" }, "require": { @@ -872,7 +877,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.41.0" }, "funding": [ { @@ -892,20 +897,20 @@ "type": "tidelift" } ], - "time": "2026-05-26T05:58:03+00:00" + "time": "2026-07-28T08:25:59+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.38.0", + "version": "v1.42.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" + "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", - "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/aa20edea75bd9c48cfecc8360922e5a6e5c44502", + "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502", "shasum": "" }, "require": { @@ -957,7 +962,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.42.0" }, "funding": [ { @@ -977,7 +982,7 @@ "type": "tidelift" } ], - "time": "2026-05-25T13:48:31+00:00" + "time": "2026-08-07T06:33:24+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -1064,98 +1069,18 @@ ], "time": "2026-05-27T06:59:30+00:00" }, - { - "name": "symfony/polyfill-php85", - "version": "v1.38.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", - "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php85\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php85/tree/v1.38.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-05-26T02:25:22+00:00" - }, { "name": "symfony/service-contracts", - "version": "v3.7.1", + "version": "v3.7.3", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0" + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/c0a284bab1ed8aa0417e3d69250ab437739563a0", - "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", "shasum": "" }, "require": { @@ -1209,7 +1134,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.7.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.3" }, "funding": [ { @@ -1229,38 +1154,37 @@ "type": "tidelift" } ], - "time": "2026-06-16T09:55:08+00:00" + "time": "2026-07-27T15:39:01+00:00" }, { "name": "symfony/string", - "version": "v8.1.0", + "version": "v6.4.43", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9" + "reference": "2a8d515c3eaa5d33cf76d5fa277cdadd0a4e5b49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/afd5944f4005862d961efb85c8bbd5c523c4e3c9", - "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9", + "url": "https://api.github.com/repos/symfony/string/zipball/2a8d515c3eaa5d33cf76d5fa277cdadd0a4e5b49", + "reference": "2a8d515c3eaa5d33cf76d5fa277cdadd0a4e5b49", "shasum": "" }, "require": { - "php": ">=8.4.1", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-intl-grapheme": "^1.33", - "symfony/polyfill-intl-normalizer": "^1.0", - "symfony/polyfill-mbstring": "^1.0" + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/emoji": "^7.4|^8.0", - "symfony/http-client": "^7.4|^8.0", - "symfony/intl": "^7.4|^8.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^7.4|^8.0" + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -1299,7 +1223,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.1.0" + "source": "https://github.com/symfony/string/tree/v6.4.43" }, "funding": [ { @@ -1319,36 +1243,37 @@ "type": "tidelift" } ], - "time": "2026-05-29T05:06:50+00:00" + "time": "2026-07-28T07:28:15+00:00" }, { "name": "symfony/var-dumper", - "version": "v8.1.1", + "version": "v6.4.45", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "40096a2515a979f3125c5c928603995b8664c62a" + "reference": "86a9b2f1bd81c9780a809632238ab6ba10292166" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/40096a2515a979f3125c5c928603995b8664c62a", - "reference": "40096a2515a979f3125c5c928603995b8664c62a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/86a9b2f1bd81c9780a809632238ab6ba10292166", + "reference": "86a9b2f1bd81c9780a809632238ab6ba10292166", "shasum": "" }, "require": { - "php": ">=8.4.1", - "symfony/polyfill-mbstring": "^1.0" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<7.4", - "symfony/error-handler": "<7.4" + "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^7.4|^8.0", - "symfony/http-kernel": "^7.4|^8.0", - "symfony/process": "^7.4|^8.0", - "symfony/uid": "^7.4|^8.0", - "twig/twig": "^3.12" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4|^4.0" }, "bin": [ "Resources/bin/var-dump-server" @@ -1386,7 +1311,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v8.1.1" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.45" }, "funding": [ { @@ -1406,7 +1331,7 @@ "type": "tidelift" } ], - "time": "2026-06-09T10:54:51+00:00" + "time": "2026-08-30T20:10:39+00:00" }, { "name": "yiisoft/injector", @@ -1488,16 +1413,16 @@ "packages-dev": [ { "name": "amphp/amp", - "version": "v3.1.2", + "version": "v3.1.3", "source": { "type": "git", "url": "https://github.com/amphp/amp.git", - "reference": "2f3ebed5a4f663968a0590dbb7654a8b32cb63cb" + "reference": "73c38b323ff8d790abf0f76c56fcc892bda4111a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/2f3ebed5a4f663968a0590dbb7654a8b32cb63cb", - "reference": "2f3ebed5a4f663968a0590dbb7654a8b32cb63cb", + "url": "https://api.github.com/repos/amphp/amp/zipball/73c38b323ff8d790abf0f76c56fcc892bda4111a", + "reference": "73c38b323ff8d790abf0f76c56fcc892bda4111a", "shasum": "" }, "require": { @@ -1557,7 +1482,7 @@ ], "support": { "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v3.1.2" + "source": "https://github.com/amphp/amp/tree/v3.1.3" }, "funding": [ { @@ -1565,7 +1490,7 @@ "type": "github" } ], - "time": "2026-06-21T13:59:44+00:00" + "time": "2026-07-19T17:59:20+00:00" }, { "name": "amphp/byte-stream", @@ -1709,16 +1634,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": { @@ -1737,7 +1662,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": { @@ -1786,7 +1711,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": [ { @@ -1794,7 +1719,7 @@ "type": "github" } ], - "time": "2025-01-19T15:43:40+00:00" + "time": "2026-07-26T17:53:54+00:00" }, { "name": "amphp/parallel", @@ -1944,16 +1869,16 @@ }, { "name": "amphp/pipeline", - "version": "v1.2.5", + "version": "v1.2.7", "source": { "type": "git", "url": "https://github.com/amphp/pipeline.git", - "reference": "92f121dde31cd1d89d5d0f9eba64ac40271b236e" + "reference": "cf2d67696c2015ea7c7fd8f6ec5f8ed7c2d17c17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/pipeline/zipball/92f121dde31cd1d89d5d0f9eba64ac40271b236e", - "reference": "92f121dde31cd1d89d5d0f9eba64ac40271b236e", + "url": "https://api.github.com/repos/amphp/pipeline/zipball/cf2d67696c2015ea7c7fd8f6ec5f8ed7c2d17c17", + "reference": "cf2d67696c2015ea7c7fd8f6ec5f8ed7c2d17c17", "shasum": "" }, "require": { @@ -1999,7 +1924,7 @@ ], "support": { "issues": "https://github.com/amphp/pipeline/issues", - "source": "https://github.com/amphp/pipeline/tree/v1.2.5" + "source": "https://github.com/amphp/pipeline/tree/v1.2.7" }, "funding": [ { @@ -2007,7 +1932,7 @@ "type": "github" } ], - "time": "2026-06-27T14:17:20+00:00" + "time": "2026-07-26T14:50:43+00:00" }, { "name": "amphp/process", @@ -2146,16 +2071,16 @@ }, { "name": "amphp/socket", - "version": "v2.4.0", + "version": "v2.4.1", "source": { "type": "git", "url": "https://github.com/amphp/socket.git", - "reference": "dadb63c5d3179fd83803e29dfeac27350e619314" + "reference": "b347be5aff6b2cc025208bb4d896607eb470c018" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/socket/zipball/dadb63c5d3179fd83803e29dfeac27350e619314", - "reference": "dadb63c5d3179fd83803e29dfeac27350e619314", + "url": "https://api.github.com/repos/amphp/socket/zipball/b347be5aff6b2cc025208bb4d896607eb470c018", + "reference": "b347be5aff6b2cc025208bb4d896607eb470c018", "shasum": "" }, "require": { @@ -2218,7 +2143,7 @@ ], "support": { "issues": "https://github.com/amphp/socket/issues", - "source": "https://github.com/amphp/socket/tree/v2.4.0" + "source": "https://github.com/amphp/socket/tree/v2.4.1" }, "funding": [ { @@ -2226,7 +2151,7 @@ "type": "github" } ], - "time": "2026-04-19T15:09:56+00:00" + "time": "2026-08-22T18:13:20+00:00" }, { "name": "amphp/sync", @@ -3231,20 +3156,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", @@ -3279,15 +3204,15 @@ ], "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", @@ -3342,20 +3267,19 @@ }, { "name": "nikic/php-parser", - "version": "v5.7.0", + "version": "v5.8.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f", "shasum": "" }, "require": { - "ext-ctype": "*", "ext-json": "*", "ext-tokenizer": "*", "php": ">=7.4" @@ -3394,9 +3318,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.8.0" }, - "time": "2025-12-06T11:56:16+00:00" + "time": "2026-07-04T14:30:18+00:00" }, { "name": "phar-io/manifest", @@ -3518,16 +3442,16 @@ }, { "name": "php-cs-fixer/shim", - "version": "v3.95.11", + "version": "v3.95.24", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/shim.git", - "reference": "87c59806c6ec3da0c554ca154a14c7e970fe5f26" + "reference": "fb929e8551bae0239936297f6402b513e98552e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/87c59806c6ec3da0c554ca154a14c7e970fe5f26", - "reference": "87c59806c6ec3da0c554ca154a14c7e970fe5f26", + "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/fb929e8551bae0239936297f6402b513e98552e2", + "reference": "fb929e8551bae0239936297f6402b513e98552e2", "shasum": "" }, "require": { @@ -3564,9 +3488,15 @@ "description": "A tool to automatically fix PHP code style", "support": { "issues": "https://github.com/PHP-CS-Fixer/shim/issues", - "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.95.11" + "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.95.24" }, - "time": "2026-06-25T14:17:29+00:00" + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2026-08-31T15:31:46+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -3746,16 +3676,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": { @@ -3787,17 +3717,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": "1.12.33", + "version": "1.12.34", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/37982d6fc7cbb746dda7773530cda557cdf119e1", - "reference": "37982d6fc7cbb746dda7773530cda557cdf119e1", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/4dd89ca7aa30fdc6760be21550d583bcc32e8476", + "reference": "4dd89ca7aa30fdc6760be21550d583bcc32e8476", "shasum": "" }, "require": { @@ -3842,7 +3772,7 @@ "type": "github" } ], - "time": "2026-02-28T20:30:03+00:00" + "time": "2026-07-28T10:04:39+00:00" }, { "name": "phpunit/php-code-coverage", @@ -4167,24 +4097,24 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.63", + "version": "10.5.64", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "33198268dad71e926626b618f3ec3966661e4d90" + "reference": "0e8c1d19cea35ad97d4887f363d07c78e30fbf06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/33198268dad71e926626b618f3ec3966661e4d90", - "reference": "33198268dad71e926626b618f3ec3966661e4d90", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0e8c1d19cea35ad97d4887f363d07c78e30fbf06", + "reference": "0e8c1d19cea35ad97d4887f363d07c78e30fbf06", "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", @@ -4248,31 +4178,15 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.63" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.64" }, "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:48:37+00:00" + "time": "2026-07-06T14:50:35+00:00" }, { "name": "rector/rector", @@ -4407,29 +4321,29 @@ }, { "name": "roxblnfk/unpoly", - "version": "1.8.4.6", + "version": "1.8.1.1", "source": { "type": "git", "url": "https://github.com/roxblnfk/unpoly.git", - "reference": "ad31e0109d3c74f320532f1150929aa4a58f7876" + "reference": "ec84dc56c97320acde5ab8875a39de36fdce36a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/roxblnfk/unpoly/zipball/ad31e0109d3c74f320532f1150929aa4a58f7876", - "reference": "ad31e0109d3c74f320532f1150929aa4a58f7876", + "url": "https://api.github.com/repos/roxblnfk/unpoly/zipball/ec84dc56c97320acde5ab8875a39de36fdce36a9", + "reference": "ec84dc56c97320acde5ab8875a39de36fdce36a9", "shasum": "" }, "require": { - "php": ">=8.4" + "php": ">=8.1" }, "replace": { + "symfony/polyfill-php70": "*", + "symfony/polyfill-php71": "*", + "symfony/polyfill-php72": "*", "symfony/polyfill-php73": "*", "symfony/polyfill-php74": "*", "symfony/polyfill-php80": "*", - "symfony/polyfill-php81": "*", - "symfony/polyfill-php82": "*", - "symfony/polyfill-php83": "*", - "symfony/polyfill-php84": "*" + "symfony/polyfill-php81": "*" }, "type": "metapackage", "notification-url": "https://packagist.org/downloads/", @@ -4451,7 +4365,7 @@ ], "support": { "issues": "https://github.com/roxblnfk/unpoly/issues", - "source": "https://github.com/roxblnfk/unpoly/tree/1.8.4.6" + "source": "https://github.com/roxblnfk/unpoly/tree/1.8.1.1" }, "funding": [ { @@ -4459,7 +4373,7 @@ "type": "patreon" } ], - "time": "2025-11-20T19:51:54+00:00" + "time": "2024-02-06T20:26:09+00:00" }, { "name": "sebastian/cli-parser", @@ -5231,16 +5145,16 @@ }, { "name": "sebastian/recursion-context", - "version": "5.0.1", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" + "reference": "5d32fe257a9b39cb63146924d6b4e32a22d4502a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5d32fe257a9b39cb63146924d6b4e32a22d4502a", + "reference": "5d32fe257a9b39cb63146924d6b4e32a22d4502a", "shasum": "" }, "require": { @@ -5283,7 +5197,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.2" }, "funding": [ { @@ -5303,7 +5217,7 @@ "type": "tidelift" } ], - "time": "2025-08-10T07:50:56+00:00" + "time": "2026-08-11T05:27:39+00:00" }, { "name": "sebastian/type", @@ -5540,26 +5454,25 @@ }, { "name": "symfony/filesystem", - "version": "v8.1.0", + "version": "v6.4.45", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "99aec13b82b4967ec5088222c4a3ecca955949c2" + "reference": "6dabf41c21957a2060f101bd7bf7e322989866bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/99aec13b82b4967ec5088222c4a3ecca955949c2", - "reference": "99aec13b82b4967ec5088222c4a3ecca955949c2", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/6dabf41c21957a2060f101bd7bf7e322989866bd", + "reference": "6dabf41c21957a2060f101bd7bf7e322989866bd", "shasum": "" }, "require": { - "php": ">=8.4.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^7.4|^8.0" + "symfony/process": "^5.4|^6.4|^7.0" }, "type": "library", "autoload": { @@ -5587,7 +5500,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v8.1.0" + "source": "https://github.com/symfony/filesystem/tree/v6.4.45" }, "funding": [ { @@ -5607,27 +5520,27 @@ "type": "tidelift" } ], - "time": "2026-05-29T05:06:50+00:00" + "time": "2026-08-23T07:59:31+00:00" }, { "name": "symfony/finder", - "version": "v8.1.1", + "version": "v6.4.44", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "e2989e762c70f9490fa3a00a0ac0fae5aa97a531" + "reference": "211b28d13d044dacdc00c1629a3bbcff27dc793a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/e2989e762c70f9490fa3a00a0ac0fae5aa97a531", - "reference": "e2989e762c70f9490fa3a00a0ac0fae5aa97a531", + "url": "https://api.github.com/repos/symfony/finder/zipball/211b28d13d044dacdc00c1629a3bbcff27dc793a", + "reference": "211b28d13d044dacdc00c1629a3bbcff27dc793a", "shasum": "" }, "require": { - "php": ">=8.4.1" + "php": ">=8.1" }, "require-dev": { - "symfony/filesystem": "^7.4|^8.0" + "symfony/filesystem": "^6.0|^7.0" }, "type": "library", "autoload": { @@ -5655,7 +5568,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v8.1.1" + "source": "https://github.com/symfony/finder/tree/v6.4.44" }, "funding": [ { @@ -5675,7 +5588,87 @@ "type": "tidelift" } ], - "time": "2026-06-27T09:05:56+00:00" + "time": "2026-08-21T10:00:03+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.38.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-26T12:51:13+00:00" }, { "name": "ta-tikoma/phpunit-architecture-test", @@ -5906,23 +5899,23 @@ }, { "name": "webmozart/assert", - "version": "2.4.1", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70" + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/2ccb7c2e821038c03a3e6e1700c570c158c55f70", - "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", "shasum": "" }, "require": { "ext-ctype": "*", "ext-date": "*", "ext-filter": "*", - "php": "^8.2" + "php": "^7.2 || ^8.0" }, "suggest": { "ext-intl": "", @@ -5931,12 +5924,8 @@ }, "type": "library", "extra": { - "psalm": { - "pluginClass": "Webmozart\\Assert\\PsalmPlugin" - }, "branch-alias": { - "dev-master": "2.0-dev", - "dev-feature/2-0": "2.0-dev" + "dev-master": "1.10-dev" } }, "autoload": { @@ -5952,10 +5941,6 @@ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" - }, - { - "name": "Woody Gilk", - "email": "woody.gilk@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", @@ -5966,9 +5951,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.4.1" + "source": "https://github.com/webmozarts/assert/tree/1.12.1" }, - "time": "2026-06-15T15:31:57+00:00" + "time": "2025-10-29T15:56:20+00:00" } ], "aliases": [],