diff --git a/CHANGELOG.md b/CHANGELOG.md index c265ed4..280044b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,28 @@ All notable changes to this project will be documented in this file, in reverse chronological order by release. +## 0.6.0 - TBD + +### Added + +- Nothing. + +### Changed + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- Nothing. + ## 0.5.4 - 2021-07-27 @@ -19,7 +41,7 @@ All notable changes to this project will be documented in this file, in reverse #### bug - - [28: ArrayFactory toArray() calls wrong method](https://github.com/open-code-modeling/json-schema-to-php-ast/issues/28) thanks to @sandrokeil +- [28: ArrayFactory toArray() calls wrong method](https://github.com/open-code-modeling/json-schema-to-php-ast/issues/28) thanks to @sandrokeil ## 0.5.3 - 2021-02-18 @@ -38,7 +60,7 @@ All notable changes to this project will be documented in this file, in reverse #### enhancement - - [26: Add namespace shortcut](https://github.com/open-code-modeling/json-schema-to-php-ast/issues/26) thanks to @sandrokeil +- [26: Add namespace shortcut](https://github.com/open-code-modeling/json-schema-to-php-ast/issues/26) thanks to @sandrokeil ## 0.5.2 - 2021-02-16 diff --git a/composer.json b/composer.json index 38320b7..6279219 100644 --- a/composer.json +++ b/composer.json @@ -34,9 +34,10 @@ "require": { "php": "^7.4 || ^8.0", "open-code-modeling/json-schema-to-php": "^0.3.0 || 0.4.x-dev", - "open-code-modeling/php-code-ast": "^0.12.0 || 0.13.x-dev" + "open-code-modeling/php-code-ast": "^0.13.0 || 0.13.x-dev" }, "require-dev": { + "ext-json": "*", "laminas/laminas-filter": "^2.9", "open-code-modeling/php-filter": "^0.1.1", "phpspec/prophecy-phpunit": "^2.0", diff --git a/composer.lock b/composer.lock index e6bc134..596f981 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "09819fcc56c8a62e88b8789186a33adc", + "content-hash": "6ab62cc60bd536214ba5a2f9b80a0627", "packages": [ { "name": "nikic/php-parser", - "version": "v4.10.4", + "version": "v4.13.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e" + "reference": "50953a2691a922aa1769461637869a0a2faa3f53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53", + "reference": "50953a2691a922aa1769461637869a0a2faa3f53", "shasum": "" }, "require": { @@ -58,9 +58,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0" }, - "time": "2020-12-20T10:01:03+00:00" + "time": "2021-09-20T12:20:58+00:00" }, { "name": "open-code-modeling/json-schema-to-php", @@ -121,16 +121,16 @@ }, { "name": "open-code-modeling/php-code-ast", - "version": "0.12.0", + "version": "0.13.x-dev", "source": { "type": "git", "url": "https://github.com/open-code-modeling/php-code-ast.git", - "reference": "8441ce175f360b8c3cff4afa0e82b5a09dc09fdb" + "reference": "4a5e7e05db4f07e6a4460f5ed324b21af307333d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/open-code-modeling/php-code-ast/zipball/8441ce175f360b8c3cff4afa0e82b5a09dc09fdb", - "reference": "8441ce175f360b8c3cff4afa0e82b5a09dc09fdb", + "url": "https://api.github.com/repos/open-code-modeling/php-code-ast/zipball/4a5e7e05db4f07e6a4460f5ed324b21af307333d", + "reference": "4a5e7e05db4f07e6a4460f5ed324b21af307333d", "shasum": "" }, "require": { @@ -148,6 +148,7 @@ "roave/security-advisories": "dev-master", "vimeo/psalm": "^4.4" }, + "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -170,33 +171,33 @@ "issues": "https://github.com/open-code-modeling/php-code-ast/issues", "source": "https://github.com/open-code-modeling/php-code-ast" }, - "time": "2021-02-12T14:17:11+00:00" + "time": "2021-09-24T06:36:18+00:00" } ], "packages-dev": [ { "name": "amphp/amp", - "version": "v2.5.2", + "version": "v2.6.1", "source": { "type": "git", "url": "https://github.com/amphp/amp.git", - "reference": "efca2b32a7580087adb8aabbff6be1dc1bb924a9" + "reference": "c5fc66a78ee38d7ac9195a37bacaf940eb3f65ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/efca2b32a7580087adb8aabbff6be1dc1bb924a9", - "reference": "efca2b32a7580087adb8aabbff6be1dc1bb924a9", + "url": "https://api.github.com/repos/amphp/amp/zipball/c5fc66a78ee38d7ac9195a37bacaf940eb3f65ae", + "reference": "c5fc66a78ee38d7ac9195a37bacaf940eb3f65ae", "shasum": "" }, "require": { - "php": ">=7" + "php": ">=7.1" }, "require-dev": { "amphp/php-cs-fixer-config": "dev-master", "amphp/phpunit-util": "^1", "ext-json": "*", "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^6.0.9 | ^7", + "phpunit/phpunit": "^7 | ^8 | ^9", "psalm/phar": "^3.11@dev", "react/promise": "^2" }, @@ -253,7 +254,7 @@ "support": { "irc": "irc://irc.freenode.org/amphp", "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.5.2" + "source": "https://github.com/amphp/amp/tree/v2.6.1" }, "funding": [ { @@ -261,20 +262,20 @@ "type": "github" } ], - "time": "2021-01-10T17:06:37+00:00" + "time": "2021-09-23T18:43:08+00:00" }, { "name": "amphp/byte-stream", - "version": "v1.8.0", + "version": "v1.8.1", "source": { "type": "git", "url": "https://github.com/amphp/byte-stream.git", - "reference": "f0c20cf598a958ba2aa8c6e5a71c697d652c7088" + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/f0c20cf598a958ba2aa8c6e5a71c697d652c7088", - "reference": "f0c20cf598a958ba2aa8c6e5a71c697d652c7088", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", "shasum": "" }, "require": { @@ -330,22 +331,28 @@ "support": { "irc": "irc://irc.freenode.org/amphp", "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/master" + "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" }, - "time": "2020-06-29T18:35:05+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2021-03-30T17:13:30+00:00" }, { "name": "composer/package-versions-deprecated", - "version": "1.11.99.1", + "version": "1.11.99.4", "source": { "type": "git", "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6" + "reference": "b174585d1fe49ceed21928a945138948cb394600" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/7413f0b55a051e89485c5cb9f765fe24bb02a7b6", - "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b174585d1fe49ceed21928a945138948cb394600", + "reference": "b174585d1fe49ceed21928a945138948cb394600", "shasum": "" }, "require": { @@ -389,7 +396,7 @@ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", "support": { "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.1" + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.4" }, "funding": [ { @@ -405,20 +412,20 @@ "type": "tidelift" } ], - "time": "2020-11-11T10:22:58+00:00" + "time": "2021-09-13T08:41:34+00:00" }, { "name": "composer/semver", - "version": "3.2.4", + "version": "3.2.5", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464" + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/a02fdf930a3c1c3ed3a49b5f63859c0c20e10464", - "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464", + "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", "shasum": "" }, "require": { @@ -470,7 +477,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.4" + "source": "https://github.com/composer/semver/tree/3.2.5" }, "funding": [ { @@ -486,28 +493,29 @@ "type": "tidelift" } ], - "time": "2020-11-13T08:59:24+00:00" + "time": "2021-05-24T12:41:47+00:00" }, { "name": "composer/xdebug-handler", - "version": "1.4.5", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "f28d44c286812c714741478d968104c5e604a1d4" + "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f28d44c286812c714741478d968104c5e604a1d4", - "reference": "f28d44c286812c714741478d968104c5e604a1d4", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339", + "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" + "psr/log": "^1 || ^2 || ^3" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "autoload": { @@ -533,7 +541,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/1.4.5" + "source": "https://github.com/composer/xdebug-handler/tree/2.0.2" }, "funding": [ { @@ -549,7 +557,7 @@ "type": "tidelift" } ], - "time": "2020-11-13T08:04:11+00:00" + "time": "2021-07-31T17:03:58+00:00" }, { "name": "dnoegel/php-xdg-base-dir", @@ -590,35 +598,32 @@ }, { "name": "doctrine/annotations", - "version": "1.11.1", + "version": "1.13.2", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad" + "reference": "5b668aef16090008790395c02c893b1ba13f7e08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/ce77a7ba1770462cd705a91a151b6c3746f9c6ad", - "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", + "reference": "5b668aef16090008790395c02c893b1ba13f7e08", "shasum": "" }, "require": { "doctrine/lexer": "1.*", "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { - "doctrine/cache": "1.*", + "doctrine/cache": "^1.11 || ^2.0", "doctrine/coding-standard": "^6.0 || ^8.1", "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^9.1.5" + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", + "symfony/cache": "^4.4 || ^5.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" @@ -659,9 +664,9 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.11.1" + "source": "https://github.com/doctrine/annotations/tree/1.13.2" }, - "time": "2020-10-26T10:28:16+00:00" + "time": "2021-08-05T19:00:23+00:00" }, { "name": "doctrine/instantiator", @@ -814,20 +819,20 @@ }, { "name": "felixfbecker/advanced-json-rpc", - "version": "v3.2.0", + "version": "v3.2.1", "source": { "type": "git", "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "06f0b06043c7438959dbdeed8bb3f699a19be22e" + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/06f0b06043c7438959dbdeed8bb3f699a19be22e", - "reference": "06f0b06043c7438959dbdeed8bb3f699a19be22e", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", "shasum": "" }, "require": { - "netresearch/jsonmapper": "^1.0 || ^2.0", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", "php": "^7.1 || ^8.0", "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" }, @@ -853,22 +858,22 @@ "description": "A more advanced JSONRPC implementation", "support": { "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", - "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.0" + "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" }, - "time": "2021-01-10T17:48:47+00:00" + "time": "2021-06-11T22:34:44+00:00" }, { "name": "felixfbecker/language-server-protocol", - "version": "v1.5.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "85e83cacd2ed573238678c6875f8f0d7ec699541" + "reference": "9d846d1f5cf101deee7a61c8ba7caa0a975cd730" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/85e83cacd2ed573238678c6875f8f0d7ec699541", - "reference": "85e83cacd2ed573238678c6875f8f0d7ec699541", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/9d846d1f5cf101deee7a61c8ba7caa0a975cd730", + "reference": "9d846d1f5cf101deee7a61c8ba7caa0a975cd730", "shasum": "" }, "require": { @@ -909,27 +914,27 @@ ], "support": { "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.0" + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/1.5.1" }, - "time": "2020-10-23T13:55:30+00:00" + "time": "2021-02-22T14:02:09+00:00" }, { "name": "friendsofphp/php-cs-fixer", - "version": "v2.18.2", + "version": "v2.19.2", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "18f8c9d184ba777380794a389fabc179896ba913" + "reference": "d5c737c2e18ba502b75b44832b31fe627f82e307" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/18f8c9d184ba777380794a389fabc179896ba913", - "reference": "18f8c9d184ba777380794a389fabc179896ba913", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/d5c737c2e18ba502b75b44832b31fe627f82e307", + "reference": "d5c737c2e18ba502b75b44832b31fe627f82e307", "shasum": "" }, "require": { "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^1.2", + "composer/xdebug-handler": "^1.2 || ^2.0", "doctrine/annotations": "^1.2", "ext-json": "*", "ext-tokenizer": "*", @@ -972,6 +977,11 @@ "php-cs-fixer" ], "type": "application", + "extra": { + "branch-alias": { + "dev-master": "2.19-dev" + } + }, "autoload": { "psr-4": { "PhpCsFixer\\": "src/" @@ -986,6 +996,7 @@ "tests/Test/IntegrationCaseFactoryInterface.php", "tests/Test/InternalIntegrationCaseFactory.php", "tests/Test/IsIdenticalConstraint.php", + "tests/Test/TokensWithObservedTransformers.php", "tests/TestCase.php" ] }, @@ -1006,7 +1017,7 @@ "description": "A tool to automatically fix PHP code style", "support": { "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", - "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v2.18.2" + "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v2.19.2" }, "funding": [ { @@ -1014,20 +1025,20 @@ "type": "github" } ], - "time": "2021-01-26T00:22:21+00:00" + "time": "2021-08-18T19:55:46+00:00" }, { "name": "laminas/laminas-filter", - "version": "2.10.0", + "version": "2.11.1", "source": { "type": "git", "url": "https://github.com/laminas/laminas-filter.git", - "reference": "cfb40b104e92a0b52bee696b74f958798ad8faa4" + "reference": "671724e163aa75c210e94d12b77a0f3f8240d4b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-filter/zipball/cfb40b104e92a0b52bee696b74f958798ad8faa4", - "reference": "cfb40b104e92a0b52bee696b74f958798ad8faa4", + "url": "https://api.github.com/repos/laminas/laminas-filter/zipball/671724e163aa75c210e94d12b77a0f3f8240d4b2", + "reference": "671724e163aa75c210e94d12b77a0f3f8240d4b2", "shasum": "" }, "require": { @@ -1049,7 +1060,9 @@ "pear/archive_tar": "^1.4.3", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.3", - "psr/http-factory": "^1.0" + "psalm/plugin-phpunit": "^0.15.1", + "psr/http-factory": "^1.0", + "vimeo/psalm": "^4.6" }, "suggest": { "laminas/laminas-crypt": "Laminas\\Crypt component, for encryption filters", @@ -1094,33 +1107,34 @@ "type": "community_bridge" } ], - "time": "2021-01-01T14:37:45+00:00" + "time": "2021-05-24T18:29:02+00:00" }, { "name": "laminas/laminas-stdlib", - "version": "3.3.1", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-stdlib.git", - "reference": "d81c7ffe602ed0e6ecb18691019111c0f4bf1efe" + "reference": "c53d8537f108fac3fae652677a19735db730ba46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/d81c7ffe602ed0e6ecb18691019111c0f4bf1efe", - "reference": "d81c7ffe602ed0e6ecb18691019111c0f4bf1efe", + "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/c53d8537f108fac3fae652677a19735db730ba46", + "reference": "c53d8537f108fac3fae652677a19735db730ba46", "shasum": "" }, "require": { - "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^7.3 || ^8.0" + "php": "^7.3 || ~8.0.0 || ~8.1.0" }, - "replace": { - "zendframework/zend-stdlib": "^3.2.1" + "conflict": { + "zendframework/zend-stdlib": "*" }, "require-dev": { - "laminas/laminas-coding-standard": "~1.0.0", + "laminas/laminas-coding-standard": "~2.3.0", "phpbench/phpbench": "^0.17.1", - "phpunit/phpunit": "~9.3.7" + "phpunit/phpunit": "~9.3.7", + "psalm/plugin-phpunit": "^0.16.0", + "vimeo/psalm": "^4.7" }, "type": "library", "autoload": { @@ -1152,28 +1166,30 @@ "type": "community_bridge" } ], - "time": "2020-11-19T20:18:59+00:00" + "time": "2021-09-02T16:11:32+00:00" }, { "name": "laminas/laminas-zendframework-bridge", - "version": "1.1.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642" + "reference": "bf180a382393e7db5c1e8d0f2ec0c4af9c724baf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642", + "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/bf180a382393e7db5c1e8d0f2ec0c4af9c724baf", + "reference": "bf180a382393e7db5c1e8d0f2ec0c4af9c724baf", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0 || ^8.0" + "php": "^7.3 || ~8.0.0 || ~8.1.0" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", - "squizlabs/php_codesniffer": "^3.5" + "phpunit/phpunit": "^9.3", + "psalm/plugin-phpunit": "^0.15.1", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.6" }, "type": "library", "extra": { @@ -1212,7 +1228,7 @@ "type": "community_bridge" } ], - "time": "2020-09-14T14:23:00+00:00" + "time": "2021-09-03T17:53:30+00:00" }, { "name": "myclabs/deep-copy", @@ -1274,16 +1290,16 @@ }, { "name": "netresearch/jsonmapper", - "version": "v2.1.0", + "version": "v4.0.0", "source": { "type": "git", "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "e0f1e33a71587aca81be5cffbb9746510e1fe04e" + "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/e0f1e33a71587aca81be5cffbb9746510e1fe04e", - "reference": "e0f1e33a71587aca81be5cffbb9746510e1fe04e", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", + "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", "shasum": "" }, "require": { @@ -1291,10 +1307,10 @@ "ext-pcre": "*", "ext-reflection": "*", "ext-spl": "*", - "php": ">=5.6" + "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "~4.8.35 || ~5.7 || ~6.4 || ~7.0", + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", "squizlabs/php_codesniffer": "~3.5" }, "type": "library", @@ -1319,9 +1335,9 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/master" + "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" }, - "time": "2020-04-16T18:48:43+00:00" + "time": "2020-12-01T19:48:11+00:00" }, { "name": "open-code-modeling/php-filter", @@ -1440,16 +1456,16 @@ }, { "name": "phar-io/manifest", - "version": "2.0.1", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", "shasum": "" }, "require": { @@ -1494,22 +1510,22 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/master" + "source": "https://github.com/phar-io/manifest/tree/2.0.3" }, - "time": "2020-06-27T14:33:11+00:00" + "time": "2021-07-20T11:28:43+00:00" }, { "name": "phar-io/version", - "version": "3.0.4", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "e4782611070e50613683d2b9a57730e9a3ba5451" + "reference": "bae7c545bef187884426f042434e561ab1ddb182" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/e4782611070e50613683d2b9a57730e9a3ba5451", - "reference": "e4782611070e50613683d2b9a57730e9a3ba5451", + "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", + "reference": "bae7c545bef187884426f042434e561ab1ddb182", "shasum": "" }, "require": { @@ -1545,9 +1561,9 @@ "description": "Library for handling version information and constraints", "support": { "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.0.4" + "source": "https://github.com/phar-io/version/tree/3.1.0" }, - "time": "2020-12-13T23:18:30+00:00" + "time": "2021-02-23T14:00:09+00:00" }, { "name": "php-cs-fixer/diff", @@ -1715,16 +1731,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.4.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + "reference": "30f38bffc6f24293dadd1823936372dfa9e86e2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/30f38bffc6f24293dadd1823936372dfa9e86e2f", + "reference": "30f38bffc6f24293dadd1823936372dfa9e86e2f", "shasum": "" }, "require": { @@ -1732,7 +1748,8 @@ "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "ext-tokenizer": "*" + "ext-tokenizer": "*", + "psalm/phar": "^4.8" }, "type": "library", "extra": { @@ -1758,39 +1775,39 @@ "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.4.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.0" }, - "time": "2020-09-17T18:55:26+00:00" + "time": "2021-09-17T15:28:14+00:00" }, { "name": "phpspec/prophecy", - "version": "1.12.2", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "245710e971a030f42e08f4912863805570f23d39" + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/245710e971a030f42e08f4912863805570f23d39", - "reference": "245710e971a030f42e08f4912863805570f23d39", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", "shasum": "" }, "require": { "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", + "php": "^7.2 || ~8.0, <8.2", "phpdocumentor/reflection-docblock": "^5.2", "sebastian/comparator": "^3.0 || ^4.0", "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { - "phpspec/phpspec": "^6.0", + "phpspec/phpspec": "^6.0 || ^7.0", "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11.x-dev" + "dev-master": "1.x-dev" } }, "autoload": { @@ -1825,9 +1842,9 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.12.2" + "source": "https://github.com/phpspec/prophecy/tree/1.14.0" }, - "time": "2020-12-19T10:15:11+00:00" + "time": "2021-09-10T09:02:12+00:00" }, { "name": "phpspec/prophecy-phpunit", @@ -1883,23 +1900,23 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.5", + "version": "9.2.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1" + "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f3e026641cc91909d421802dd3ac7827ebfd97e1", - "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d4c798ed8d51506800b441f7a13ecb0f76f12218", + "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.10.2", + "nikic/php-parser": "^4.12.0", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -1948,7 +1965,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.5" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.7" }, "funding": [ { @@ -1956,7 +1973,7 @@ "type": "github" } ], - "time": "2020-11-28T06:44:49+00:00" + "time": "2021-09-17T05:39:03+00:00" }, { "name": "phpunit/php-file-iterator", @@ -2201,16 +2218,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.2", + "version": "9.5.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f661659747f2f87f9e72095bb207bceb0f151cb4" + "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f661659747f2f87f9e72095bb207bceb0f151cb4", - "reference": "f661659747f2f87f9e72095bb207bceb0f151cb4", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a", + "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a", "shasum": "" }, "require": { @@ -2222,11 +2239,11 @@ "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.1", + "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.3", + "phpunit/php-code-coverage": "^9.2.7", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", @@ -2240,7 +2257,7 @@ "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^2.3", + "sebastian/type": "^2.3.4", "sebastian/version": "^3.0.2" }, "require-dev": { @@ -2288,7 +2305,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.10" }, "funding": [ { @@ -2300,7 +2317,7 @@ "type": "github" } ], - "time": "2021-02-02T14:45:58+00:00" + "time": "2021-09-25T07:38:51+00:00" }, { "name": "prooph/php-cs-fixer-config", @@ -2354,16 +2371,16 @@ }, { "name": "psalm/plugin-phpunit", - "version": "0.15.1", + "version": "0.15.2", "source": { "type": "git", "url": "https://github.com/psalm/psalm-plugin-phpunit.git", - "reference": "30ca25ce069bf4943c36e59b7df6954f6af05e64" + "reference": "31d15bbc0169a3c454e495e03fd8a6ccb663661b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/psalm/psalm-plugin-phpunit/zipball/30ca25ce069bf4943c36e59b7df6954f6af05e64", - "reference": "30ca25ce069bf4943c36e59b7df6954f6af05e64", + "url": "https://api.github.com/repos/psalm/psalm-plugin-phpunit/zipball/31d15bbc0169a3c454e495e03fd8a6ccb663661b", + "reference": "31d15bbc0169a3c454e495e03fd8a6ccb663661b", "shasum": "" }, "require": { @@ -2408,22 +2425,22 @@ "description": "Psalm plugin for PHPUnit", "support": { "issues": "https://github.com/psalm/psalm-plugin-phpunit/issues", - "source": "https://github.com/psalm/psalm-plugin-phpunit/tree/0.15.1" + "source": "https://github.com/psalm/psalm-plugin-phpunit/tree/0.15.2" }, - "time": "2021-01-23T00:19:07+00:00" + "time": "2021-05-29T19:11:38+00:00" }, { - "name": "psr/container", - "version": "1.0.0", + "name": "psr/cache", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", "shasum": "" }, "require": { @@ -2437,7 +2454,7 @@ }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Psr\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2450,6 +2467,50 @@ "homepage": "http://www.php-fig.org/" } ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], "description": "Common Container Interface (PHP FIG PSR-11)", "homepage": "https://github.com/php-fig/container", "keywords": [ @@ -2461,9 +2522,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/master" + "source": "https://github.com/php-fig/container/tree/1.1.1" }, - "time": "2017-02-14T16:28:37+00:00" + "time": "2021-03-05T17:36:06+00:00" }, { "name": "psr/event-dispatcher", @@ -2517,16 +2578,16 @@ }, { "name": "psr/log", - "version": "1.1.3", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { @@ -2550,7 +2611,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", @@ -2561,9 +2622,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" + "source": "https://github.com/php-fig/log/tree/1.1.4" }, - "time": "2020-03-23T09:12:05+00:00" + "time": "2021-05-03T11:20:27+00:00" }, { "name": "roave/security-advisories", @@ -2571,18 +2632,20 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "5f40d4d577a71466f9723122251b46bdaf634709" + "reference": "0488e161600117fc3a0d72397dad154729002f54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/5f40d4d577a71466f9723122251b46bdaf634709", - "reference": "5f40d4d577a71466f9723122251b46bdaf634709", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/0488e161600117fc3a0d72397dad154729002f54", + "reference": "0488e161600117fc3a0d72397dad154729002f54", "shasum": "" }, "conflict": { "3f/pygmentize": "<1.2", "adodb/adodb-php": "<5.20.12", + "akaunting/akaunting": "<2.1.13", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amazing/media2click": ">=1,<1.3.3", "amphp/artax": "<1.0.6|>=2,<2.0.6", "amphp/http": "<1.0.1", "amphp/http-client": ">=4,<4.4", @@ -2592,25 +2655,34 @@ "bagisto/bagisto": "<0.1.5", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", - "baserproject/basercms": ">=4,<=4.3.6|>=4.4,<4.4.1", - "bolt/bolt": "<3.7.1", + "baserproject/basercms": "<=4.5", + "billz/raspap-webgui": "<=2.6.6", + "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "bolt/bolt": "<3.7.2", + "bolt/core": "<4.1.13", "brightlocal/phpwhois": "<=4.2.5", "buddypress/buddypress": "<5.1.2", "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cachethq/cachet": "<2.5.1", "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", "cartalyst/sentry": "<=2.1.6", - "centreon/centreon": "<18.10.8|>=19,<19.4.5", + "centreon/centreon": "<20.10.7", "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<=3.0.6", - "composer/composer": "<=1-alpha.11", + "codiad/codiad": "<=2.8.4", + "composer/composer": "<1.10.22|>=2-alpha.1,<2.0.13", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0", + "contao/core-bundle": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|= 4.10.0", "contao/listing-bundle": ">=4,<4.4.8", + "craftcms/cms": "<3.6.7", + "croogo/croogo": "<3.0.7", "datadog/dd-trace": ">=0.30,<0.30.2", "david-garcia/phpwhois": "<=4.3.1", "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", + "directmailteam/direct-mail": "<5.2.4", "doctrine/annotations": ">=1,<1.2.7", "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", @@ -2619,133 +2691,181 @@ "doctrine/doctrine-module": "<=0.7.1", "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", - "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", - "dolibarr/dolibarr": "<11.0.4", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", + "dolibarr/dolibarr": "<14|>= 3.3.beta1, < 13.0.2", "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", - "drupal/drupal": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", + "drupal/core": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", + "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", + "dweeves/magmi": "<=0.7.24", + "ecodev/newsletter": "<=4", "endroid/qr-code-bundle": "<3.4.2", "enshrined/svg-sanitize": "<0.13.1", "erusev/parsedown": "<1.7.2", + "ether/logs": "<3.0.4", "ezsystems/demobundle": ">=5.4,<5.4.6.1", "ezsystems/ez-support-tools": ">=2.2,<2.2.3", "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", - "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", + "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", - "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", + "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<6.13.6.3|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.7.1", - "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", + "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", + "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.3.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", "ezyang/htmlpurifier": "<4.1.1", + "facade/ignition": "<1.16.14|>=2,<2.4.2|>=2.5,<2.5.2", + "feehi/cms": "<=2.1.1", + "feehi/feehicms": "<=0.1.3", "firebase/php-jwt": "<2", + "flarum/core": ">=1,<=1.0.1", "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", "flarum/tags": "<=0.1-beta.13", + "fluidtypo3/vhs": "<5.1.1", "fooman/tcpdf": "<6.2.22", + "forkcms/forkcms": "<=5.9.2", "fossar/tcpdf-parser": "<6.2.22", + "francoisjacquet/rosariosis": "<6.5.1", "friendsofsymfony/oauth2-php": "<1.3", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "froala/wysiwyg-editor": "<3.2.7", "fuel/core": "<1.8.1", - "getgrav/grav": "<1.7-beta.8", - "getkirby/cms": ">=3,<3.4.5", + "getgrav/grav": "<1.7.21", + "getkirby/cms": "<=3.5.6", "getkirby/panel": "<2.5.14", + "gilacms/gila": "<=1.11.4", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", "gregwar/rst": "<1.0.3", + "grumpydictator/firefly-iii": "<5.6.1", "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "helloxz/imgurl": "<=2.31", + "ibexa/post-install": "<=1.0.4", + "icecoder/icecoder": "<=8", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", - "illuminate/database": "<6.20.14|>=7,<7.30.4|>=8,<8.24", + "illuminate/database": "<6.20.26|>=7,<8.40", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", "illuminate/view": ">=7,<7.1.2", + "impresscms/impresscms": "<=1.4.2", + "in2code/femanager": "<5.5.1|>=6,<6.3.1", + "intelliants/subrion": "<=4.2.1", "ivankristianto/phpwhois": "<=4.3", "james-heinrich/getid3": "<1.9.9", + "joomla/archive": "<1.1.10", "joomla/session": "<1.3.1", "jsmitty12/phpwhois": "<5.1", "kazist/phpwhois": "<=4.2.6", "kitodo/presentation": "<3.1.2", + "klaviyo/magento2-extension": ">=1,<3", "kreait/firebase-php": ">=3.2,<3.8.1", "la-haute-societe/tcpdf": "<6.2.22", - "laravel/framework": "<6.20.14|>=7,<7.30.4|>=8,<8.24", + "laminas/laminas-http": "<2.14.2", + "laravel/framework": "<6.20.26|>=7,<8.40", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "lavalite/cms": "<=5.8", + "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", "league/commonmark": "<0.18.3", - "librenms/librenms": "<1.53", + "league/flysystem": "<1.1.4|>=2,<2.1.1", + "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", + "librenms/librenms": "<21.1", "livewire/livewire": ">2.2.4,<2.2.6", + "lms/routes": "<2.1.1", + "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", "magento/magento1ce": "<1.9.4.3", "magento/magento1ee": ">=1,<1.14.4.3", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", "marcwillmann/turn": "<0.3.3", - "mautic/core": "<2.16.5|>=3,<3.2.4|= 2.13.1", + "mautic/core": "<4|= 2.13.1", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", "monolog/monolog": ">=1.8,<1.12", + "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10,<3.10.2", "namshi/jose": "<2.2", + "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nilsteampassnet/teampass": "<=2.1.27.36", + "nukeviet/nukeviet": "<4.3.4", "nystudio107/craft-seomatic": "<3.3", "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", - "october/backend": ">=1.0.319,<1.0.470", - "october/cms": "= 1.0.469|>=1.0.319,<1.0.469", + "october/backend": "<1.1.2", + "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", "october/october": ">=1.0.319,<1.0.466", "october/rain": "<1.0.472|>=1.1,<1.1.2", + "october/system": "<1.0.472|>=1.1.1,<1.1.5", "onelogin/php-saml": "<2.10.4", "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "opencart/opencart": "<=3.0.3.2", "openid/php-openid": "<2.3", - "openmage/magento-lts": "<19.4.8|>=20,<20.0.4", + "openmage/magento-lts": "<19.4.15|>=20,<20.0.13", "orchid/platform": ">=9,<9.4.4", "oro/crm": ">=1.7,<1.7.4", "oro/platform": ">=1.7,<1.7.4", "padraic/humbug_get_contents": "<1.1.2", "pagarme/pagarme-php": ">=0,<3", + "pagekit/pagekit": "<=1.0.18", "paragonie/random_compat": "<2", "passbolt/passbolt_api": "<2.11", "paypal/merchant-sdk-php": "<3.12", - "pear/archive_tar": "<1.4.12", + "pear/archive_tar": "<1.4.14", "personnummer/personnummer": "<3.0.2", - "phpfastcache/phpfastcache": ">=5,<5.0.13", - "phpmailer/phpmailer": "<6.1.6", + "phanan/koel": "<5.1.4", + "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", + "phpmailer/phpmailer": "<6.5", "phpmussel/phpmussel": ">=1,<1.6", "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", "phpoffice/phpexcel": "<1.8.2", "phpoffice/phpspreadsheet": "<1.16", + "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7", "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<6.3", + "pimcore/pimcore": "<10.1.3", "pocketmine/pocketmine-mp": "<3.15.4", + "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", "prestashop/contactform": ">1.0.1,<4.3", "prestashop/gamification": "<2.3.2", "prestashop/productcomments": ">=4,<4.2.1", + "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", "propel/propel": ">=2-alpha.1,<=2-alpha.7", "propel/propel1": ">=1,<=1.7.1", "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", "pusher/pusher-php-server": "<2.2.1", + "pwweb/laravel-core": "<=0.3.6-beta", "rainlab/debugbar-plugin": "<3.1", + "rmccue/requests": ">=1.6,<1.8", "robrichards/xmlseclibs": "<3.0.4", "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.3.4", - "shopware/platform": "<=6.3.5", - "shopware/shopware": "<5.6.9", + "shopware/core": "<=6.4.3", + "shopware/platform": "<=6.4.3", + "shopware/production": "<=6.3.5.2", + "shopware/shopware": "<5.6.10", + "showdoc/showdoc": "<=2.9.8", "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<4.4.7|>=4.5,<4.5.4", - "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2|>=3.2,<3.2.4", + "silverstripe/framework": "<4.7.4", + "silverstripe/graphql": "<=3.5|>=4-alpha.1,<4-alpha.2", "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", "silverstripe/subsites": ">=2,<2.1.1", @@ -2757,23 +2877,26 @@ "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", "simplito/elliptic-php": "<1.0.6", "slim/slim": "<2.6", - "smarty/smarty": "<3.1.33", + "smarty/smarty": "<3.1.39", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", "ssddanbrown/bookstack": "<0.29.2", "stormpath/sdk": ">=0,<9.9.99", - "studio-42/elfinder": "<2.1.49", - "sulu/sulu": "<1.6.34|>=2,<2.0.10|>=2.1,<2.1.1", + "studio-42/elfinder": "<2.1.59", + "subrion/cms": "<=4.2.1", + "sulu/sulu": "<1.6.41|>=2,<2.0.10|>=2.1,<2.1.1", "swiftmailer/swiftmailer": ">=4,<5.4.5", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", - "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3", + "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3|>=1.9,<1.9.5", "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfont/process": ">=0,<4", "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", @@ -2782,54 +2905,71 @@ "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", "symfony/mime": ">=4.3,<4.3.8", "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/polyfill": ">=1,<1.10", "symfony/polyfill-php55": ">=1,<1.10", "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/routing": ">=2,<2.0.19", - "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8|>=5.3,<5.3.2", "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", + "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.24|>=5,<5.2.9|>=5.3,<5.3.2", "symfony/translation": ">=2,<2.0.17", "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3/dce": ">=2.2,<2.6.2", "t3g/svg-sanitizer": "<1.0.3", "tecnickcom/tcpdf": "<6.2.22", "thelia/backoffice-default-template": ">=2.1,<2.1.2", "thelia/thelia": ">=2.1-beta.1,<2.1.3", "theonedemon/phpwhois": "<=4.2.5", "titon/framework": ">=0,<9.9.99", + "topthink/think": "<=6.0.9", + "topthink/thinkphp": "<=3.2.3", + "tribalsystems/zenario": "<8.8.53370", "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", - "typo3/cms-core": ">=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", - "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", - "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.3.2", + "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.52|>=8,<=8.7.41|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.3.2", + "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", "ua-parser/uap-php": "<3.8", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "vanilla/safecurl": "<0.9.2", "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", + "vrana/adminer": "<4.7.9", "wallabag/tcpdf": "<6.2.22", + "web-auth/webauthn-framework": ">=3.3,<3.3.4", + "webcoast/deferred-image-processing": "<1.0.2", + "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", + "wp-cli/wp-cli": "<2.5", + "yidashi/yii2cmf": "<=2", "yii2mod/yii2-cms": "<1.9.2", "yiisoft/yii": ">=1.1.14,<1.1.15", "yiisoft/yii2": "<2.0.38", "yiisoft/yii2-bootstrap": "<2.0.4", - "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-dev": "<2.0.43", "yiisoft/yii2-elasticsearch": "<2.0.5", "yiisoft/yii2-gii": "<2.0.4", "yiisoft/yii2-jui": "<2.0.4", "yiisoft/yii2-redis": "<2.0.8", - "yourls/yourls": "<1.7.4", + "yoast-seo-for-typo3/yoast_seo": "<7.2.3", + "yourls/yourls": "<=1.8.2", + "zendesk/zendesk_api_client_php": "<2.2.11", "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", @@ -2847,14 +2987,15 @@ "zendframework/zend-validator": ">=2.3,<2.3.6", "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zendframework": "<2.5.1", + "zendframework/zendframework": "<=3", "zendframework/zendframework1": "<1.12.20", "zendframework/zendopenid": ">=2,<2.0.2", "zendframework/zendxml": ">=1,<1.0.1", "zetacomponents/mail": "<1.8.2", "zf-commons/zfc-user": "<1.2.2", "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", - "zfr/zfr-oauth2-server-module": "<0.1.2" + "zfr/zfr-oauth2-server-module": "<0.1.2", + "zoujingli/thinkadmin": "<6.0.22" }, "type": "metapackage", "notification-url": "https://packagist.org/downloads/", @@ -2888,7 +3029,7 @@ "type": "tidelift" } ], - "time": "2021-02-10T03:02:31+00:00" + "time": "2021-09-30T18:03:50+00:00" }, { "name": "sebastian/cli-parser", @@ -3396,16 +3537,16 @@ }, { "name": "sebastian/global-state", - "version": "5.0.2", + "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "a90ccbddffa067b51f574dea6eb25d5680839455" + "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455", - "reference": "a90ccbddffa067b51f574dea6eb25d5680839455", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", "shasum": "" }, "require": { @@ -3448,7 +3589,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" }, "funding": [ { @@ -3456,7 +3597,7 @@ "type": "github" } ], - "time": "2020-10-26T15:55:19+00:00" + "time": "2021-06-11T13:31:12+00:00" }, { "name": "sebastian/lines-of-code", @@ -3747,16 +3888,16 @@ }, { "name": "sebastian/type", - "version": "2.3.1", + "version": "2.3.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2" + "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2", - "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", "shasum": "" }, "require": { @@ -3791,7 +3932,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/2.3.1" + "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" }, "funding": [ { @@ -3799,7 +3940,7 @@ "type": "github" } ], - "time": "2020-10-26T13:18:59+00:00" + "time": "2021-06-15T12:49:02+00:00" }, { "name": "sebastian/version", @@ -3856,27 +3997,29 @@ }, { "name": "symfony/console", - "version": "v5.2.3", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "89d4b176d12a2946a1ae4e34906a025b7b6b135a" + "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/89d4b176d12a2946a1ae4e34906a025b7b6b135a", - "reference": "89d4b176d12a2946a1ae4e34906a025b7b6b135a", + "url": "https://api.github.com/repos/symfony/console/zipball/8b1008344647462ae6ec57559da166c2bfa5e16a", + "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2", "symfony/string": "^5.1" }, "conflict": { + "psr/log": ">=3", "symfony/dependency-injection": "<4.4", "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", @@ -3884,10 +4027,10 @@ "symfony/process": "<4.4" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0" }, "require-dev": { - "psr/log": "~1.0", + "psr/log": "^1|^2", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/event-dispatcher": "^4.4|^5.0", @@ -3933,7 +4076,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.2.3" + "source": "https://github.com/symfony/console/tree/v5.3.7" }, "funding": [ { @@ -3949,20 +4092,20 @@ "type": "tidelift" } ], - "time": "2021-01-28T22:06:19+00:00" + "time": "2021-08-25T20:02:16+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", "shasum": "" }, "require": { @@ -3971,7 +4114,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -4000,7 +4143,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/master" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" }, "funding": [ { @@ -4016,27 +4159,27 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.2.3", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "4f9760f8074978ad82e2ce854dff79a71fe45367" + "reference": "ce7b20d69c66a20939d8952b617506a44d102130" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4f9760f8074978ad82e2ce854dff79a71fe45367", - "reference": "4f9760f8074978ad82e2ce854dff79a71fe45367", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ce7b20d69c66a20939d8952b617506a44d102130", + "reference": "ce7b20d69c66a20939d8952b617506a44d102130", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "symfony/dependency-injection": "<4.4" @@ -4046,7 +4189,7 @@ "symfony/event-dispatcher-implementation": "2.0" }, "require-dev": { - "psr/log": "~1.0", + "psr/log": "^1|^2|^3", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/error-handler": "^4.4|^5.0", @@ -4085,7 +4228,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.7" }, "funding": [ { @@ -4101,20 +4244,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:36:42+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2" + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ba7d54483095a198fa51781bc608d17e84dffa2", - "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11", + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11", "shasum": "" }, "require": { @@ -4127,7 +4270,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -4164,7 +4307,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.2.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" }, "funding": [ { @@ -4180,25 +4323,26 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/filesystem", - "version": "v5.2.3", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "262d033b57c73e8b59cd6e68a45c528318b15038" + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/262d033b57c73e8b59cd6e68a45c528318b15038", - "reference": "262d033b57c73e8b59cd6e68a45c528318b15038", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -4226,7 +4370,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.2.3" + "source": "https://github.com/symfony/filesystem/tree/v5.3.4" }, "funding": [ { @@ -4242,24 +4386,25 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:01:46+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/finder", - "version": "v5.2.3", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "4adc8d172d602008c204c2e16956f99257248e03" + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/4adc8d172d602008c204c2e16956f99257248e03", - "reference": "4adc8d172d602008c204c2e16956f99257248e03", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -4287,7 +4432,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.2.3" + "source": "https://github.com/symfony/finder/tree/v5.3.7" }, "funding": [ { @@ -4303,27 +4448,27 @@ "type": "tidelift" } ], - "time": "2021-01-28T22:06:19+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/options-resolver", - "version": "v5.2.3", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce" + "reference": "4b78e55b179003a42523a362cc0e8327f7a69b5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", - "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4b78e55b179003a42523a362cc0e8327f7a69b5e", + "reference": "4b78e55b179003a42523a362cc0e8327f7a69b5e", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -4356,7 +4501,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.2.3" + "source": "https://github.com/symfony/options-resolver/tree/v5.3.7" }, "funding": [ { @@ -4372,20 +4517,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T12:56:27+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.22.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", "shasum": "" }, "require": { @@ -4397,7 +4542,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4435,7 +4580,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" }, "funding": [ { @@ -4451,20 +4596,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.22.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "267a9adeb8ecb8071040a740930e077cdfb987af" + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/267a9adeb8ecb8071040a740930e077cdfb987af", - "reference": "267a9adeb8ecb8071040a740930e077cdfb987af", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", "shasum": "" }, "require": { @@ -4476,7 +4621,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4516,7 +4661,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" }, "funding": [ { @@ -4532,20 +4677,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.22.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "6e971c891537eb617a00bb07a43d182a6915faba" + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/6e971c891537eb617a00bb07a43d182a6915faba", - "reference": "6e971c891537eb617a00bb07a43d182a6915faba", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { @@ -4557,7 +4702,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4600,7 +4745,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" }, "funding": [ { @@ -4616,20 +4761,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T17:09:11+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.22.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "f377a3dd1fde44d37b9831d68dc8dea3ffd28e13" + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f377a3dd1fde44d37b9831d68dc8dea3ffd28e13", - "reference": "f377a3dd1fde44d37b9831d68dc8dea3ffd28e13", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", "shasum": "" }, "require": { @@ -4641,7 +4786,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4680,7 +4825,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" }, "funding": [ { @@ -4696,7 +4841,7 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-php70", @@ -4768,16 +4913,16 @@ }, { "name": "symfony/polyfill-php72", - "version": "v1.22.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9" + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", - "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", "shasum": "" }, "require": { @@ -4786,7 +4931,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4824,7 +4969,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" }, "funding": [ { @@ -4840,20 +4985,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-05-27T09:17:38+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.22.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { @@ -4862,7 +5007,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4903,7 +5048,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" }, "funding": [ { @@ -4919,20 +5064,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.22.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", "shasum": "" }, "require": { @@ -4941,7 +5086,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4986,7 +5131,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" }, "funding": [ { @@ -5002,25 +5147,25 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-07-28T13:41:28+00:00" }, { "name": "symfony/process", - "version": "v5.2.3", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "313a38f09c77fbcdc1d223e57d368cea76a2fd2f" + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/313a38f09c77fbcdc1d223e57d368cea76a2fd2f", - "reference": "313a38f09c77fbcdc1d223e57d368cea76a2fd2f", + "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967", + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -5048,7 +5193,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.2.3" + "source": "https://github.com/symfony/process/tree/v5.3.7" }, "funding": [ { @@ -5064,25 +5209,25 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:15:41+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.0" + "psr/container": "^1.1" }, "suggest": { "symfony/service-implementation": "" @@ -5090,7 +5235,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5127,7 +5272,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/master" + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" }, "funding": [ { @@ -5143,20 +5288,20 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-04-01T10:43:52+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.2.3", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "b12274acfab9d9850c52583d136a24398cdf1a0c" + "reference": "b24c6a92c6db316fee69e38c80591e080e41536c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b12274acfab9d9850c52583d136a24398cdf1a0c", - "reference": "b12274acfab9d9850c52583d136a24398cdf1a0c", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b24c6a92c6db316fee69e38c80591e080e41536c", + "reference": "b24c6a92c6db316fee69e38c80591e080e41536c", "shasum": "" }, "require": { @@ -5189,7 +5334,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.2.3" + "source": "https://github.com/symfony/stopwatch/tree/v5.3.4" }, "funding": [ { @@ -5205,20 +5350,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:15:41+00:00" + "time": "2021-07-10T08:58:57+00:00" }, { "name": "symfony/string", - "version": "v5.2.3", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "c95468897f408dd0aca2ff582074423dd0455122" + "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/c95468897f408dd0aca2ff582074423dd0455122", - "reference": "c95468897f408dd0aca2ff582074423dd0455122", + "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5", + "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5", "shasum": "" }, "require": { @@ -5272,7 +5417,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.2.3" + "source": "https://github.com/symfony/string/tree/v5.3.7" }, "funding": [ { @@ -5288,20 +5433,20 @@ "type": "tidelift" } ], - "time": "2021-01-25T15:14:59+00:00" + "time": "2021-08-26T08:00:08+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", "shasum": "" }, "require": { @@ -5330,7 +5475,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/master" + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" }, "funding": [ { @@ -5338,29 +5483,30 @@ "type": "github" } ], - "time": "2020-07-12T23:59:07+00:00" + "time": "2021-07-28T10:34:58+00:00" }, { "name": "vimeo/psalm", - "version": "4.5.1", + "version": "4.10.0", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "257a1ca672a79dedc852be1285a7b97154646418" + "reference": "916b098b008f6de4543892b1e0651c1c3b92cbfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/257a1ca672a79dedc852be1285a7b97154646418", - "reference": "257a1ca672a79dedc852be1285a7b97154646418", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/916b098b008f6de4543892b1e0651c1c3b92cbfa", + "reference": "916b098b008f6de4543892b1e0651c1c3b92cbfa", "shasum": "" }, "require": { - "amphp/amp": "^2.1", + "amphp/amp": "^2.4.2", "amphp/byte-stream": "^1.5", "composer/package-versions-deprecated": "^1.8.0", "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^1.1", + "composer/xdebug-handler": "^1.1 || ^2.0", "dnoegel/php-xdg-base-dir": "^0.1.1", + "ext-ctype": "*", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -5368,9 +5514,9 @@ "ext-simplexml": "*", "ext-tokenizer": "*", "felixfbecker/advanced-json-rpc": "^3.0.3", - "felixfbecker/language-server-protocol": "^1.4", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0", - "nikic/php-parser": "^4.10.1", + "felixfbecker/language-server-protocol": "^1.5", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^4.12", "openlss/lib-array2xml": "^1.0", "php": "^7.1|^8", "sebastian/diff": "^3.0 || ^4.0", @@ -5381,18 +5527,18 @@ "psalm/psalm": "self.version" }, "require-dev": { - "amphp/amp": "^2.4.2", "bamarni/composer-bin-plugin": "^1.2", "brianium/paratest": "^4.0||^6.0", "ext-curl": "*", + "php-parallel-lint/php-parallel-lint": "^1.2", "phpdocumentor/reflection-docblock": "^5", "phpmyadmin/sql-parser": "5.1.0||dev-master", "phpspec/prophecy": ">=1.9.0", "phpunit/phpunit": "^9.0", - "psalm/plugin-phpunit": "^0.13", - "slevomat/coding-standard": "^6.3.11", + "psalm/plugin-phpunit": "^0.16", + "slevomat/coding-standard": "^7.0", "squizlabs/php_codesniffer": "^3.5", - "symfony/process": "^4.3", + "symfony/process": "^4.3 || ^5.0", "weirdan/prophecy-shim": "^1.0 || ^2.0" }, "suggest": { @@ -5440,36 +5586,41 @@ ], "support": { "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/4.5.1" + "source": "https://github.com/vimeo/psalm/tree/4.10.0" }, - "time": "2021-02-11T19:12:25+00:00" + "time": "2021-09-04T21:00:09+00:00" }, { "name": "webmozart/assert", - "version": "1.9.1", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", + "php": "^7.2 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" + "vimeo/psalm": "<4.6.1 || 4.6.2" }, "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" + "phpunit/phpunit": "^8.5.13" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" @@ -5493,9 +5644,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.9.1" + "source": "https://github.com/webmozarts/assert/tree/1.10.0" }, - "time": "2020-07-08T17:02:28+00:00" + "time": "2021-03-09T10:59:23+00:00" }, { "name": "webmozart/path-util", @@ -5560,6 +5711,8 @@ "platform": { "php": "^7.4 || ^8.0" }, - "platform-dev": [], + "platform-dev": { + "ext-json": "*" + }, "plugin-api-version": "2.0.0" } diff --git a/src/ExceptionFactory.php b/src/ExceptionFactory.php new file mode 100644 index 0000000..36cff50 --- /dev/null +++ b/src/ExceptionFactory.php @@ -0,0 +1,116 @@ +classInfoList = $classInfoList; + $this->typed = $typed; + $this->classNameFilter = $classNameFilter; + $this->propertyNameFilter = $propertyNameFilter; + $this->methodNameFilter = $methodNameFilter; + } + + /** + * @param TypeDefinition $typeDefinition + * @param string $valueObjectFqcn FQCN of the value object (needed for determine exception class namespace and namespace imports) + * @return ClassBuilder + */ + public function classBuilder( + TypeDefinition $typeDefinition, + string $valueObjectFqcn + ): ClassBuilder { + $classInfo = $this->classInfoList->classInfoForNamespace($valueObjectFqcn); + $namespace = $classInfo->getClassNamespace($valueObjectFqcn) . '\\Exception'; + + switch (true) { + case $typeDefinition instanceof StringType: + if ($typeDefinition->enum() !== null) { + return $this->exceptionClassForEnum($typeDefinition, $namespace) + ->addNamespaceImport($valueObjectFqcn); + } + // no break + default: + throw new \RuntimeException(\sprintf('Type "%s" not supported', \get_class($typeDefinition))); + } + } + + private function exceptionClassForEnum( + TypeDefinition $typeDefinition, + string $namespace + ): ClassBuilder { + $name = $typeDefinition->name() ?: 'text'; + + $argumentName = ($this->propertyNameFilter)($name); + $className = ($this->classNameFilter)($name); + + $body = <<methodNameFilter)('for_' . $name), $this->typed) + ->setStatic(true) + ->setParameters(ParameterBuilder::fromScratch($argumentName, 'string')) + ->setReturnType('self') + ->setBody($body); + + $classBuilder = ClassBuilder::fromScratch('Invalid' . ($this->classNameFilter)($name), $namespace) + ->setFinal(true) + ->setExtends('InvalidArgumentException'); + $classBuilder->addNamespaceImport( + 'Fig\Http\Message\StatusCodeInterface', + 'InvalidArgumentException' + ); + + $classBuilder->addMethod($invalidMethodFor); + + return $classBuilder; + } +} diff --git a/src/ValueObject/ArrayFactory.php b/src/ValueObject/ArrayFactory.php index fde154d..65d7543 100644 --- a/src/ValueObject/ArrayFactory.php +++ b/src/ValueObject/ArrayFactory.php @@ -17,8 +17,14 @@ use OpenCodeModeling\CodeAst\Code\ParameterGenerator; use OpenCodeModeling\CodeAst\NodeVisitor\ClassMethod; use OpenCodeModeling\JsonSchemaToPhp\Type\ArrayType; +use OpenCodeModeling\JsonSchemaToPhp\Type\BooleanType; +use OpenCodeModeling\JsonSchemaToPhp\Type\IntegerType; +use OpenCodeModeling\JsonSchemaToPhp\Type\NumberType; +use OpenCodeModeling\JsonSchemaToPhp\Type\ObjectType; use OpenCodeModeling\JsonSchemaToPhp\Type\ReferenceType; use OpenCodeModeling\JsonSchemaToPhp\Type\ScalarType; +use OpenCodeModeling\JsonSchemaToPhp\Type\StringType; +use OpenCodeModeling\JsonSchemaToPhp\Type\TypeDefinition; use OpenCodeModeling\JsonSchemaToPhp\Type\TypeSet; use OpenCodeModeling\JsonSchemaToPhpAst\Common\IteratorFactory; use PhpParser\NodeVisitor; @@ -199,7 +205,7 @@ public function classBuilder(ArrayType $typeDefinition): ClassBuilder return $this->classBuilderFromNative($name, ...$typeDefinition->items()); } - private function determineTypeName(string $name, TypeSet ...$typeSets): ?string + private function determineType(string $name, TypeSet ...$typeSets): ?TypeDefinition { if (\count($typeSets) !== 1) { throw new \RuntimeException('Can only handle one JSON type'); @@ -217,7 +223,7 @@ private function determineTypeName(string $name, TypeSet ...$typeSets): ?string $resolvedTypeSet = $type->resolvedType(); if ($resolvedTypeSet === null) { - return $type->extractNameFromReference(); + return $type; } if (\count($resolvedTypeSet) !== 1) { throw new \RuntimeException('Can only handle one JSON type'); @@ -232,7 +238,25 @@ private function determineTypeName(string $name, TypeSet ...$typeSets): ?string ); } - return $type->name(); + return $type; + } + + private function determineTypeMethod(TypeDefinition $type): string + { + switch (true) { + case $type instanceof ArrayType: + case $type instanceof ObjectType: + return 'Array'; + case $type instanceof BooleanType: + return 'Bool'; + case $type instanceof IntegerType: + return 'Int'; + case $type instanceof NumberType: + return 'Float'; + case $type instanceof StringType: + default: + return 'String'; + } } /** @@ -242,14 +266,24 @@ private function determineTypeName(string $name, TypeSet ...$typeSets): ?string */ public function nodeVisitorsFromNative(string $name, TypeSet ...$typeSets): array { - $typeName = $this->determineTypeName($name, ...$typeSets); + $type = $this->determineType($name, ...$typeSets); + + if ($type === null) { + throw new \RuntimeException('Could not determine JSON schema type'); + } + $typeName = $type->name(); + + if ($type instanceof ReferenceType) { + $typeName = $type->extractNameFromReference(); + } + $typeMethod = $this->determineTypeMethod($type); $nodeVisitors = $this->iteratorFactory->nodeVisitorsFromNative( ($this->propertyNameFilter)($name), ($this->classNameFilter)($typeName) ); - $nodeVisitors[] = new ClassMethod($this->methodFromArray($name, $typeName)); + $nodeVisitors[] = new ClassMethod($this->methodFromArray($name, $typeName, 'from' . $typeMethod, \lcfirst($typeMethod))); $nodeVisitors[] = new ClassMethod($this->methodFromItems($name, $typeName)); $nodeVisitors[] = new ClassMethod($this->methodEmptyList()); $nodeVisitors[] = new ClassMethod($this->methodMagicConstruct($name, $name, $typeName)); @@ -260,7 +294,7 @@ public function nodeVisitorsFromNative(string $name, TypeSet ...$typeSets): arra $nodeVisitors[] = new ClassMethod($this->methodContains($name, $typeName)); $nodeVisitors[] = new ClassMethod($this->methodFilter($name)); $nodeVisitors[] = new ClassMethod($this->methodItems($name, $typeName)); - $nodeVisitors[] = new ClassMethod($this->methodToArray($name, $typeName)); + $nodeVisitors[] = new ClassMethod($this->methodToArray($name, $typeName, 'to' . $typeMethod)); $nodeVisitors[] = new ClassMethod($this->methodEquals()); return $nodeVisitors; @@ -268,15 +302,24 @@ public function nodeVisitorsFromNative(string $name, TypeSet ...$typeSets): arra public function classBuilderFromNative(string $name, TypeSet ...$typeSets): ClassBuilder { - $typeName = $this->determineTypeName($name, ...$typeSets); + $type = $this->determineType($name, ...$typeSets); + + if ($type === null) { + throw new \RuntimeException('Could not determine JSON schema type'); + } + $typeName = $type->name(); + + if ($type instanceof ReferenceType) { + $typeName = $type->extractNameFromReference(); + } + $typeMethod = $this->determineTypeMethod($type); $classBuilder = $this->iteratorFactory->classBuilderFromNative( ($this->propertyNameFilter)($name), ($this->classNameFilter)($typeName) ); $classBuilder->addMethod( - ClassMethodBuilder::fromNode($this->methodFromArray($name, $typeName)->generate()), - ClassMethodBuilder::fromNode($this->methodFromArray($name, $typeName)->generate()), + ClassMethodBuilder::fromNode($this->methodFromArray($name, $typeName, 'from' . $typeMethod, \lcfirst($typeMethod))->generate()), ClassMethodBuilder::fromNode($this->methodFromItems($name, $typeName)->generate()), ClassMethodBuilder::fromNode($this->methodEmptyList()->generate()), ClassMethodBuilder::fromNode($this->methodMagicConstruct($name, $name, $typeName)->generate()), @@ -287,7 +330,7 @@ public function classBuilderFromNative(string $name, TypeSet ...$typeSets): Clas ClassMethodBuilder::fromNode($this->methodContains($name, $typeName)->generate()), ClassMethodBuilder::fromNode($this->methodFilter($name)->generate()), ClassMethodBuilder::fromNode($this->methodItems($name, $typeName)->generate()), - ClassMethodBuilder::fromNode($this->methodToArray($name, $typeName)->generate()), + ClassMethodBuilder::fromNode($this->methodToArray($name, $typeName, 'to' . $typeMethod)->generate()), ClassMethodBuilder::fromNode($this->methodEquals()->generate()), ); @@ -519,11 +562,12 @@ public function methodItems( public function methodToArray( string $propertyName, - string $argumentType + string $argumentType, + string $typeMethod = 'toString' ): MethodGenerator { $body = <<<'PHP' return \array_map(static function (%s $%s) { - return $%s->toString(); + return $%s->%s(); }, $this->%s); PHP; @@ -535,7 +579,7 @@ public function methodToArray( 'toArray', [], MethodGenerator::FLAG_PUBLIC, - new BodyGenerator($this->parser, \sprintf($body, $argumentType, $argumentTypeVarName, $argumentTypeVarName, $propertyName)) + new BodyGenerator($this->parser, \sprintf($body, $argumentType, $argumentTypeVarName, $argumentTypeVarName, $typeMethod, $propertyName)) ); $method->setTyped($this->typed); $method->setReturnType('array'); @@ -545,11 +589,13 @@ public function methodToArray( public function methodFromArray( string $argumentName, - string $typeName + string $typeName, + string $typeMethod = 'fromString', + string $type = 'string' ): MethodGenerator { $body = <<<'PHP' - return new self(...array_map(static function (string $item) { - return %s::fromString($item); + return new self(...array_map(static function (%s $item) { + return %s::%s($item); }, $%s)); PHP; $argumentName = ($this->propertyNameFilter)($argumentName); @@ -561,7 +607,7 @@ public function methodFromArray( new ParameterGenerator($argumentName, 'array'), ], MethodGenerator::FLAG_PUBLIC | MethodGenerator::FLAG_STATIC, - new BodyGenerator($this->parser, \sprintf($body, $typeName, $argumentName)) + new BodyGenerator($this->parser, \sprintf($body, $type, $typeName, $typeMethod, $argumentName)) ); $method->setTyped($this->typed); $method->setReturnType('self'); diff --git a/src/ValueObject/Bcp47Factory.php b/src/ValueObject/Bcp47Factory.php index 07a96fd..454e360 100644 --- a/src/ValueObject/Bcp47Factory.php +++ b/src/ValueObject/Bcp47Factory.php @@ -170,11 +170,12 @@ public function methodEquals(string $propertyName, string $argumentName = 'other $method = new MethodGenerator( 'equals', [ - new ParameterGenerator($argumentName), + (new ParameterGenerator($argumentName))->setTypeDocBlockHint('mixed'), ], MethodGenerator::FLAG_PUBLIC, new BodyGenerator($this->parser, $body) ); + $method->setDocBlockComment(''); $method->setTyped($this->typed); $method->setReturnType('bool'); diff --git a/src/ValueObject/BooleanFactory.php b/src/ValueObject/BooleanFactory.php index 4d9fd3d..ccf2393 100644 --- a/src/ValueObject/BooleanFactory.php +++ b/src/ValueObject/BooleanFactory.php @@ -188,11 +188,12 @@ public function methodEquals(string $propertyName, string $argumentName = 'other $method = new MethodGenerator( 'equals', [ - new ParameterGenerator($argumentName), + (new ParameterGenerator($argumentName))->setTypeDocBlockHint('mixed'), ], MethodGenerator::FLAG_PUBLIC, new BodyGenerator($this->parser, $body) ); + $method->setDocBlockComment(''); $method->setTyped($this->typed); $method->setReturnType('bool'); diff --git a/src/ValueObject/EnumFactory.php b/src/ValueObject/EnumFactory.php index ba1d6ec..e04eb75 100644 --- a/src/ValueObject/EnumFactory.php +++ b/src/ValueObject/EnumFactory.php @@ -360,7 +360,7 @@ public function methodEquals(string $propertyName, string $argumentName = 'other return \$this->$propertyName === \$$argumentName->$propertyName; PHP; - $parameter = new ParameterGenerator($argumentName); + $parameter = (new ParameterGenerator($argumentName))->setTypeDocBlockHint('mixed'); $method = new MethodGenerator( 'equals', @@ -370,6 +370,7 @@ public function methodEquals(string $propertyName, string $argumentName = 'other MethodGenerator::FLAG_PUBLIC, new BodyGenerator($this->parser, $body) ); + $method->setDocBlockComment(''); $method->setTyped($this->typed); $method->setReturnType('bool'); @@ -420,7 +421,7 @@ public function methodIsOneOf(string $argumentName, ?string $className): MethodG } return false; PHP; - $parameter = (new ParameterGenerator($argumentName))->setVariadic(true); + $parameter = (new ParameterGenerator($argumentName))->setVariadic(true)->setTypeDocBlockHint('mixed'); if ($className !== null) { $parameter->setType($className); @@ -434,6 +435,7 @@ public function methodIsOneOf(string $argumentName, ?string $className): MethodG MethodGenerator::FLAG_PUBLIC, new BodyGenerator($this->parser, $body) ); + $method->setDocBlockComment(''); $method->setTyped($this->typed); $method->setReturnType('bool'); diff --git a/src/ValueObject/IntegerFactory.php b/src/ValueObject/IntegerFactory.php index 77b6f44..35f4297 100644 --- a/src/ValueObject/IntegerFactory.php +++ b/src/ValueObject/IntegerFactory.php @@ -188,11 +188,12 @@ public function methodEquals(string $propertyName, string $argumentName = 'other $method = new MethodGenerator( 'equals', [ - new ParameterGenerator($argumentName), + (new ParameterGenerator($argumentName))->setTypeDocBlockHint('mixed'), ], MethodGenerator::FLAG_PUBLIC, new BodyGenerator($this->parser, $body) ); + $method->setDocBlockComment(''); $method->setTyped($this->typed); $method->setReturnType('bool'); diff --git a/src/ValueObject/NumberFactory.php b/src/ValueObject/NumberFactory.php index c7c7c18..c7a7e21 100644 --- a/src/ValueObject/NumberFactory.php +++ b/src/ValueObject/NumberFactory.php @@ -188,11 +188,12 @@ public function methodEquals(string $propertyName, string $argumentName = 'other $method = new MethodGenerator( 'equals', [ - new ParameterGenerator($argumentName), + (new ParameterGenerator($argumentName))->setTypeDocBlockHint('mixed'), ], MethodGenerator::FLAG_PUBLIC, new BodyGenerator($this->parser, $body) ); + $method->setDocBlockComment(''); $method->setTyped($this->typed); $method->setReturnType('bool'); diff --git a/src/ValueObject/StringFactory.php b/src/ValueObject/StringFactory.php index c66dd98..aa38c76 100644 --- a/src/ValueObject/StringFactory.php +++ b/src/ValueObject/StringFactory.php @@ -188,11 +188,12 @@ public function methodEquals(string $propertyName, string $argumentName = 'other $method = new MethodGenerator( 'equals', [ - new ParameterGenerator($argumentName), + (new ParameterGenerator($argumentName))->setTypeDocBlockHint('mixed'), ], MethodGenerator::FLAG_PUBLIC, new BodyGenerator($this->parser, $body) ); + $method->setDocBlockComment(''); $method->setTyped($this->typed); $method->setReturnType('bool'); diff --git a/src/ValueObject/UuidFactory.php b/src/ValueObject/UuidFactory.php index a10f182..90852bb 100644 --- a/src/ValueObject/UuidFactory.php +++ b/src/ValueObject/UuidFactory.php @@ -181,22 +181,23 @@ public function methodEquals(string $propertyName, string $argumentName = 'other $propertyName = ($this->propertyNameFilter)($propertyName); $argumentName = ($this->propertyNameFilter)($argumentName); - $body = <<$propertyName === \$$argumentName->$propertyName; + return $this->%s->toString() === $%s->%s->toString(); PHP; $method = new MethodGenerator( 'equals', [ - new ParameterGenerator($argumentName), + (new ParameterGenerator($argumentName))->setTypeDocBlockHint('mixed'), ], MethodGenerator::FLAG_PUBLIC, - new BodyGenerator($this->parser, $body) + new BodyGenerator($this->parser, \sprintf($body, $argumentName, $propertyName, $argumentName, $propertyName)) ); + $method->setDocBlockComment(''); $method->setTyped($this->typed); $method->setReturnType('bool'); diff --git a/src/ValueObjectFactory.php b/src/ValueObjectFactory.php index 8bff310..1357b94 100644 --- a/src/ValueObjectFactory.php +++ b/src/ValueObjectFactory.php @@ -12,8 +12,8 @@ use OpenCodeModeling\CodeAst\Builder\ClassBuilder; use OpenCodeModeling\CodeAst\Builder\ClassPropertyBuilder; -use OpenCodeModeling\CodeAst\Builder\File; use OpenCodeModeling\CodeAst\Builder\FileCollection; +use OpenCodeModeling\CodeAst\Builder\PhpFile; use OpenCodeModeling\CodeAst\Code\ClassConstGenerator; use OpenCodeModeling\CodeAst\FileCodeGenerator; use OpenCodeModeling\CodeAst\Package\ClassInfo; @@ -56,6 +56,7 @@ final class ValueObjectFactory private ClassInfoList $classInfoList; private FileCodeGenerator $fileCodeGenerator; + private ExceptionFactory $exceptionFactory; /** * @var callable @@ -132,16 +133,23 @@ public function __construct( $this->constValueFilter = $constValueFilter; $this->fileCodeGenerator = new FileCodeGenerator($parser, $printer, $classInfoList); + $this->exceptionFactory = new ExceptionFactory( + $this->classInfoList, + $typed, + $this->classNameFilter, + $this->propertyNameFilter, + $this->methodNameFilter, + ); $this->isValueObject = static function (ClassBuilder $classBuilder): bool { return $classBuilder->hasMethod('fromItems') - || $classBuilder->hasMethod('toString') - || $classBuilder->hasMethod('toInt') - || $classBuilder->hasMethod('toFloat') - || $classBuilder->hasMethod('toBool'); + || $classBuilder->hasMethod('toString') + || $classBuilder->hasMethod('toInt') + || $classBuilder->hasMethod('toFloat') + || $classBuilder->hasMethod('toBool'); }; - $this->currentFileAst = static function (File $classBuilder, ClassInfo $classInfo) use ($parser): array { + $this->currentFileAst = static function (PhpFile $classBuilder, ClassInfo $classInfo) use ($parser): array { $path = $classInfo->getPath($classBuilder->getNamespace() . '\\' . $classBuilder->getName()); $filename = $classInfo->getFilenameFromPathAndName($path, $classBuilder->getName()); @@ -183,7 +191,7 @@ public function nodeVisitors(TypeDefinition $typeDefinition): array default: return $this->stringFactory->nodeVisitors($typeDefinition); } - // no break + // no break case $typeDefinition instanceof IntegerType: return $this->integerFactory->nodeVisitors($typeDefinition); case $typeDefinition instanceof BooleanType: @@ -235,6 +243,7 @@ public function classBuilder(TypeDefinition $typeDefinition): ClassBuilder * @param TypeSet $typeSet * @param string $srcFolder Source folder for namespace imports * @param string|null $className Class name is used from $classBuilder if not set + * @param string|null $rootSrcFolder Source folder for namespace imports with root e.g. /Building * @return void */ public function generateClasses( @@ -242,13 +251,21 @@ public function generateClasses( FileCollection $fileCollection, TypeSet $typeSet, string $srcFolder, - string $className = null + string $className = null, + string $rootSrcFolder = null ): void { $type = $typeSet->first(); + if ($rootSrcFolder === null) { + $rootSrcFolder = $srcFolder; + } + $classInfo = $this->classInfoList->classInfoForPath($srcFolder); $classNamespacePath = $classInfo->getClassNamespaceFromPath($srcFolder); + $rootClassInfo = $this->classInfoList->classInfoForPath($rootSrcFolder); + $rootClassNamespacePath = $rootClassInfo->getClassNamespaceFromPath($rootSrcFolder); + if ($type instanceof ReferenceType && $refType = $type->resolvedType() ) { @@ -263,7 +280,7 @@ public function generateClasses( $propertyType = $propertyTypeSet->first(); $propertyClassName = ($this->classNameFilter)($propertyName); - $propertyClassNamespace = $this->extractNamespace($classNamespacePath, $propertyType); + $propertyClassNamespace = $this->extractNamespace($classNamespacePath, $rootClassNamespacePath, $propertyType); $propertyPropertyName = ($this->propertyNameFilter)($propertyName); switch (true) { @@ -276,13 +293,15 @@ public function generateClasses( } $itemClassName = ($this->classNameFilter)($itemType->name()); $itemPropertyName = ($this->propertyNameFilter)($itemType->name()); + $itemClassNamespace = $this->extractNamespace($classNamespacePath, $rootClassNamespacePath, $itemType); $this->generateClasses( - ClassBuilder::fromScratch($itemClassName, $classNamespacePath)->setFinal(true), + ClassBuilder::fromScratch($itemClassName, $itemClassNamespace)->setFinal(true), $fileCollection, $itemTypeSet, $srcFolder, - $itemPropertyName + $itemPropertyName, + $rootSrcFolder ); } // no break @@ -292,14 +311,12 @@ public function generateClasses( $fileCollection, $propertyTypeSet, $srcFolder, - $propertyClassName + $propertyClassName, + $rootSrcFolder ); $this->addNamespaceImport($classBuilder, $propertyClassNamespace . '\\' . $propertyClassName); $classBuilder->addProperty( - ClassPropertyBuilder::fromScratch( - $propertyPropertyName, - $this->determinePropertyType($propertyType, $propertyClassName) - ) + $this->determineProperty($propertyPropertyName, $propertyClassName, $propertyType) ); break; case $propertyType instanceof ReferenceType: @@ -308,37 +325,41 @@ public function generateClasses( if ($propertyRefTypeSet = $propertyType->resolvedType()) { $propertyRefType = $propertyRefTypeSet->first(); $propertyRefClassName = ($this->classNameFilter)($propertyRefType->name()); - $propertyRefClassNamespace = $this->extractNamespace($classNamespacePath, $propertyRefType); + $propertyRefClassNamespace = $this->extractNamespace($classNamespacePath, $rootClassNamespacePath, $propertyRefType); $this->generateClasses( ClassBuilder::fromScratch($propertyRefClassName, $propertyRefClassNamespace)->setFinal(true), $fileCollection, $propertyRefTypeSet, $srcFolder, - $propertyType->name() + $propertyType->name(), + $rootSrcFolder ); $propertyClassName = $propertyRefClassName; $propertyType = $propertyRefType; } $classBuilder->addProperty( - ClassPropertyBuilder::fromScratch( - $propertyPropertyName, - $this->determinePropertyType($propertyType, $propertyClassName) - ) + $this->determineProperty($propertyPropertyName, $propertyClassName, $propertyType) ); $this->addNamespaceImport($classBuilder, $propertyClassNamespace . '\\' . $propertyClassName); break; case $propertyType instanceof ScalarType: - $fileCollection->add( - $this->generateValueObject($propertyClassName, $propertyClassNamespace, $propertyType) - ); + $valueObjectClassBuilder = $this->generateValueObject($propertyClassName, $propertyClassNamespace, $propertyType); + $fileCollection->add($valueObjectClassBuilder); + $this->addNamespaceImport($classBuilder, $propertyClassNamespace . '\\' . $propertyClassName); $classBuilder->addProperty( - ClassPropertyBuilder::fromScratch( - $propertyPropertyName, - $this->determinePropertyType($propertyType, $propertyClassName) - ) + $this->determineProperty($propertyPropertyName, $propertyClassName, $propertyType) ); + + if ($propertyType instanceof StringType && $propertyType->enum() !== null) { + $enumExceptionClassBuilder = $this->exceptionFactory->classBuilder( + $propertyType, + $propertyClassNamespace . '\\' . $propertyClassName + ); + $fileCollection->add($enumExceptionClassBuilder); + $valueObjectClassBuilder->addNamespaceImport($enumExceptionClassBuilder->getFqcn()); + } break; default: break; @@ -347,21 +368,27 @@ public function generateClasses( $fileCollection->add($classBuilder); break; case $type instanceof ScalarType: - $fileCollection->add( - $this->generateValueObject( - ($this->classNameFilter)($className), - $this->extractNamespace($classNamespacePath, $type), - $type - ) - ); + $namespace = $this->extractNamespace($classNamespacePath, $rootClassNamespacePath, $type); + $valueObjectClassBuilder = $this->generateValueObject(($this->classNameFilter)($className), $namespace, $type); + + $fileCollection->add($valueObjectClassBuilder); + + if ($type instanceof StringType && $type->enum() !== null) { + $enumExceptionClassBuilder = $this->exceptionFactory->classBuilder( + $type, + $namespace . '\\' . ($this->classNameFilter)($className) + ); + $fileCollection->add($enumExceptionClassBuilder); + $valueObjectClassBuilder->addNamespaceImport($enumExceptionClassBuilder->getFqcn()); + } break; case $type instanceof ArrayType: $arrayClassBuilder = $this->generateValueObject( ($this->classNameFilter)($className), - $this->extractNamespace($classNamespacePath, $type), + $this->extractNamespace($classNamespacePath, $rootClassNamespacePath, $type), $type ); - $this->addNamespaceImportForType($arrayClassBuilder, $classNamespacePath, $type); + $this->addNamespaceImportForType($arrayClassBuilder, $classNamespacePath, $rootClassNamespacePath, $type); $fileCollection->add($arrayClassBuilder); break; default: @@ -369,8 +396,11 @@ public function generateClasses( } } - private function extractNamespace(string $classNamespacePath, TypeDefinition $typeDefinition): string - { + private function extractNamespace( + string $classNamespacePath, + string $rootClassNamespacePath, + TypeDefinition $typeDefinition + ): string { if (! $typeDefinition instanceof CustomSupport) { return $classNamespacePath; } @@ -380,7 +410,13 @@ private function extractNamespace(string $classNamespacePath, TypeDefinition $ty $namespace = $typeDefinition->custom()['ns'] ?? ''; } - return \trim($classNamespacePath . '\\' . $namespace, '\\'); + $namespace = \str_replace('/', '\\', $namespace); + + return \trim( + (\strpos($namespace, '\\') === 0 + ? $rootClassNamespacePath + : $classNamespacePath) + . '\\' . \trim($namespace, '\\'), '\\'); } /** @@ -450,7 +486,7 @@ private function addNamespaceImport(ClassBuilder $classBuilder, string $namespac } } - private function addNamespaceImportForType(ClassBuilder $classBuilder, string $classNamespacePath, TypeDefinition $typeDefinition): void + private function addNamespaceImportForType(ClassBuilder $classBuilder, string $classNamespacePath, string $rootClassNamespacePath, TypeDefinition $typeDefinition): void { switch (true) { case $typeDefinition instanceof ArrayType: @@ -471,7 +507,7 @@ private function addNamespaceImportForType(ClassBuilder $classBuilder, string $c $itemName = $refType->name(); } } - $namespace = $this->extractNamespace($classNamespacePath, $itemType); + $namespace = $this->extractNamespace($classNamespacePath, $rootClassNamespacePath, $itemType); if ($namespace === $classBuilder->getNamespace()) { continue; @@ -492,4 +528,20 @@ private function determinePropertyType(TypeDefinition $typeDefinition, string $c ? ('?' . $className) : $className; } + + private function determineProperty( + $propertyName, + $propertyClassName, + TypeDefinition $typeDefinition + ): ClassPropertyBuilder { + $property = ClassPropertyBuilder::fromScratch( + $propertyName, + $this->determinePropertyType($typeDefinition, $propertyClassName) + ); + if ($typeDefinition->isRequired() === false || $typeDefinition->isNullable() === true) { + $property->setDefaultValue(null); + } + + return $property; + } } diff --git a/tests/ExceptionFactoryTest.php b/tests/ExceptionFactoryTest.php new file mode 100644 index 0000000..15437f3 --- /dev/null +++ b/tests/ExceptionFactoryTest.php @@ -0,0 +1,114 @@ +parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7); + $this->printer = new Standard(['shortArraySyntax' => true]); + + $this->classInfoList = new ClassInfoList( + new Psr4Info( + 'tmp/', + 'Acme', + FilterFactory::directoryToNamespaceFilter(), + FilterFactory::namespaceToDirectoryFilter(), + ) + ); + + $classNameFilter = FilterFactory::classNameFilter(); + $propertyNameFilter = FilterFactory::propertyNameFilter(); + $methodNameFilter = FilterFactory::methodNameFilter(); + + $this->fileCodeGenerator = new FileCodeGenerator( + $this->parser, + $this->printer, + $this->classInfoList + ); + + $this->exceptionFactory = new ExceptionFactory( + $this->classInfoList, + true, + $classNameFilter, + $propertyNameFilter, + $methodNameFilter + ); + } + + /** + * @test + */ + public function it_generates_exception_class_for_enums(): void + { + $typeSet = Type::fromDefinition(Shorthand::convertToJsonSchema('enum:not_interested,invalid|ns:Contact'), 'reason_type'); + + $fileCollection = FileCollection::emptyList(); + + $classBuilder = $this->exceptionFactory->classBuilder($typeSet->first(), 'Acme\Contact\ReasonType'); + + $this->assertEnumException($classBuilder); + $fileCollection->add($classBuilder); + + $files = $this->fileCodeGenerator->generateFiles($fileCollection); + + $this->assertEnumExceptionFile($files['tmp/Contact/Exception/InvalidReasonType.php']); + } + + private function assertEnumException(ClassBuilder $classBuilder): void + { + $this->assertSame('InvalidReasonType', $classBuilder->getName()); + } + + private function assertEnumExceptionFile(string $code): void + { + $expected = <<<'PHP' + assertSame($expected, $code); + } +} diff --git a/tests/ValueObject/ArrayFactoryTest.php b/tests/ValueObject/ArrayFactoryTest.php index 84142dc..ed72bbc 100644 --- a/tests/ValueObject/ArrayFactoryTest.php +++ b/tests/ValueObject/ArrayFactoryTest.php @@ -51,6 +51,11 @@ public function it_generates_code_from_native(): void $this->assertCode( $this->arrayFactory->nodeVisitorsFromNative('items', ...$type->items()) ); + + $this->assertCode( + $this->arrayFactory->nodeVisitorsFromNative('items', ...$type->items()), + $this->getExpectedGeneratedCode() + ); } /** @@ -71,6 +76,11 @@ public function it_generates_code_from_definition(): void $this->assertInstanceOf(ArrayType::class, $type); $this->assertCode($this->arrayFactory->nodeVisitors($type)); + + $this->assertCode( + $this->arrayFactory->nodeVisitors($type), + $this->getExpectedGeneratedCode() + ); } /** @@ -88,6 +98,13 @@ public function it_generates_code_via_value_object_factory(): void ArrayType::fromDefinition($definition) ) ); + + $this->assertCode( + $this->voFactory->nodeVisitors( + ArrayType::fromDefinition($definition) + ), + $this->getExpectedGeneratedCode() + ); } /** @@ -106,14 +123,19 @@ public function it_generates_code_via_value_object_factory_with_class_builder(): $this->assertCode( $classBuilder->generate($this->parser) ); + $this->assertCode( + $classBuilder->generate($this->parser), + $this->getExpectedGeneratedCode() + ); } /** * @param array $nodeVisitors + * @param string $code */ - private function assertCode(array $nodeVisitors): void + private function assertCode(array $nodeVisitors, string $code = 'parser->parse('parser->parse($code); $nodeTraverser = new NodeTraverser(); @@ -121,125 +143,127 @@ private function assertCode(array $nodeVisitors): void $nodeTraverser->addVisitor($nodeVisitor); } - $expected = <<<'EOF' -position = 0; - } - public function current() : ReasonType - { - return $this->items[$this->position]; - } - public function key() : int - { - return $this->position; - } - public function next() : void - { - ++$this->position; - } - public function valid() : bool - { - return isset($this->items[$this->position]); - } - public function count() : int - { - return count($this->items); - } - public static function fromArray(array $items) : self - { - return new self(...array_map(static function (string $item) { - return ReasonType::fromString($item); - }, $items)); - } - public static function fromItems(ReasonType ...$items) : self - { - return new self(...$items); - } - public static function emptyList() : self - { - return new self(); - } - private function __construct(ReasonType ...$items) - { - $this->items = $items; - } - public function add(ReasonType $reasonType) : self - { - $copy = clone $this; - $copy->items[] = $reasonType; - return $copy; - } - public function remove(ReasonType $reasonType) : self - { - $copy = clone $this; - $copy->items = array_values(array_filter($copy->items, static function ($v) use($reasonType) { - return !$v->equals($reasonType); - })); - return $copy; + $this->assertSame($this->getExpectedGeneratedCode(), $this->printer->prettyPrintFile($nodeTraverser->traverse($ast))); } - public function first() : ?ReasonType - { - return $this->items[0] ?? null; - } - public function last() : ?ReasonType - { - if (count($this->items) === 0) { - return null; - } - return $this->items[count($this->items) - 1]; - } - public function contains(ReasonType $reasonType) : bool + + private function getExpectedGeneratedCode(): string { - foreach ($this->items as $existingItem) { - if ($existingItem->equals($reasonType)) { - return true; + return <<<'EOF' + position = 0; + } + public function current() : ReasonType + { + return $this->items[$this->position]; + } + public function key() : int + { + return $this->position; + } + public function next() : void + { + ++$this->position; + } + public function valid() : bool + { + return isset($this->items[$this->position]); + } + public function count() : int + { + return count($this->items); + } + public static function fromArray(array $items) : self + { + return new self(...array_map(static function (string $item) { + return ReasonType::fromString($item); + }, $items)); + } + public static function fromItems(ReasonType ...$items) : self + { + return new self(...$items); + } + public static function emptyList() : self + { + return new self(); + } + private function __construct(ReasonType ...$items) + { + $this->items = $items; + } + public function add(ReasonType $reasonType) : self + { + $copy = clone $this; + $copy->items[] = $reasonType; + return $copy; + } + public function remove(ReasonType $reasonType) : self + { + $copy = clone $this; + $copy->items = array_values(array_filter($copy->items, static function ($v) use($reasonType) { + return !$v->equals($reasonType); + })); + return $copy; + } + public function first() : ?ReasonType + { + return $this->items[0] ?? null; + } + public function last() : ?ReasonType + { + if (count($this->items) === 0) { + return null; + } + return $this->items[count($this->items) - 1]; + } + public function contains(ReasonType $reasonType) : bool + { + foreach ($this->items as $existingItem) { + if ($existingItem->equals($reasonType)) { + return true; + } + } + return false; + } + public function filter(callable $filter) : self + { + return new self(...array_values(array_filter($this->items, static function ($v) use($filter) { + return $filter($v); + }))); + } + /** + * @return ReasonType[] + */ + public function items() : array + { + return $this->items; + } + public function toArray() : array + { + return \array_map(static function (ReasonType $reasonType) { + return $reasonType->toString(); + }, $this->items); + } + /** + * @param mixed $other + */ + public function equals($other) : bool + { + if (!$other instanceof self) { + return false; + } + return $this->toArray() === $other->toArray(); } } - return false; - } - public function filter(callable $filter) : self - { - return new self(...array_values(array_filter($this->items, static function ($v) use($filter) { - return $filter($v); - }))); - } - /** - * @return ReasonType[] - */ - public function items() : array - { - return $this->items; - } - public function toArray() : array - { - return \array_map(static function (ReasonType $reasonType) { - return $reasonType->toString(); - }, $this->items); - } - /** - * @param mixed $other - * @return bool - */ - public function equals($other) : bool - { - if (!$other instanceof self) { - return false; - } - return $this->toArray() === $other->toArray(); - } -} -EOF; - - $this->assertSame($expected, $this->printer->prettyPrintFile($nodeTraverser->traverse($ast))); + EOF; } } diff --git a/tests/ValueObject/Bcp47FactoryTest.php b/tests/ValueObject/Bcp47FactoryTest.php index 10266d6..3ba9b68 100644 --- a/tests/ValueObject/Bcp47FactoryTest.php +++ b/tests/ValueObject/Bcp47FactoryTest.php @@ -96,6 +96,9 @@ public function toString() : string { return $this->bcp47; } + /** + * @param mixed $other + */ public function equals($other) : bool { if (!$other instanceof self) { diff --git a/tests/ValueObject/BooleanFactoryTest.php b/tests/ValueObject/BooleanFactoryTest.php index f226181..b7ec1a9 100644 --- a/tests/ValueObject/BooleanFactoryTest.php +++ b/tests/ValueObject/BooleanFactoryTest.php @@ -87,6 +87,9 @@ public function toBool() : bool { return $this->boolean; } + /** + * @param mixed $other + */ public function equals($other) : bool { if (!$other instanceof self) { diff --git a/tests/ValueObject/EnumFactoryTest.php b/tests/ValueObject/EnumFactoryTest.php index 4a283d7..ece0a8f 100644 --- a/tests/ValueObject/EnumFactoryTest.php +++ b/tests/ValueObject/EnumFactoryTest.php @@ -128,6 +128,9 @@ public function toString() : string { return $this->status; } + /** + * @param mixed $other + */ public function equals($other) : bool { if (!$other instanceof self) { @@ -135,6 +138,9 @@ public function equals($other) : bool } return $this->status === $other->status; } + /** + * @param mixed ...$status + */ public function isOneOf(...$status) : bool { foreach ($status as $otherStatus) { diff --git a/tests/ValueObject/IntegerFactoryTest.php b/tests/ValueObject/IntegerFactoryTest.php index 92f44e6..7bf7d52 100644 --- a/tests/ValueObject/IntegerFactoryTest.php +++ b/tests/ValueObject/IntegerFactoryTest.php @@ -87,6 +87,9 @@ public function toInt() : int { return $this->number; } + /** + * @param mixed $other + */ public function equals($other) : bool { if (!$other instanceof self) { diff --git a/tests/ValueObject/NumberFactoryTest.php b/tests/ValueObject/NumberFactoryTest.php index 0041ec5..a670030 100644 --- a/tests/ValueObject/NumberFactoryTest.php +++ b/tests/ValueObject/NumberFactoryTest.php @@ -87,6 +87,9 @@ public function toFloat() : float { return $this->number; } + /** + * @param mixed $other + */ public function equals($other) : bool { if (!$other instanceof self) { diff --git a/tests/ValueObject/StringFactoryTest.php b/tests/ValueObject/StringFactoryTest.php index 631c7ca..5dd1da1 100644 --- a/tests/ValueObject/StringFactoryTest.php +++ b/tests/ValueObject/StringFactoryTest.php @@ -87,6 +87,9 @@ public function toString() : string { return $this->name; } + /** + * @param mixed $other + */ public function equals($other) : bool { if (!$other instanceof self) { diff --git a/tests/ValueObject/UuidFactoryTest.php b/tests/ValueObject/UuidFactoryTest.php index 3a45343..0fc7771 100644 --- a/tests/ValueObject/UuidFactoryTest.php +++ b/tests/ValueObject/UuidFactoryTest.php @@ -103,12 +103,15 @@ public function toString() : string { return $this->uuid->toString(); } + /** + * @param mixed $other + */ public function equals($other) : bool { if (!$other instanceof self) { return false; } - return $this->uuid === $other->uuid; + return $this->uuid->toString() === $other->uuid->toString(); } public function __toString() : string { diff --git a/tests/ValueObjectFactoryTest.php b/tests/ValueObjectFactoryTest.php index 860b864..6ad11c6 100644 --- a/tests/ValueObjectFactoryTest.php +++ b/tests/ValueObjectFactoryTest.php @@ -96,7 +96,7 @@ public function it_generates_classes_of_objects(): void $this->valueObjectFactory->generateClasses($classBuilder, $fileCollection, $typeSet, $srcFolder); - $this->assertCount(6, $fileCollection); + $this->assertCount(7, $fileCollection); $this->assertOrder($fileCollection->filter(($this->fileFilter)('Order'))->current()); $this->assertShippingAddresses($fileCollection->filter(($this->fileFilter)('ShippingAddresses'))->current()); @@ -104,6 +104,7 @@ public function it_generates_classes_of_objects(): void $this->assertStreetAddress($fileCollection->filter(($this->fileFilter)('StreetAddress'))->current()); $this->assertCity($fileCollection->filter(($this->fileFilter)('City'))->current()); $this->assertState($fileCollection->filter(($this->fileFilter)('State'))->current()); + $this->assertInvalidState($fileCollection->filter(($this->fileFilter)('InvalidState'))->current()); } /** @@ -122,14 +123,14 @@ public function it_generates_files(): void $this->valueObjectFactory->generateClasses($classBuilder, $fileCollection, $typeSet, $srcFolder); - $this->assertCount(6, $fileCollection); + $this->assertCount(7, $fileCollection); $this->valueObjectFactory->addGetterMethodsForProperties($fileCollection, true); $this->valueObjectFactory->addClassConstantsForProperties($fileCollection); $files = $this->valueObjectFactory->generateFiles($fileCollection); - $this->assertCount(6, $files); + $this->assertCount(7, $files); $this->assertArrayHasKey('tmp/City.php', $files); $this->assertArrayHasKey('tmp/Order.php', $files); @@ -137,6 +138,7 @@ public function it_generates_files(): void $this->assertArrayHasKey('tmp/Address.php', $files); $this->assertArrayHasKey('tmp/State.php', $files); $this->assertArrayHasKey('tmp/StreetAddress.php', $files); + $this->assertArrayHasKey('tmp/Exception/InvalidState.php', $files); $this->assertOrderFile($files['tmp/Order.php']); $this->assertShippingAddressesFile($files['tmp/ShippingAddresses.php']); @@ -144,6 +146,7 @@ public function it_generates_files(): void $this->assertStreetAddressFile($files['tmp/StreetAddress.php']); $this->assertCityFile($files['tmp/City.php']); $this->assertStateFile($files['tmp/State.php']); + $this->assertInvalidStateFile($files['tmp/Exception/InvalidState.php']); } /** @@ -162,7 +165,7 @@ public function it_generates_classes_of_objects_with_namespaced_properties(): vo $this->valueObjectFactory->generateClasses($classBuilder, $fileCollection, $typeSet, $srcFolder); - $this->assertCount(6, $fileCollection); + $this->assertCount(7, $fileCollection); /** @var ClassBuilder $classBuilder */ foreach ($fileCollection as $classBuilder) { @@ -198,6 +201,13 @@ public function it_generates_classes_of_objects_with_namespaced_properties(): vo $this->assertSame('Address', $properties['billingAddress']->getType()); $this->assertSame('?ShippingAddresses', $properties['shippingAddresses']->getType()); break; + case $classBuilder->getName() === 'InvalidState': + $this->assertSame('Acme\\Address\\Exception', $classBuilder->getNamespace()); + + $this->assertArrayHasKey('Fig\Http\Message\StatusCodeInterface', $classBuilder->getNamespaceImports()); + $this->assertArrayHasKey('InvalidArgumentException', $classBuilder->getNamespaceImports()); + $this->assertArrayHasKey('Acme\Address\State', $classBuilder->getNamespaceImports()); + break; default: $this->assertTrue(false, \sprintf('Unexpected class "%s"', $classBuilder->getName())); } @@ -243,6 +253,49 @@ public function it_generates_classes_of_objects_with_namespaced_properties_short } } + /** + * @test + */ + public function it_generates_classes_of_objects_with_type_namespaced_properties_shorthand(): void + { + $json = \file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'schema_shorthand_type_namespace.json'); + $decodedJson = \json_decode($json, true, 512, \JSON_BIGINT_AS_STRING | \JSON_THROW_ON_ERROR); + + $typeSet = Type::fromShorthand($decodedJson); + $srcFolder = 'tmp/ValueObject/Shopping'; + $rootSrcFolder = 'tmp/ValueObject'; + + $fileCollection = FileCollection::emptyList(); + $classBuilder = ClassBuilder::fromScratch('Order', 'Acme')->setFinal(true); + + $this->valueObjectFactory->generateClasses($classBuilder, $fileCollection, $typeSet, $srcFolder, null, $rootSrcFolder); + + $this->assertCount(2, $fileCollection); + + /** @var ClassBuilder $classBuilder */ + foreach ($fileCollection as $classBuilder) { + switch (true) { + case $classBuilder->getName() === 'Order': + $this->assertSame('Acme', $classBuilder->getNamespace()); + $this->assertArrayHasKey('Acme\ValueObject\Shopping\Billing\Address', $classBuilder->getNamespaceImports()); + $this->assertArrayHasKey('Acme\ValueObject\Payment\ShippingAddresses', $classBuilder->getNamespaceImports()); + + $properties = $classBuilder->getProperties(); + $this->assertArrayHasKey('billingAddress', $properties); + $this->assertArrayHasKey('address', $properties); + + $this->assertSame('Address', $properties['billingAddress']->getType()); + $this->assertSame('?ShippingAddresses', $properties['address']->getType()); + break; + case $classBuilder->getName() === 'Uuid': + $this->assertSame('Acme\ValueObject', $classBuilder->getNamespace()); + break; + default: + $this->assertTrue(false, \sprintf('Unexpected class "%s"', $classBuilder->getName())); + } + } + } + private function assertOrder(ClassBuilder $classBuilder): void { $this->assertSame('Order', $classBuilder->getName()); @@ -390,156 +443,172 @@ private function assertCity(ClassBuilder $classBuilder): void $this->assertSame('string', $properties['city']->getType()); } - private function assertOrderFile(string $code): void + private function assertInvalidState(ClassBuilder $classBuilder): void { - $expected = <<<'PHP' -assertSame('InvalidState', $classBuilder->getName()); + $this->assertSame('Acme\Exception', $classBuilder->getNamespace()); + $this->assertTrue($classBuilder->isFinal()); + $this->assertTrue($classBuilder->isStrict()); + $this->assertTrue($classBuilder->isTyped()); -declare (strict_types=1); -namespace Acme; + $methods = $classBuilder->getMethods(); -final class Order -{ - public const BILLING_ADDRESS = 'billing_address'; - public const SHIPPING_ADDRESSES = 'shipping_addresses'; - private Address $billingAddress; - private ?ShippingAddresses $shippingAddresses; - public function billingAddress() : Address - { - return $this->billingAddress; + $this->assertCount(1, $methods); + $this->assertArrayHasKey('forState', $methods); + + $properties = $classBuilder->getProperties(); + $this->assertCount(0, $properties); } - public function shippingAddresses() : ?ShippingAddresses + + private function assertOrderFile(string $code): void { - return $this->shippingAddresses; - } -} -PHP; + $expected = <<<'PHP' + billingAddress; + } + public function shippingAddresses() : ?ShippingAddresses + { + return $this->shippingAddresses; + } + } + PHP; $this->assertSame($expected, $code); } private function assertShippingAddressesFile(string $code): void { $expected = <<<'PHP' -position = 0; - } - public function current() : Address - { - return $this->shippingAddresses[$this->position]; - } - public function key() : int - { - return $this->position; - } - public function next() : void - { - ++$this->position; - } - public function valid() : bool - { - return isset($this->shippingAddresses[$this->position]); - } - public function count() : int - { - return count($this->shippingAddresses); - } - public static function fromArray(array $shippingAddresses) : self - { - return new self(...array_map(static function (string $item) { - return Address::fromString($item); - }, $shippingAddresses)); - } - public static function fromItems(Address ...$shippingAddresses) : self - { - return new self(...$shippingAddresses); - } - public static function emptyList() : self - { - return new self(); - } - private function __construct(Address ...$shippingAddresses) - { - $this->shippingAddresses = $shippingAddresses; - } - public function add(Address $address) : self - { - $copy = clone $this; - $copy->shippingAddresses[] = $address; - return $copy; - } - public function remove(Address $address) : self - { - $copy = clone $this; - $copy->shippingAddresses = array_values(array_filter($copy->shippingAddresses, static function ($v) use($address) { - return !$v->equals($address); - })); - return $copy; - } - public function first() : ?Address - { - return $this->shippingAddresses[0] ?? null; - } - public function last() : ?Address - { - if (count($this->shippingAddresses) === 0) { - return null; - } - return $this->shippingAddresses[count($this->shippingAddresses) - 1]; - } - public function contains(Address $address) : bool - { - foreach ($this->shippingAddresses as $existingItem) { - if ($existingItem->equals($address)) { - return true; + position = 0; + } + public function current() : Address + { + return $this->shippingAddresses[$this->position]; + } + public function key() : int + { + return $this->position; + } + public function next() : void + { + ++$this->position; + } + public function valid() : bool + { + return isset($this->shippingAddresses[$this->position]); + } + public function count() : int + { + return count($this->shippingAddresses); + } + public static function fromArray(array $shippingAddresses) : self + { + return new self(...array_map(static function (array $item) { + return Address::fromArray($item); + }, $shippingAddresses)); + } + public static function fromItems(Address ...$shippingAddresses) : self + { + return new self(...$shippingAddresses); + } + public static function emptyList() : self + { + return new self(); + } + private function __construct(Address ...$shippingAddresses) + { + $this->shippingAddresses = $shippingAddresses; + } + public function add(Address $address) : self + { + $copy = clone $this; + $copy->shippingAddresses[] = $address; + return $copy; + } + public function remove(Address $address) : self + { + $copy = clone $this; + $copy->shippingAddresses = array_values(array_filter($copy->shippingAddresses, static function ($v) use($address) { + return !$v->equals($address); + })); + return $copy; + } + public function first() : ?Address + { + return $this->shippingAddresses[0] ?? null; + } + public function last() : ?Address + { + if (count($this->shippingAddresses) === 0) { + return null; + } + return $this->shippingAddresses[count($this->shippingAddresses) - 1]; + } + public function contains(Address $address) : bool + { + foreach ($this->shippingAddresses as $existingItem) { + if ($existingItem->equals($address)) { + return true; + } + } + return false; + } + public function filter(callable $filter) : self + { + return new self(...array_values(array_filter($this->shippingAddresses, static function ($v) use($filter) { + return $filter($v); + }))); + } + /** + * @return Address[] + */ + public function items() : array + { + return $this->shippingAddresses; + } + public function toArray() : array + { + return \array_map(static function (Address $address) { + return $address->toArray(); + }, $this->shippingAddresses); + } + /** + * @param mixed $other + */ + public function equals($other) : bool + { + if (!$other instanceof self) { + return false; + } + return $this->toArray() === $other->toArray(); } } - return false; - } - public function filter(callable $filter) : self - { - return new self(...array_values(array_filter($this->shippingAddresses, static function ($v) use($filter) { - return $filter($v); - }))); - } - /** - * @return Address[] - */ - public function items() : array - { - return $this->shippingAddresses; - } - public function toArray() : array - { - return \array_map(static function (Address $address) { - return $address->toString(); - }, $this->shippingAddresses); - } - /** - * @param mixed $other - * @return bool - */ - public function equals($other) : bool - { - if (!$other instanceof self) { - return false; - } - return $this->toArray() === $other->toArray(); - } -} -PHP; + PHP; $this->assertSame($expected, $code); } @@ -547,194 +616,230 @@ public function equals($other) : bool private function assertAddressFile(string $code): void { $expected = <<<'PHP' -streetAddress; - } - public function city() : ?City - { - return $this->city; - } - public function federalState() : State - { - return $this->federalState; - } -} -PHP; + streetAddress; + } + public function city() : ?City + { + return $this->city; + } + public function federalState() : State + { + return $this->federalState; + } + } + PHP; $this->assertSame($expected, $code); } private function assertBillingAddressFile(string $code): void { $expected = <<<'PHP' -address; - } -} -PHP; + address; + } + } + PHP; $this->assertSame($expected, $code); } private function assertCityFile(string $code): void { $expected = <<<'PHP' -city = $city; - } - public function toString() : string - { - return $this->city; - } - public function equals($other) : bool - { - if (!$other instanceof self) { - return false; + city = $city; + } + public function toString() : string + { + return $this->city; + } + /** + * @param mixed $other + */ + public function equals($other) : bool + { + if (!$other instanceof self) { + return false; + } + return $this->city === $other->city; + } + public function __toString() : string + { + return $this->city; + } } - return $this->city === $other->city; - } - public function __toString() : string - { - return $this->city; - } -} -PHP; + PHP; $this->assertSame($expected, $code); } private function assertStreetAddressFile(string $code): void { $expected = <<<'PHP' -streetAddress = $streetAddress; - } - public function toString() : string - { - return $this->streetAddress; - } - public function equals($other) : bool - { - if (!$other instanceof self) { - return false; + streetAddress = $streetAddress; + } + public function toString() : string + { + return $this->streetAddress; + } + /** + * @param mixed $other + */ + public function equals($other) : bool + { + if (!$other instanceof self) { + return false; + } + return $this->streetAddress === $other->streetAddress; + } + public function __toString() : string + { + return $this->streetAddress; + } } - return $this->streetAddress === $other->streetAddress; - } - public function __toString() : string - { - return $this->streetAddress; - } -} -PHP; + PHP; $this->assertSame($expected, $code); } private function assertStateFile(string $code): void { $expected = <<<'PHP' -state = $state; - } - public function toString() : string - { - return $this->state; - } - public function equals($other) : bool - { - if (!$other instanceof self) { - return false; + state = $state; + } + public function toString() : string + { + return $this->state; + } + /** + * @param mixed $other + */ + public function equals($other) : bool + { + if (!$other instanceof self) { + return false; + } + return $this->state === $other->state; + } + /** + * @param mixed ...$state + */ + public function isOneOf(...$state) : bool + { + foreach ($state as $otherState) { + if ($this->equals($otherState)) { + return true; + } + } + return false; + } + public function __toString() : string + { + return $this->state; + } } - return $this->state === $other->state; + PHP; + $this->assertSame($expected, $code); } - public function isOneOf(...$state) : bool + + private function assertInvalidStateFile(string $code): void { - foreach ($state as $otherState) { - if ($this->equals($otherState)) { - return true; + $expected = <<<'PHP' + state; - } -} -PHP; + PHP; + $this->assertSame($expected, $code); } } diff --git a/tests/_files/schema_shorthand_type_namespace.json b/tests/_files/schema_shorthand_type_namespace.json new file mode 100644 index 0000000..158aaa9 --- /dev/null +++ b/tests/_files/schema_shorthand_type_namespace.json @@ -0,0 +1,5 @@ +{ + "uuid": "/string|format:uuid", + "billing_address": "Billing/Address", + "address?": "/Payment/ShippingAddresses" +}