From 8cd6fefd7f079256a39e686afa2543d184c2baae Mon Sep 17 00:00:00 2001 From: Adrien Crivelli Date: Wed, 10 Jul 2024 10:51:31 +0900 Subject: [PATCH 1/3] Update to Doctrine ORM 3.3 #10257 --- composer.json | 4 +- composer.lock | 1400 ++++++++--------- phpstan-baseline.neon | 231 ++- phpstan.neon.dist | 3 +- src/Attribute/Field.php | 3 + src/Attribute/Reader/Reader.php | 2 - src/Definition/Operator/EmptyOperatorType.php | 2 +- src/Definition/Operator/HaveOperatorType.php | 10 +- .../AbstractFieldsConfigurationFactory.php | 6 +- src/Factory/FilteredQueryBuilderFactory.php | 2 +- .../OutputFieldsConfigurationFactory.php | 2 +- .../Type/FilterGroupConditionTypeFactory.php | 11 +- .../Type/FilterGroupJoinTypeFactory.php | 4 +- src/Factory/Type/PartialInputTypeFactory.php | 5 +- src/Factory/Type/SortingTypeFactory.php | 2 +- tests/Blog/Filtering/SearchOperatorType.php | 4 +- tests/Blog/Model/Special/ArrayOfEntity.php | 2 +- tests/EntityManagerTrait.php | 5 +- tests/data/PostFilter.graphqls | 212 +-- tests/data/PostSorting.graphqls | 2 +- tests/data/UserSorting.graphqls | 2 +- 21 files changed, 1004 insertions(+), 910 deletions(-) diff --git a/composer.json b/composer.json index 5bf2dbb..c328a8c 100644 --- a/composer.json +++ b/composer.json @@ -37,9 +37,9 @@ }, "require": { "php": "^8.2", - "doctrine/orm": "^2.15", + "doctrine/orm": "^3.3", "psr/container": "^1.1 || ^2.0", - "webonyx/graphql-php": "^15.7" + "webonyx/graphql-php": "^15.20" }, "require-dev": { "friendsofphp/php-cs-fixer": "@stable", diff --git a/composer.lock b/composer.lock index 3d196e2..38e82c4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,126 +4,33 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b7be194f951fde9bee7e9a5246c19694", + "content-hash": "985e392b86ec465989edf0ea616c7ff9", "packages": [ - { - "name": "doctrine/cache", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.2.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", - "type": "tidelift" - } - ], - "time": "2022-05-20T20:07:39+00:00" - }, { "name": "doctrine/collections", - "version": "2.2.2", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" + "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", - "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", + "url": "https://api.github.com/repos/doctrine/collections/zipball/2eb07e5953eed811ce1b309a7478a3b236f2273d", + "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d", "shasum": "" }, "require": { "doctrine/deprecations": "^1", - "php": "^8.1" + "php": "^8.1", + "symfony/polyfill-php84": "^1.30" }, "require-dev": { "doctrine/coding-standard": "^12", "ext-json": "*", "phpstan/phpstan": "^1.8", "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "^5.11" + "phpunit/phpunit": "^10.5" }, "type": "library", "autoload": { @@ -167,7 +74,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.2.2" + "source": "https://github.com/doctrine/collections/tree/2.3.0" }, "funding": [ { @@ -183,142 +90,44 @@ "type": "tidelift" } ], - "time": "2024-04-18T06:56:21+00:00" - }, - { - "name": "doctrine/common", - "version": "3.4.4", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a", - "reference": "0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a", - "shasum": "" - }, - "require": { - "doctrine/persistence": "^2.0 || ^3.0", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9.0 || ^10.0", - "doctrine/collections": "^1", - "phpstan/phpstan": "^1.4.1", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", - "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^6.1", - "vimeo/psalm": "^4.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", - "homepage": "https://www.doctrine-project.org/projects/common.html", - "keywords": [ - "common", - "doctrine", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.4.4" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", - "type": "tidelift" - } - ], - "time": "2024-04-16T13:35:33+00:00" + "time": "2025-03-22T10:17:19+00:00" }, { "name": "doctrine/dbal", - "version": "3.8.6", + "version": "4.2.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "b7411825cf7efb7e51f9791dea19d86e43b399a1" + "reference": "33d2d7fe1269b2301640c44cf2896ea607b30e3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/b7411825cf7efb7e51f9791dea19d86e43b399a1", - "reference": "b7411825cf7efb7e51f9791dea19d86e43b399a1", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/33d2d7fe1269b2301640c44cf2896ea607b30e3e", + "reference": "33d2d7fe1269b2301640c44cf2896ea607b30e3e", "shasum": "" }, "require": { - "composer-runtime-api": "^2", - "doctrine/cache": "^1.11|^2.0", "doctrine/deprecations": "^0.5.3|^1", - "doctrine/event-manager": "^1|^2", - "php": "^7.4 || ^8.0", + "php": "^8.1", "psr/cache": "^1|^2|^3", "psr/log": "^1|^2|^3" }, "require-dev": { "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.11.5", - "phpstan/phpstan-strict-rules": "^1.6", - "phpunit/phpunit": "9.6.19", - "psalm/plugin-phpunit": "0.18.4", + "jetbrains/phpstorm-stubs": "2023.2", + "phpstan/phpstan": "2.1.1", + "phpstan/phpstan-phpunit": "2.0.3", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "10.5.39", "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.10.1", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/console": "^4.4|^5.4|^6.0|^7.0", - "vimeo/psalm": "4.30.0" + "squizlabs/php_codesniffer": "3.10.2", + "symfony/cache": "^6.3.8|^7.0", + "symfony/console": "^5.4|^6.3|^7.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." }, - "bin": [ - "bin/doctrine-dbal" - ], "type": "library", "autoload": { "psr-4": { @@ -371,7 +180,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.8.6" + "source": "https://github.com/doctrine/dbal/tree/4.2.3" }, "funding": [ { @@ -387,33 +196,34 @@ "type": "tidelift" } ], - "time": "2024-06-19T10:38:17+00:00" + "time": "2025-03-07T18:29:05+00:00" }, { "name": "doctrine/deprecations", - "version": "1.1.3", + "version": "1.1.5", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "psr/log": "^1 || ^2 || ^3" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -421,7 +231,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + "Doctrine\\Deprecations\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -432,9 +242,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" }, - "time": "2024-01-30T19:34:25+00:00" + "time": "2025-04-07T20:06:18+00:00" }, { "name": "doctrine/event-manager", @@ -767,61 +577,50 @@ }, { "name": "doctrine/orm", - "version": "2.19.6", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "c1bb2ccf4b19c845f91ff7c4c01dc7cbba7f4073" + "reference": "c9557c588b3a70ed93caff069d0aa75737f25609" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/c1bb2ccf4b19c845f91ff7c4c01dc7cbba7f4073", - "reference": "c1bb2ccf4b19c845f91ff7c4c01dc7cbba7f4073", + "url": "https://api.github.com/repos/doctrine/orm/zipball/c9557c588b3a70ed93caff069d0aa75737f25609", + "reference": "c9557c588b3a70ed93caff069d0aa75737f25609", "shasum": "" }, "require": { "composer-runtime-api": "^2", - "doctrine/cache": "^1.12.1 || ^2.1.1", - "doctrine/collections": "^1.5 || ^2.1", - "doctrine/common": "^3.0.3", - "doctrine/dbal": "^2.13.1 || ^3.2", + "doctrine/collections": "^2.2", + "doctrine/dbal": "^3.8.2 || ^4", "doctrine/deprecations": "^0.5.3 || ^1", "doctrine/event-manager": "^1.2 || ^2", "doctrine/inflector": "^1.4 || ^2.0", "doctrine/instantiator": "^1.3 || ^2", - "doctrine/lexer": "^2 || ^3", - "doctrine/persistence": "^2.4 || ^3", + "doctrine/lexer": "^3", + "doctrine/persistence": "^3.3.1 || ^4", "ext-ctype": "*", - "php": "^7.1 || ^8.0", + "php": "^8.1", "psr/cache": "^1 || ^2 || ^3", - "symfony/console": "^4.2 || ^5.0 || ^6.0 || ^7.0", - "symfony/polyfill-php72": "^1.23", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "doctrine/annotations": "<1.13 || >= 3.0" + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^6.3.9 || ^7.0" }, "require-dev": { - "doctrine/annotations": "^1.13 || ^2", - "doctrine/coding-standard": "^9.0.2 || ^12.0", - "phpbench/phpbench": "^0.16.10 || ^1.0", - "phpstan/phpstan": "~1.4.10 || 1.11.1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "doctrine/coding-standard": "^12.0", + "phpbench/phpbench": "^1.0", + "phpdocumentor/guides-cli": "^1.4", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "2.0.3", + "phpstan/phpstan-deprecation-rules": "^2", + "phpunit/phpunit": "^10.4.0", "psr/log": "^1 || ^2 || ^3", "squizlabs/php_codesniffer": "3.7.2", - "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7.0", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2 || ^7.0", - "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", - "vimeo/psalm": "4.30.0 || 5.24.0" + "symfony/cache": "^5.4 || ^6.2 || ^7.0" }, "suggest": { "ext-dom": "Provides support for XSD validation for XML mapping files", - "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", - "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0" }, - "bin": [ - "bin/doctrine" - ], "type": "library", "autoload": { "psr-4": { @@ -862,27 +661,27 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.19.6" + "source": "https://github.com/doctrine/orm/tree/3.3.2" }, - "time": "2024-06-26T17:24:40+00:00" + "time": "2025-02-04T19:43:15+00:00" }, { "name": "doctrine/persistence", - "version": "3.3.3", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "b337726451f5d530df338fc7f68dee8781b49779" + "reference": "45004aca79189474f113cbe3a53847c2115a55fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/b337726451f5d530df338fc7f68dee8781b49779", - "reference": "b337726451f5d530df338fc7f68dee8781b49779", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/45004aca79189474f113cbe3a53847c2115a55fa", + "reference": "45004aca79189474f113cbe3a53847c2115a55fa", "shasum": "" }, "require": { "doctrine/event-manager": "^1 || ^2", - "php": "^7.2 || ^8.0", + "php": "^8.1", "psr/cache": "^1.0 || ^2.0 || ^3.0" }, "conflict": { @@ -890,13 +689,11 @@ }, "require-dev": { "doctrine/coding-standard": "^12", - "doctrine/common": "^3.0", - "phpstan/phpstan": "1.11.1", + "phpstan/phpstan": "1.12.7", "phpstan/phpstan-phpunit": "^1", "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6.0", - "vimeo/psalm": "4.30.0 || 5.24.0" + "phpunit/phpunit": "^9.6", + "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0" }, "type": "library", "autoload": { @@ -945,7 +742,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.3.3" + "source": "https://github.com/doctrine/persistence/tree/4.0.0" }, "funding": [ { @@ -961,7 +758,7 @@ "type": "tidelift" } ], - "time": "2024-06-20T10:14:30+00:00" + "time": "2024-11-01T21:49:07+00:00" }, { "name": "psr/cache", @@ -1067,16 +864,16 @@ }, { "name": "psr/log", - "version": "3.0.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { @@ -1111,22 +908,22 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2021-07-14T16:46:02+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "symfony/console", - "version": "v7.1.2", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0aa29ca177f432ab68533432db0de059f39c92ae" + "reference": "e51498ea18570c062e7df29d05a7003585b19b88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0aa29ca177f432ab68533432db0de059f39c92ae", - "reference": "0aa29ca177f432ab68533432db0de059f39c92ae", + "url": "https://api.github.com/repos/symfony/console/zipball/e51498ea18570c062e7df29d05a7003585b19b88", + "reference": "e51498ea18570c062e7df29d05a7003585b19b88", "shasum": "" }, "require": { @@ -1190,7 +987,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.1.2" + "source": "https://github.com/symfony/console/tree/v7.2.5" }, "funding": [ { @@ -1206,20 +1003,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T10:03:55+00:00" + "time": "2025-03-12T08:11:12+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "shasum": "" }, "require": { @@ -1227,12 +1024,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -1257,7 +1054,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" }, "funding": [ { @@ -1273,24 +1070,24 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -1301,8 +1098,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1336,7 +1133,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { @@ -1352,24 +1149,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -1377,8 +1174,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1414,7 +1211,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -1430,24 +1227,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -1455,8 +1252,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1495,7 +1292,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -1511,24 +1308,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -1539,8 +1336,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1575,7 +1372,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -1591,30 +1388,30 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php72", - "version": "v1.30.0", + "name": "symfony/polyfill-php84", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "10112722600777e02d2745716b70c5db4ca70442" + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", - "reference": "10112722600777e02d2745716b70c5db4ca70442", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/e5493eb51311ab0b1cc2243416613f06ed8f18bd", + "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1622,8 +1419,11 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1639,7 +1439,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -1648,7 +1448,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.31.0" }, "funding": [ { @@ -1664,41 +1464,46 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T12:04:04+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.30.0", + "name": "symfony/service-contracts", + "version": "v3.5.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Contracts\\Service\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -1706,10 +1511,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -1719,16 +1520,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Generic abstractions related to writing services", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" }, "funding": [ { @@ -1744,46 +1547,50 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "symfony/service-contracts", - "version": "v3.5.0", + "name": "symfony/string", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + "url": "https://github.com/symfony/string.git", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "ext-psr": "<1.1|>=2" + "symfony/translation-contracts": "<2.5" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" }, + "type": "library", "autoload": { + "files": [ + "Resources/functions.php" + ], "psr-4": { - "Symfony\\Contracts\\Service\\": "" + "Symfony\\Component\\String\\": "" }, "exclude-from-classmap": [ - "/Test/" + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -1800,18 +1607,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to writing services", + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", "homepage": "https://symfony.com", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/string/tree/v7.2.0" }, "funding": [ { @@ -1827,47 +1634,34 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-11-13T13:31:26+00:00" }, { - "name": "symfony/string", - "version": "v7.1.2", + "name": "symfony/var-exporter", + "version": "v7.2.5", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "14221089ac66cf82e3cf3d1c1da65de305587ff8" + "url": "https://github.com/symfony/var-exporter.git", + "reference": "c37b301818bd7288715d40de634f05781b686ace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/14221089ac66cf82e3cf3d1c1da65de305587ff8", - "reference": "14221089ac66cf82e3cf3d1c1da65de305587ff8", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/c37b301818bd7288715d40de634f05781b686ace", + "reference": "c37b301818bd7288715d40de634f05781b686ace", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/translation-contracts": "<2.5" + "php": ">=8.2" }, "require-dev": { - "symfony/emoji": "^7.1", - "symfony/error-handler": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "type": "library", "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\String\\": "" + "Symfony\\Component\\VarExporter\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -1887,18 +1681,20 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "description": "Allows exporting any serializable PHP data structure to plain PHP code", "homepage": "https://symfony.com", "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.2" + "source": "https://github.com/symfony/var-exporter/tree/v7.2.5" }, "funding": [ { @@ -1914,20 +1710,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:27:18+00:00" + "time": "2025-03-13T12:21:46+00:00" }, { "name": "webonyx/graphql-php", - "version": "v15.12.5", + "version": "v15.20.0", "source": { "type": "git", "url": "https://github.com/webonyx/graphql-php.git", - "reference": "7bcd31d1dcf67781ed5cb493b22c519c539c05e6" + "reference": "60feb7ad5023c0ef411efbdf9792d3df5812e28f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/7bcd31d1dcf67781ed5cb493b22c519c539c05e6", - "reference": "7bcd31d1dcf67781ed5cb493b22c519c539c05e6", + "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/60feb7ad5023c0ef411efbdf9792d3df5812e28f", + "reference": "60feb7ad5023c0ef411efbdf9792d3df5812e28f", "shasum": "" }, "require": { @@ -1940,22 +1736,22 @@ "amphp/http-server": "^2.1", "dms/phpunit-arraysubset-asserts": "dev-master", "ergebnis/composer-normalize": "^2.28", - "friendsofphp/php-cs-fixer": "3.59.3", - "mll-lab/php-cs-fixer-config": "^5", + "friendsofphp/php-cs-fixer": "3.73.1", + "mll-lab/php-cs-fixer-config": "5.11.0", "nyholm/psr7": "^1.5", "phpbench/phpbench": "^1.2", "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "1.11.5", - "phpstan/phpstan-phpunit": "1.4.0", - "phpstan/phpstan-strict-rules": "1.6.0", - "phpunit/phpunit": "^9.5 || ^10.5.21", + "phpstan/phpstan": "2.1.8", + "phpstan/phpstan-phpunit": "2.0.4", + "phpstan/phpstan-strict-rules": "2.0.4", + "phpunit/phpunit": "^9.5 || ^10.5.21 || ^11", "psr/http-message": "^1 || ^2", "react/http": "^1.6", "react/promise": "^2.0 || ^3.0", - "rector/rector": "^1.0", + "rector/rector": "^2.0", "symfony/polyfill-php81": "^1.23", "symfony/var-exporter": "^5 || ^6 || ^7", - "thecodingmachine/safe": "^1.3 || ^2" + "thecodingmachine/safe": "^1.3 || ^2 || ^3" }, "suggest": { "amphp/http-server": "To leverage async resolving with webserver on AMPHP platform", @@ -1980,7 +1776,7 @@ ], "support": { "issues": "https://github.com/webonyx/graphql-php/issues", - "source": "https://github.com/webonyx/graphql-php/tree/v15.12.5" + "source": "https://github.com/webonyx/graphql-php/tree/v15.20.0" }, "funding": [ { @@ -1988,7 +1784,7 @@ "type": "open_collective" } ], - "time": "2024-06-23T11:30:58+00:00" + "time": "2025-03-21T08:45:04+00:00" } ], "packages-dev": [ @@ -2107,28 +1903,36 @@ }, { "name": "composer/pcre", - "version": "3.1.4", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "04229f163664973f68f38f6f73d917799168ef24" + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/04229f163664973f68f38f6f73d917799168ef24", - "reference": "04229f163664973f68f38f6f73d917799168ef24", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, "branch-alias": { "dev-main": "3.x-dev" } @@ -2158,7 +1962,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.4" + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { @@ -2174,28 +1978,28 @@ "type": "tidelift" } ], - "time": "2024-05-27T13:40:54+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { "name": "composer/semver", - "version": "3.4.0", + "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -2239,7 +2043,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.0" + "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { @@ -2255,7 +2059,7 @@ "type": "tidelift" } ], - "time": "2023-08-31T09:50:34+00:00" + "time": "2024-09-19T14:15:21+00:00" }, { "name": "composer/xdebug-handler", @@ -2372,16 +2176,16 @@ }, { "name": "fidry/cpu-core-counter", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42" + "reference": "8520451a140d3f46ac33042715115e290cf5785f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/f92996c4d5c1a696a6a970e20f7c4216200fcc42", - "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", "shasum": "" }, "require": { @@ -2421,7 +2225,7 @@ ], "support": { "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.1.0" + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" }, "funding": [ { @@ -2429,20 +2233,20 @@ "type": "github" } ], - "time": "2024-02-07T09:43:46+00:00" + "time": "2024-08-06T10:04:20+00:00" }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.59.3", + "version": "v3.75.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "30ba9ecc2b0e5205e578fe29973c15653d9bfd29" + "reference": "399a128ff2fdaf4281e4e79b755693286cdf325c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/30ba9ecc2b0e5205e578fe29973c15653d9bfd29", - "reference": "30ba9ecc2b0e5205e578fe29973c15653d9bfd29", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/399a128ff2fdaf4281e4e79b755693286cdf325c", + "reference": "399a128ff2fdaf4281e4e79b755693286cdf325c", "shasum": "" }, "require": { @@ -2450,40 +2254,41 @@ "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.3", "ext-filter": "*", + "ext-hash": "*", "ext-json": "*", "ext-tokenizer": "*", - "fidry/cpu-core-counter": "^1.0", + "fidry/cpu-core-counter": "^1.2", "php": "^7.4 || ^8.0", "react/child-process": "^0.6.5", "react/event-loop": "^1.0", "react/promise": "^2.0 || ^3.0", "react/socket": "^1.0", "react/stream": "^1.0", - "sebastian/diff": "^4.0 || ^5.0 || ^6.0", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", - "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", - "symfony/finder": "^5.4 || ^6.0 || ^7.0", - "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", - "symfony/polyfill-mbstring": "^1.28", - "symfony/polyfill-php80": "^1.28", - "symfony/polyfill-php81": "^1.28", - "symfony/process": "^5.4 || ^6.0 || ^7.0", - "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" + "sebastian/diff": "^4.0 || ^5.1 || ^6.0 || ^7.0", + "symfony/console": "^5.4 || ^6.4 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", + "symfony/finder": "^5.4 || ^6.4 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0", + "symfony/polyfill-mbstring": "^1.31", + "symfony/polyfill-php80": "^1.31", + "symfony/polyfill-php81": "^1.31", + "symfony/process": "^5.4 || ^6.4 || ^7.2", + "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0" }, "require-dev": { - "facile-it/paraunit": "^1.3 || ^2.3", - "infection/infection": "^0.29.5", - "justinrainbow/json-schema": "^5.2", + "facile-it/paraunit": "^1.3.1 || ^2.6", + "infection/infection": "^0.29.14", + "justinrainbow/json-schema": "^5.3 || ^6.2", "keradus/cli-executor": "^2.1", - "mikey179/vfsstream": "^1.6.11", + "mikey179/vfsstream": "^1.6.12", "php-coveralls/php-coveralls": "^2.7", "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", - "phpunit/phpunit": "^9.6.19 || ^10.5.21 || ^11.2", - "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", + "phpunit/phpunit": "^9.6.22 || ^10.5.45 || ^11.5.12", + "symfony/var-dumper": "^5.4.48 || ^6.4.18 || ^7.2.3", + "symfony/yaml": "^5.4.45 || ^6.4.18 || ^7.2.3" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -2524,7 +2329,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.59.3" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.75.0" }, "funding": [ { @@ -2532,26 +2337,26 @@ "type": "github" } ], - "time": "2024-06-16T14:17:03+00:00" + "time": "2025-03-31T18:40:42+00:00" }, { "name": "laminas/laminas-servicemanager", - "version": "4.2.0", + "version": "4.4.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-servicemanager.git", - "reference": "a8489e352de3ce3f1eaf34a354b1e5f2ad2db85c" + "reference": "74da44d07e493b834347123242d0047976fb9932" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-servicemanager/zipball/a8489e352de3ce3f1eaf34a354b1e5f2ad2db85c", - "reference": "a8489e352de3ce3f1eaf34a354b1e5f2ad2db85c", + "url": "https://api.github.com/repos/laminas/laminas-servicemanager/zipball/74da44d07e493b834347123242d0047976fb9932", + "reference": "74da44d07e493b834347123242d0047976fb9932", "shasum": "" }, "require": { "brick/varexporter": "^0.3.8 || ^0.4.0 || ^0.5.0", - "laminas/laminas-stdlib": "^3.17", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "laminas/laminas-stdlib": "^3.19", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", "psr/container": "^1.1 || ^2.0" }, "conflict": { @@ -2562,19 +2367,17 @@ "psr/container-implementation": "^1.0 || ^2.0" }, "require-dev": { - "boesing/psalm-plugin-stringf": "^1.4", "composer/package-versions-deprecated": "^1.11.99.5", - "friendsofphp/proxy-manager-lts": "^1", - "laminas/laminas-cli": "^1.8", - "laminas/laminas-coding-standard": "~2.5.0", + "friendsofphp/proxy-manager-lts": "^1.0.18", + "laminas/laminas-cli": "^1.11", + "laminas/laminas-coding-standard": "~3.0.1", "laminas/laminas-container-config-test": "^1.0", - "lctrs/psalm-psr-container-plugin": "^1.9", - "mikey179/vfsstream": "^1.6.11@alpha", - "phpbench/phpbench": "^1.2.7", - "phpunit/phpunit": "^10.4", - "psalm/plugin-phpunit": "^0.18.4", - "symfony/console": "^6.0", - "vimeo/psalm": "^5.22" + "mikey179/vfsstream": "^1.6.12", + "phpbench/phpbench": "^1.4.0", + "phpunit/phpunit": "^10.5.44", + "psalm/plugin-phpunit": "^0.19.2", + "symfony/console": "^6.4.17 || ^7.0", + "vimeo/psalm": "^6.2.0" }, "suggest": { "friendsofphp/proxy-manager-lts": "To handle lazy initialization of services", @@ -2583,8 +2386,8 @@ "type": "library", "extra": { "laminas": { - "config-provider": "Laminas\\ServiceManager\\ConfigProvider", - "module": "Laminas\\ServiceManager" + "module": "Laminas\\ServiceManager", + "config-provider": "Laminas\\ServiceManager\\ConfigProvider" } }, "autoload": { @@ -2611,7 +2414,7 @@ "chat": "https://laminas.dev/chat", "forum": "https://discourse.laminas.dev", "issues": "https://github.com/laminas/laminas-servicemanager/issues", - "source": "https://github.com/laminas/laminas-servicemanager/tree/4.2.0" + "source": "https://github.com/laminas/laminas-servicemanager/tree/4.4.0" }, "funding": [ { @@ -2619,34 +2422,34 @@ "type": "community_bridge" } ], - "time": "2024-07-04T09:40:44+00:00" + "time": "2025-02-04T06:13:50+00:00" }, { "name": "laminas/laminas-stdlib", - "version": "3.19.0", + "version": "3.20.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-stdlib.git", - "reference": "6a192dd0882b514e45506f533b833b623b78fff3" + "reference": "8974a1213be42c3e2f70b2c27b17f910291ab2f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/6a192dd0882b514e45506f533b833b623b78fff3", - "reference": "6a192dd0882b514e45506f533b833b623b78fff3", + "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/8974a1213be42c3e2f70b2c27b17f910291ab2f4", + "reference": "8974a1213be42c3e2f70b2c27b17f910291ab2f4", "shasum": "" }, "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "conflict": { "zendframework/zend-stdlib": "*" }, "require-dev": { - "laminas/laminas-coding-standard": "^2.5", - "phpbench/phpbench": "^1.2.15", - "phpunit/phpunit": "^10.5.8", - "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.20.0" + "laminas/laminas-coding-standard": "^3.0", + "phpbench/phpbench": "^1.3.1", + "phpunit/phpunit": "^10.5.38", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.26.1" }, "type": "library", "autoload": { @@ -2678,20 +2481,20 @@ "type": "community_bridge" } ], - "time": "2024-01-19T12:39:49+00:00" + "time": "2024-10-29T13:46:07+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.12.0", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + "reference": "024473a478be9df5fdaca2c793f2232fe788e414" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", + "reference": "024473a478be9df5fdaca2c793f2232fe788e414", "shasum": "" }, "require": { @@ -2730,7 +2533,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" }, "funding": [ { @@ -2738,20 +2541,20 @@ "type": "tidelift" } ], - "time": "2024-06-12T14:39:25+00:00" + "time": "2025-02-12T12:17:51+00:00" }, { "name": "nikic/php-parser", - "version": "v5.1.0", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" + "reference": "447a020a1f875a434d62f2a401f53b82a396e494" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", - "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494", "shasum": "" }, "require": { @@ -2794,9 +2597,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" }, - "time": "2024-07-01T20:03:41+00:00" + "time": "2024-12-30T11:07:19+00:00" }, { "name": "phar-io/manifest", @@ -2918,20 +2721,20 @@ }, { "name": "phpstan/phpstan", - "version": "1.11.7", + "version": "2.1.12", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "52d2bbfdcae7f895915629e4694e9497d0f8e28d" + "reference": "96dde49e967c0c22812bcfa7bda4ff82c09f3b0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/52d2bbfdcae7f895915629e4694e9497d0f8e28d", - "reference": "52d2bbfdcae7f895915629e4694e9497d0f8e28d", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/96dde49e967c0c22812bcfa7bda4ff82c09f3b0c", + "reference": "96dde49e967c0c22812bcfa7bda4ff82c09f3b0c", "shasum": "" }, "require": { - "php": "^7.2|^8.0" + "php": "^7.4|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" @@ -2972,39 +2775,39 @@ "type": "github" } ], - "time": "2024-07-06T11:17:41+00:00" + "time": "2025-04-16T13:19:18+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "11.0.5", + "version": "11.0.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "19b6365ab8b59a64438c0c3f4241feeb480c9861" + "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/19b6365ab8b59a64438c0c3f4241feeb480c9861", - "reference": "19b6365ab8b59a64438c0c3f4241feeb480c9861", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/14d63fbcca18457e49c6f8bebaa91a87e8e188d7", + "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.0", + "nikic/php-parser": "^5.4.0", "php": ">=8.2", - "phpunit/php-file-iterator": "^5.0", - "phpunit/php-text-template": "^4.0", - "sebastian/code-unit-reverse-lookup": "^4.0", - "sebastian/complexity": "^4.0", - "sebastian/environment": "^7.0", - "sebastian/lines-of-code": "^3.0", - "sebastian/version": "^5.0", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^11.5.2" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -3013,7 +2816,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "11.0-dev" + "dev-main": "11.0.x-dev" } }, "autoload": { @@ -3042,7 +2845,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.5" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.9" }, "funding": [ { @@ -3050,20 +2853,20 @@ "type": "github" } ], - "time": "2024-07-03T05:05:37+00:00" + "time": "2025-02-25T13:26:39+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "5.0.1", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "6ed896bf50bbbfe4d504a33ed5886278c78e4a26" + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6ed896bf50bbbfe4d504a33ed5886278c78e4a26", - "reference": "6ed896bf50bbbfe4d504a33ed5886278c78e4a26", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", "shasum": "" }, "require": { @@ -3103,7 +2906,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" }, "funding": [ { @@ -3111,7 +2914,7 @@ "type": "github" } ], - "time": "2024-07-03T05:06:37+00:00" + "time": "2024-08-27T05:02:59+00:00" }, { "name": "phpunit/php-invoker", @@ -3299,16 +3102,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.2.7", + "version": "11.5.17", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "15c7e69dec4a8f246840859e6b430bd2abeb5039" + "reference": "fd2e863a2995cdfd864fb514b5e0b28b09895b5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/15c7e69dec4a8f246840859e6b430bd2abeb5039", - "reference": "15c7e69dec4a8f246840859e6b430bd2abeb5039", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fd2e863a2995cdfd864fb514b5e0b28b09895b5c", + "reference": "fd2e863a2995cdfd864fb514b5e0b28b09895b5c", "shasum": "" }, "require": { @@ -3318,25 +3121,26 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.0", + "myclabs/deep-copy": "^1.13.0", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.5", - "phpunit/php-file-iterator": "^5.0.1", + "phpunit/php-code-coverage": "^11.0.9", + "phpunit/php-file-iterator": "^5.1.0", "phpunit/php-invoker": "^5.0.1", "phpunit/php-text-template": "^4.0.1", "phpunit/php-timer": "^7.0.1", "sebastian/cli-parser": "^3.0.2", - "sebastian/code-unit": "^3.0.1", - "sebastian/comparator": "^6.0.1", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.1", "sebastian/diff": "^6.0.2", "sebastian/environment": "^7.2.0", - "sebastian/exporter": "^6.1.3", + "sebastian/exporter": "^6.3.0", "sebastian/global-state": "^7.0.2", "sebastian/object-enumerator": "^6.0.1", - "sebastian/type": "^5.0.1", - "sebastian/version": "^5.0.1" + "sebastian/type": "^5.1.2", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files" @@ -3347,7 +3151,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "11.2-dev" + "dev-main": "11.5-dev" } }, "autoload": { @@ -3379,7 +3183,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.2.7" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.17" }, "funding": [ { @@ -3395,7 +3199,7 @@ "type": "tidelift" } ], - "time": "2024-07-10T11:50:09+00:00" + "time": "2025-04-08T07:59:11+00:00" }, { "name": "psr/event-dispatcher", @@ -3521,33 +3325,33 @@ }, { "name": "react/child-process", - "version": "v0.6.5", + "version": "v0.6.6", "source": { "type": "git", "url": "https://github.com/reactphp/child-process.git", - "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43" + "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", - "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159", + "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159", "shasum": "" }, "require": { "evenement/evenement": "^3.0 || ^2.0 || ^1.0", "php": ">=5.3.0", "react/event-loop": "^1.2", - "react/stream": "^1.2" + "react/stream": "^1.4" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", - "react/socket": "^1.8", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/socket": "^1.16", "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" }, "type": "library", "autoload": { "psr-4": { - "React\\ChildProcess\\": "src" + "React\\ChildProcess\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3584,19 +3388,15 @@ ], "support": { "issues": "https://github.com/reactphp/child-process/issues", - "source": "https://github.com/reactphp/child-process/tree/v0.6.5" + "source": "https://github.com/reactphp/child-process/tree/v0.6.6" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-09-16T13:41:56+00:00" + "time": "2025-01-01T16:37:48+00:00" }, { "name": "react/dns", @@ -3821,31 +3621,31 @@ }, { "name": "react/socket", - "version": "v1.15.0", + "version": "v1.16.0", "source": { "type": "git", "url": "https://github.com/reactphp/socket.git", - "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038" + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/216d3aec0b87f04a40ca04f481e6af01bdd1d038", - "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038", + "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", "shasum": "" }, "require": { "evenement/evenement": "^3.0 || ^2.0 || ^1.0", "php": ">=5.3.0", - "react/dns": "^1.11", + "react/dns": "^1.13", "react/event-loop": "^1.2", - "react/promise": "^3 || ^2.6 || ^1.2.1", - "react/stream": "^1.2" + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" }, "require-dev": { "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/async": "^4 || ^3 || ^2", + "react/async": "^4.3 || ^3.3 || ^2", "react/promise-stream": "^1.4", - "react/promise-timer": "^1.10" + "react/promise-timer": "^1.11" }, "type": "library", "autoload": { @@ -3889,7 +3689,7 @@ ], "support": { "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.15.0" + "source": "https://github.com/reactphp/socket/tree/v1.16.0" }, "funding": [ { @@ -3897,7 +3697,7 @@ "type": "open_collective" } ], - "time": "2023-12-15T11:02:10+00:00" + "time": "2024-07-26T10:38:09+00:00" }, { "name": "react/stream", @@ -4036,23 +3836,23 @@ }, { "name": "sebastian/code-unit", - "version": "3.0.1", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "6bb7d09d6623567178cf54126afa9c2310114268" + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/6bb7d09d6623567178cf54126afa9c2310114268", - "reference": "6bb7d09d6623567178cf54126afa9c2310114268", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^11.5" }, "type": "library", "extra": { @@ -4081,7 +3881,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", "security": "https://github.com/sebastianbergmann/code-unit/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" }, "funding": [ { @@ -4089,7 +3889,7 @@ "type": "github" } ], - "time": "2024-07-03T04:44:28+00:00" + "time": "2025-03-19T07:56:08+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -4149,16 +3949,16 @@ }, { "name": "sebastian/comparator", - "version": "6.0.1", + "version": "6.3.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "131942b86d3587291067a94f295498ab6ac79c20" + "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/131942b86d3587291067a94f295498ab6ac79c20", - "reference": "131942b86d3587291067a94f295498ab6ac79c20", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/24b8fbc2c8e201bb1308e7b05148d6ab393b6959", + "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959", "shasum": "" }, "require": { @@ -4169,12 +3969,15 @@ "sebastian/exporter": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "6.3-dev" } }, "autoload": { @@ -4214,7 +4017,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.1" }, "funding": [ { @@ -4222,7 +4025,7 @@ "type": "github" } ], - "time": "2024-07-03T04:48:07+00:00" + "time": "2025-03-07T06:57:01+00:00" }, { "name": "sebastian/complexity", @@ -4415,16 +4218,16 @@ }, { "name": "sebastian/exporter", - "version": "6.1.3", + "version": "6.3.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e" + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e", - "reference": "c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", "shasum": "" }, "require": { @@ -4433,7 +4236,7 @@ "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^11.2" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { @@ -4481,7 +4284,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/6.1.3" + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" }, "funding": [ { @@ -4489,7 +4292,7 @@ "type": "github" } ], - "time": "2024-07-03T04:56:19+00:00" + "time": "2024-12-05T09:17:50+00:00" }, { "name": "sebastian/global-state", @@ -4791,28 +4594,28 @@ }, { "name": "sebastian/type", - "version": "5.0.1", + "version": "5.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "fb6a6566f9589e86661291d13eba708cce5eb4aa" + "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb6a6566f9589e86661291d13eba708cce5eb4aa", - "reference": "fb6a6566f9589e86661291d13eba708cce5eb4aa", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", + "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -4836,7 +4639,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/type/tree/5.1.2" }, "funding": [ { @@ -4844,20 +4647,20 @@ "type": "github" } ], - "time": "2024-07-03T05:11:49+00:00" + "time": "2025-03-18T13:35:50+00:00" }, { "name": "sebastian/version", - "version": "5.0.1", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "45c9debb7d039ce9b97de2f749c2cf5832a06ac4" + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/45c9debb7d039ce9b97de2f749c2cf5832a06ac4", - "reference": "45c9debb7d039ce9b97de2f749c2cf5832a06ac4", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", "shasum": "" }, "require": { @@ -4890,7 +4693,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/version/issues", "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" }, "funding": [ { @@ -4898,20 +4701,72 @@ "type": "github" } ], - "time": "2024-07-03T05:13:08+00:00" + "time": "2024-10-09T05:16:32+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" }, { "name": "symfony/cache", - "version": "v7.1.2", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "e933e1d947ffb88efcdd34a2bd51561cab7deaae" + "reference": "9131e3018872d2ebb6fe8a9a4d6631273513d42c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/e933e1d947ffb88efcdd34a2bd51561cab7deaae", - "reference": "e933e1d947ffb88efcdd34a2bd51561cab7deaae", + "url": "https://api.github.com/repos/symfony/cache/zipball/9131e3018872d2ebb6fe8a9a4d6631273513d42c", + "reference": "9131e3018872d2ebb6fe8a9a4d6631273513d42c", "shasum": "" }, "require": { @@ -4939,6 +4794,7 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/clock": "^6.4|^7.0", "symfony/config": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/filesystem": "^6.4|^7.0", @@ -4979,7 +4835,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.1.2" + "source": "https://github.com/symfony/cache/tree/v7.2.5" }, "funding": [ { @@ -4995,20 +4851,20 @@ "type": "tidelift" } ], - "time": "2024-06-11T13:32:38+00:00" + "time": "2025-03-25T15:54:33+00:00" }, { "name": "symfony/cache-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197" + "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197", - "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b", + "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b", "shasum": "" }, "require": { @@ -5017,12 +4873,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -5055,7 +4911,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.1" }, "funding": [ { @@ -5071,20 +4927,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.1.1", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", "shasum": "" }, "require": { @@ -5135,7 +4991,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" }, "funding": [ { @@ -5151,20 +5007,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", "shasum": "" }, "require": { @@ -5173,12 +5029,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -5211,7 +5067,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" }, "funding": [ { @@ -5227,20 +5083,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/filesystem", - "version": "v7.1.2", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "92a91985250c251de9b947a14bb2c9390b1a562c" + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/92a91985250c251de9b947a14bb2c9390b1a562c", - "reference": "92a91985250c251de9b947a14bb2c9390b1a562c", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", "shasum": "" }, "require": { @@ -5277,7 +5133,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.1.2" + "source": "https://github.com/symfony/filesystem/tree/v7.2.0" }, "funding": [ { @@ -5293,20 +5149,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T10:03:55+00:00" + "time": "2024-10-25T15:15:23+00:00" }, { "name": "symfony/finder", - "version": "v7.1.1", + "version": "v7.2.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6" + "reference": "87a71856f2f56e4100373e92529eed3171695cfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/fbb0ba67688b780efbc886c1a0a0948dcf7205d6", - "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6", + "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb", + "reference": "87a71856f2f56e4100373e92529eed3171695cfb", "shasum": "" }, "require": { @@ -5341,7 +5197,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.1.1" + "source": "https://github.com/symfony/finder/tree/v7.2.2" }, "funding": [ { @@ -5357,20 +5213,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-12-30T19:00:17+00:00" }, { "name": "symfony/options-resolver", - "version": "v7.1.1", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55" + "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55", - "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50", "shasum": "" }, "require": { @@ -5408,7 +5264,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.1.1" + "source": "https://github.com/symfony/options-resolver/tree/v7.2.0" }, "funding": [ { @@ -5424,30 +5280,30 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-11-20T11:17:29+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "v1.30.0", + "name": "symfony/polyfill-php80", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af", - "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -5455,7 +5311,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" + "Symfony\\Polyfill\\Php80\\": "" }, "classmap": [ "Resources/stubs" @@ -5466,6 +5322,10 @@ "MIT" ], "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -5475,7 +5335,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -5484,7 +5344,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -5500,32 +5360,41 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/process", - "version": "v7.1.1", + "name": "symfony/polyfill-php81", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "febf90124323a093c7ee06fdb30e765ca3c20028" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/febf90124323a093c7ee06fdb30e765ca3c20028", - "reference": "febf90124323a093c7ee06fdb30e765ca3c20028", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=7.2" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Process\\": "" + "Symfony\\Polyfill\\Php81\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -5534,18 +5403,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Executes commands in sub-processes", + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/process/tree/v7.1.1" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" }, "funding": [ { @@ -5561,30 +5436,29 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/stopwatch", - "version": "v7.1.1", + "name": "symfony/process", + "version": "v7.2.5", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d" + "url": "https://github.com/symfony/process.git", + "reference": "87b7c93e57df9d8e39a093d32587702380ff045d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", - "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d", + "reference": "87b7c93e57df9d8e39a093d32587702380ff045d", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/service-contracts": "^2.5|^3" + "php": ">=8.2" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" + "Symfony\\Component\\Process\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5604,10 +5478,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a way to profile code", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.1.1" + "source": "https://github.com/symfony/process/tree/v7.2.5" }, "funding": [ { @@ -5623,34 +5497,30 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2025-03-13T12:21:46+00:00" }, { - "name": "symfony/var-exporter", - "version": "v7.1.2", + "name": "symfony/stopwatch", + "version": "v7.2.4", "source": { "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "b80a669a2264609f07f1667f891dbfca25eba44c" + "url": "https://github.com/symfony/stopwatch.git", + "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b80a669a2264609f07f1667f891dbfca25eba44c", - "reference": "b80a669a2264609f07f1667f891dbfca25eba44c", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", + "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", "shasum": "" }, "require": { - "php": ">=8.2" - }, - "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\VarExporter\\": "" + "Symfony\\Component\\Stopwatch\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5662,28 +5532,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "description": "Provides a way to profile code", "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.1.2" + "source": "https://github.com/symfony/stopwatch/tree/v7.2.4" }, "funding": [ { @@ -5699,7 +5559,7 @@ "type": "tidelift" } ], - "time": "2024-06-28T08:00:31+00:00" + "time": "2025-02-24T10:49:57+00:00" }, { "name": "theseer/tokenizer", @@ -5766,6 +5626,6 @@ "platform": { "php": "^8.2" }, - "platform-dev": [], + "platform-dev": {}, "plugin-api-version": "2.6.0" } diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index f4d41ae..5916a08 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -1,6 +1,235 @@ parameters: ignoreErrors: - - message: "#^Method GraphQL\\\\Doctrine\\\\Types\\:\\:getOperator\\(\\) should return GraphQL\\\\Doctrine\\\\Definition\\\\Operator\\\\AbstractOperator but returns GraphQL\\\\Type\\\\Definition\\\\NamedType&GraphQL\\\\Type\\\\Definition\\\\Type\\.$#" + message: '#^Parameter \#1 \$isNot of method GraphQL\\Doctrine\\Definition\\Operator\\AbstractSimpleOperator\:\:getDqlOperator\(\) expects bool, mixed given\.$#' + identifier: argument.type + count: 1 + path: src/Definition/Operator/AbstractSimpleOperator.php + + - + message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: src/DocBlockReader.php + + - + message: '#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable + count: 3 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Binary operation "\." between non\-falsy\-string and mixed results in an error\.$#' + identifier: binaryOp.invalid + count: 1 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Cannot access offset ''conditions'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 3 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Cannot access offset ''emptyStringAsHighest'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Cannot access offset ''field'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 2 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Cannot access offset ''joins'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 3 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Cannot access offset ''nullAsHighest'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Cannot access offset ''order'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 4 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Cannot access offset ''type'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Parameter \#1 \$group of method GraphQL\\Doctrine\\Factory\\FilteredQueryBuilderFactory\:\:applyCollectedDqlConditions\(\) expects array, mixed given\.$#' + identifier: argument.type + count: 1 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Parameter \#1 \$name of method GraphQL\\Type\\Definition\\InputObjectType\:\:getField\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 2 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Parameter \#2 \$name of method GraphQL\\Doctrine\\Factory\\Type\\SortingTypeFactory\:\:getCustomSorting\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Parameter \#2 \$order of method Doctrine\\ORM\\QueryBuilder\:\:addOrderBy\(\) expects string\|null, mixed given\.$#' + identifier: argument.type + count: 3 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Parameter \#3 \$joinType of method GraphQL\\Doctrine\\Factory\\FilteredQueryBuilderFactory\:\:createJoin\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Parameter \#4 \$joins of method GraphQL\\Doctrine\\Factory\\FilteredQueryBuilderFactory\:\:applyJoinsAndFilters\(\) expects array, mixed given\.$#' + identifier: argument.type + count: 2 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Parameter \#5 \$conditions of method GraphQL\\Doctrine\\Factory\\FilteredQueryBuilderFactory\:\:applyJoinsAndFilters\(\) expects array, mixed given\.$#' + identifier: argument.type + count: 2 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Parameter \#5 \$field of method GraphQL\\Doctrine\\Definition\\Operator\\AbstractOperator\:\:getDqlCondition\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Parameter \#5 \$order of callable GraphQL\\Doctrine\\Sorting\\SortingInterface expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Parameter \#6 \$args of method GraphQL\\Doctrine\\Definition\\Operator\\AbstractOperator\:\:getDqlCondition\(\) expects array\|null, mixed given\.$#' + identifier: argument.type + count: 1 + path: src/Factory/FilteredQueryBuilderFactory.php + + - + message: '#^Parameter \#3 \$subject of function preg_replace expects array\\|string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: src/Factory/Type/AbstractTypeFactory.php + + - + message: '#^PHPDoc tag @var with type GraphQL\\Type\\Definition\\LeafType is not subtype of native type GraphQL\\Type\\Definition\\NamedType&GraphQL\\Type\\Definition\\Type\.$#' + identifier: varTag.nativeType + count: 3 + path: src/Factory/Type/FilterGroupConditionTypeFactory.php + + - + message: '#^Parameter \#1 \$property of method GraphQL\\Doctrine\\Factory\\AbstractFactory\:\:isPropertyExcluded\(\) expects ReflectionProperty, ReflectionProperty\|null given\.$#' + identifier: argument.type + count: 1 + path: src/Factory/Type/FilterGroupConditionTypeFactory.php + + - + message: '#^Parameter \#1 \$property of method GraphQL\\Doctrine\\Factory\\Type\\FilterGroupConditionTypeFactory\:\:getLeafType\(\) expects ReflectionProperty, ReflectionProperty\|null given\.$#' + identifier: argument.type + count: 1 + path: src/Factory/Type/FilterGroupConditionTypeFactory.php + + - + message: '#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable + count: 1 + path: src/Factory/Type/PartialInputTypeFactory.php + + - + message: '#^Cannot access offset ''defaultValue'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: src/Factory/Type/PartialInputTypeFactory.php + + - + message: '#^Cannot access offset ''type'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: src/Factory/Type/PartialInputTypeFactory.php + + - + message: '#^Property GraphQL\\Type\\Definition\\InputObjectType\:\:\$config \(array\{name\?\: string\|null, description\?\: string\|null, fields\: \(callable\(\)\: iterable\\)\|iterable\, parseValue\?\: callable\(array\\)\: mixed, astNode\?\: GraphQL\\Language\\AST\\InputObjectTypeDefinitionNode\|null, extensionASTNodes\?\: array\\|null\}\) does not accept array\{name\?\: string\|null, description\?\: string\|null, fields\: Closure\(\)\: list, parseValue\?\: callable\(array\\)\: mixed, astNode\?\: GraphQL\\Language\\AST\\InputObjectTypeDefinitionNode\|null, extensionASTNodes\?\: array\\|null\}\.$#' + identifier: assign.propertyType + count: 1 + path: src/Factory/Type/PartialInputTypeFactory.php + + - + message: '#^Parameter \#1 \$property of method GraphQL\\Doctrine\\Factory\\AbstractFactory\:\:isPropertyExcluded\(\) expects ReflectionProperty, ReflectionProperty\|null given\.$#' + identifier: argument.type + count: 1 + path: src/Factory/Type/SortingTypeFactory.php + + - + message: '#^Match arm comparison between '''' and '''' is always true\.$#' + identifier: match.alwaysTrue count: 1 path: src/Types.php + + - + message: '#^Method GraphQL\\Doctrine\\Types\:\:getOperator\(\) should return GraphQL\\Doctrine\\Definition\\Operator\\AbstractOperator but returns GraphQL\\Type\\Definition\\NamedType&GraphQL\\Type\\Definition\\Type\.$#' + identifier: return.type + count: 1 + path: src/Types.php + + - + message: '#^Binary operation "\." between mixed and '' LIKE \:'' results in an error\.$#' + identifier: binaryOp.invalid + count: 1 + path: tests/Blog/Filtering/SearchOperatorType.php + + - + message: '#^Cannot cast mixed to string\.$#' + identifier: cast.string + count: 1 + path: tests/Blog/Filtering/SearchOperatorType.php + + - + message: '#^Call to static method PHPUnit\\Framework\\Assert\:\:assertTrue\(\) with true and ''passed validation…'' will always evaluate to true\.$#' + identifier: staticMethod.alreadyNarrowedType + count: 1 + path: tests/TypesTest.php + + - + message: '#^Cannot access offset ''filter'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: tests/TypesTest.php + + - + message: '#^Cannot access offset ''sorting'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: tests/TypesTest.php + + - + message: '#^Parameter \#2 \$filter of method GraphQL\\Doctrine\\Types\:\:createFilteredQueryBuilder\(\) expects array, mixed given\.$#' + identifier: argument.type + count: 1 + path: tests/TypesTest.php + + - + message: '#^Parameter \#3 \$sorting of method GraphQL\\Doctrine\\Types\:\:createFilteredQueryBuilder\(\) expects array, mixed given\.$#' + identifier: argument.type + count: 1 + path: tests/TypesTest.php diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 538a6ef..a2a6125 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -9,7 +9,6 @@ parameters: ignoreErrors: - '~^Parameter #2 \$type of static method GraphQL\\Doctrine\\Utils::getOperatorTypeName~' - '~^Parameter #1 \$method of method GraphQL\\Doctrine\\Factory\\AbstractFieldsConfigurationFactory\:\:getMethodFullName\(\) expects ReflectionMethod, ReflectionFunctionAbstract given\.$~' - - '~^Parameter #3 \$subject of function preg_replace expects array\|string, string\|null given\.$~' - '~^Parameter #2 \$type of method GraphQL\\Doctrine\\Factory\\AbstractFactory::adjustNamespace\(\) expects string, string\|null given\.$~' - '~^Parameter #1 \$driver of method Doctrine\\Persistence\\Mapping\\Driver\\MappingDriverChain\:\:setDefaultDriver\(\) expects Doctrine\\Persistence\\Mapping\\Driver\\MappingDriver, Doctrine\\Persistence\\Mapping\\Driver\\MappingDriver\|null given\.$~' - '~^Parameter \#1 \$type of static method GraphQL\\Type\\Definition\\Type\:\:nonNull\(\) expects~' @@ -19,6 +18,8 @@ parameters: identifier: missingType.iterableValue - identifier: missingType.generics + - + identifier: function.alreadyNarrowedType includes: - phpstan-baseline.neon diff --git a/src/Attribute/Field.php b/src/Attribute/Field.php index 7e97da1..11dcda5 100644 --- a/src/Attribute/Field.php +++ b/src/Attribute/Field.php @@ -16,6 +16,9 @@ #[Attribute(Attribute::TARGET_METHOD)] final class Field implements ApiAttribute { + /** + * @var Argument[] + */ public array $args = []; public null|string|Type $type = null; diff --git a/src/Attribute/Reader/Reader.php b/src/Attribute/Reader/Reader.php index af25212..6299729 100644 --- a/src/Attribute/Reader/Reader.php +++ b/src/Attribute/Reader/Reader.php @@ -78,8 +78,6 @@ private function getAttributeInstances(ReflectionClass|ReflectionMethod|Reflecti foreach ($attributes as $attribute) { $instance = $attribute->newInstance(); - assert($instance instanceof ApiAttribute); - $instances[] = $instance; } diff --git a/src/Definition/Operator/EmptyOperatorType.php b/src/Definition/Operator/EmptyOperatorType.php index 76deb7e..6efb51a 100644 --- a/src/Definition/Operator/EmptyOperatorType.php +++ b/src/Definition/Operator/EmptyOperatorType.php @@ -32,7 +32,7 @@ protected function getSingleValuedDqlCondition(UniqueNameFactory $uniqueNameFact return $null->getDqlCondition($uniqueNameFactory, $metadata, $queryBuilder, $alias, $field, $args); } - protected function getCollectionValuedDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string + protected function getCollectionValuedDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): string { $not = $args['not'] ? 'NOT ' : ''; diff --git a/src/Definition/Operator/HaveOperatorType.php b/src/Definition/Operator/HaveOperatorType.php index bda4c9f..17b9318 100644 --- a/src/Definition/Operator/HaveOperatorType.php +++ b/src/Definition/Operator/HaveOperatorType.php @@ -5,7 +5,7 @@ namespace GraphQL\Doctrine\Definition\Operator; use Doctrine\ORM\Mapping\ClassMetadata; -use Doctrine\ORM\Mapping\ClassMetadataInfo; +use Doctrine\ORM\Mapping\OneToManyAssociationMapping; use Doctrine\ORM\QueryBuilder; use GraphQL\Doctrine\Factory\UniqueNameFactory; use GraphQL\Type\Definition\LeafType; @@ -37,7 +37,7 @@ protected function getSingleValuedDqlCondition(UniqueNameFactory $uniqueNameFact return $in->getDqlCondition($uniqueNameFactory, $metadata, $queryBuilder, $alias, $field, $args); } - protected function getCollectionValuedDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string + protected function getCollectionValuedDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): string { $association = $metadata->associationMappings[$field]; $values = $uniqueNameFactory->createParameterName(); @@ -48,12 +48,12 @@ protected function getCollectionValuedDqlCondition(UniqueNameFactory $uniqueName // use `=`, and not `IN()`). So we simulate an approximation of MEMBER OF that support multiple values. But it // does **not** support composite identifiers. And that is fine because it is an official limitation of this // library anyway. - if ($association['type'] === ClassMetadataInfo::ONE_TO_MANY) { + if ($association instanceof OneToManyAssociationMapping) { $id = $metadata->identifier[0]; - $otherClassName = $association['targetEntity']; + $otherClassName = $association->targetEntity; $otherAlias = $uniqueNameFactory->createAliasName($otherClassName); - $otherField = $association['mappedBy']; + $otherField = $association->mappedBy; $otherMetadata = $queryBuilder->getEntityManager()->getClassMetadata($otherClassName); $otherId = $otherMetadata->identifier[0]; diff --git a/src/Factory/AbstractFieldsConfigurationFactory.php b/src/Factory/AbstractFieldsConfigurationFactory.php index 7b914bb..92c7ab3 100644 --- a/src/Factory/AbstractFieldsConfigurationFactory.php +++ b/src/Factory/AbstractFieldsConfigurationFactory.php @@ -147,8 +147,8 @@ private function findIdentityField(string $className): void { $this->metadata = $this->entityManager->getClassMetadata($className); foreach ($this->metadata->fieldMappings as $meta) { - if ($meta['id'] ?? false) { - $this->identityField = $meta['fieldName']; + if ($meta->id ?? false) { + $this->identityField = $meta->fieldName; } } } @@ -184,7 +184,7 @@ final protected function isIdentityField(string $fieldName): bool */ private function getTargetEntity(string $fieldName): ?string { - return $this->metadata->associationMappings[$fieldName]['targetEntity'] ?? null; + return $this->metadata->associationMappings[$fieldName]->targetEntity ?? null; } /** diff --git a/src/Factory/FilteredQueryBuilderFactory.php b/src/Factory/FilteredQueryBuilderFactory.php index a673642..39d44a4 100644 --- a/src/Factory/FilteredQueryBuilderFactory.php +++ b/src/Factory/FilteredQueryBuilderFactory.php @@ -127,7 +127,7 @@ private function applyJoins(ClassMetadata $metadata, array $joins, string $alias $joinedAlias = $this->createJoin($alias, $field, $join['type']); if (isset($join['joins']) || isset($join['conditions'])) { - $targetClassName = $metadata->getAssociationMapping($field)['targetEntity']; + $targetClassName = $metadata->getAssociationMapping($field)->targetEntity; $targetMetadata = $this->entityManager->getClassMetadata($targetClassName); $type = $this->types->getFilterGroupCondition($targetClassName); $this->applyJoinsAndFilters($targetMetadata, $joinedAlias, $type, $join['joins'] ?? [], $join['conditions'] ?? []); diff --git a/src/Factory/OutputFieldsConfigurationFactory.php b/src/Factory/OutputFieldsConfigurationFactory.php index 1cd69b6..c1bfbf1 100644 --- a/src/Factory/OutputFieldsConfigurationFactory.php +++ b/src/Factory/OutputFieldsConfigurationFactory.php @@ -26,7 +26,7 @@ protected function getMethodPattern(): string /** * Get the entire configuration for a method. */ - protected function methodToConfiguration(ReflectionMethod $method): ?array + protected function methodToConfiguration(ReflectionMethod $method): array { // Get a field from attribute, or an empty one $field = $this->reader->getAttribute($method, Field::class) ?? new Field(); diff --git a/src/Factory/Type/FilterGroupConditionTypeFactory.php b/src/Factory/Type/FilterGroupConditionTypeFactory.php index 2bf7461..3fde991 100644 --- a/src/Factory/Type/FilterGroupConditionTypeFactory.php +++ b/src/Factory/Type/FilterGroupConditionTypeFactory.php @@ -4,6 +4,7 @@ namespace GraphQL\Doctrine\Factory\Type; +use Doctrine\ORM\Mapping\FieldMapping; use GraphQL\Doctrine\Attribute\Filter; use GraphQL\Doctrine\Attribute\FilterGroupCondition; use GraphQL\Doctrine\Definition\Operator\AbstractOperator; @@ -60,7 +61,7 @@ public function create(string $className, string $typeName): InputObjectType // Get all scalar fields foreach ($metadata->fieldMappings as $mapping) { - $fieldName = $mapping['fieldName']; + $fieldName = $mapping->fieldName; $property = $metadata->getReflectionProperty($fieldName); // Skip exclusion specified by user @@ -76,7 +77,7 @@ public function create(string $className, string $typeName): InputObjectType // Get all collection fields foreach ($metadata->associationMappings as $mapping) { - $fieldName = $mapping['fieldName']; + $fieldName = $mapping->fieldName; $operators = $this->getOperators($fieldName, Type::id(), true, $metadata->isCollectionValuedAssociation($fieldName)); $filters[] = $this->getFieldConfiguration($typeName, $fieldName, $operators); @@ -105,9 +106,9 @@ public function create(string $className, string $typeName): InputObjectType /** * Read the type of the filterGroupCondition, either from Doctrine mapping type, or the override via attribute. */ - private function getLeafType(ReflectionProperty $property, array $mapping): LeafType + private function getLeafType(ReflectionProperty $property, FieldMapping $mapping): LeafType { - if ($mapping['id'] ?? false) { + if ($mapping->id ?? false) { return Type::id(); } @@ -127,7 +128,7 @@ private function getLeafType(ReflectionProperty $property, array $mapping): Leaf } /** @var LeafType $leafType */ - $leafType = $this->types->get($mapping['type']); + $leafType = $this->types->get($mapping->type); return $leafType; } diff --git a/src/Factory/Type/FilterGroupJoinTypeFactory.php b/src/Factory/Type/FilterGroupJoinTypeFactory.php index ddb0a2e..b743a60 100644 --- a/src/Factory/Type/FilterGroupJoinTypeFactory.php +++ b/src/Factory/Type/FilterGroupJoinTypeFactory.php @@ -60,8 +60,8 @@ private function getJoinsFields(string $className): array $associations = $this->entityManager->getClassMetadata($className)->associationMappings; foreach ($associations as $association) { $field = [ - 'name' => $association['fieldName'], - 'type' => $this->types->getJoinOn($association['targetEntity']), + 'name' => $association->fieldName, + 'type' => $this->types->getJoinOn($association->targetEntity), ]; $fields[] = $field; diff --git a/src/Factory/Type/PartialInputTypeFactory.php b/src/Factory/Type/PartialInputTypeFactory.php index 332e12f..2025cb6 100644 --- a/src/Factory/Type/PartialInputTypeFactory.php +++ b/src/Factory/Type/PartialInputTypeFactory.php @@ -6,7 +6,6 @@ use GraphQL\Type\Definition\InputObjectType; use GraphQL\Type\Definition\NonNull; -use GraphQL\Type\Definition\Type; /** * A factory to create an InputObjectType from a Doctrine entity but with @@ -24,12 +23,12 @@ final class PartialInputTypeFactory extends AbstractTypeFactory public function create(string $className, string $typeName): InputObjectType { $type = clone $this->types->getInput($className); - /** @var callable $fieldsGetter */ $fieldsGetter = $type->config['fields']; $optionalFieldsGetter = function () use ($fieldsGetter): array { $optionalFields = []; - foreach ($fieldsGetter() as $field) { + $fields = is_callable($fieldsGetter) ? $fieldsGetter() : $fieldsGetter; + foreach ($fields as $field) { if ($field['type'] instanceof NonNull) { $field['type'] = $field['type']->getWrappedType(); } diff --git a/src/Factory/Type/SortingTypeFactory.php b/src/Factory/Type/SortingTypeFactory.php index 5204cb3..8f8d7bd 100644 --- a/src/Factory/Type/SortingTypeFactory.php +++ b/src/Factory/Type/SortingTypeFactory.php @@ -132,7 +132,7 @@ private function fillCache(string $className): void /** * Get all instance of custom sorting from the attribute. * - * @return SortingInterface[] + * @return array */ private function getFromAttribute(ReflectionClass $class): array { diff --git a/tests/Blog/Filtering/SearchOperatorType.php b/tests/Blog/Filtering/SearchOperatorType.php index f4488a9..8e4ca86 100644 --- a/tests/Blog/Filtering/SearchOperatorType.php +++ b/tests/Blog/Filtering/SearchOperatorType.php @@ -65,8 +65,8 @@ private function getSearchableFields(ClassMetadata $metadata, string $alias): ar $fields = []; $textType = ['string', 'text']; foreach ($metadata->fieldMappings as $g) { - if (in_array($g['type'], $textType, true)) { - $fields[] = $alias . '.' . $g['fieldName']; + if (in_array($g->type, $textType, true)) { + $fields[] = $alias . '.' . $g->fieldName; } } diff --git a/tests/Blog/Model/Special/ArrayOfEntity.php b/tests/Blog/Model/Special/ArrayOfEntity.php index 82471e2..6d8a89a 100644 --- a/tests/Blog/Model/Special/ArrayOfEntity.php +++ b/tests/Blog/Model/Special/ArrayOfEntity.php @@ -21,7 +21,7 @@ public function getUsers(): array } /** - * @return Collection + * @return Collection */ public function getOtherUsers(): Collection { diff --git a/tests/EntityManagerTrait.php b/tests/EntityManagerTrait.php index 6634904..f1d18c7 100644 --- a/tests/EntityManagerTrait.php +++ b/tests/EntityManagerTrait.php @@ -18,7 +18,10 @@ trait EntityManagerTrait private function setUpEntityManager(): void { $config = ORMSetup::createAttributeMetadataConfiguration([__DIR__ . '/Blog/Model'], true); - $connection = DriverManager::getConnection(['url' => 'sqlite:///:memory:']); + $connection = DriverManager::getConnection([ + 'driver' => 'sqlite3', + 'memory' => true, + ]); $this->entityManager = new EntityManager($connection, $config); } diff --git a/tests/data/PostFilter.graphqls b/tests/data/PostFilter.graphqls index a87b322..23ca54c 100644 --- a/tests/data/PostFilter.graphqls +++ b/tests/data/PostFilter.graphqls @@ -34,17 +34,91 @@ enum LogicalOperator { "Type to specify conditions on fields" input PostFilterGroupCondition { + id: PostFilterGroupConditionId creationDate: PostFilterGroupConditionCreationDate title: PostFilterGroupConditionTitle body: PostFilterGroupConditionBody publicationDate: PostFilterGroupConditionPublicationDate status: PostFilterGroupConditionStatus - id: PostFilterGroupConditionId user: PostFilterGroupConditionUser noInversedBy: PostFilterGroupConditionNoInversedBy custom: PostFilterGroupConditionCustom } +"Type to specify a condition on a specific field" +input PostFilterGroupConditionId { + like: LikeOperatorID + between: BetweenOperatorID + equal: EqualOperatorID + greater: GreaterOperatorID + greaterOrEqual: GreaterOrEqualOperatorID + in: InOperatorID + less: LessOperatorID + lessOrEqual: LessOrEqualOperatorID + null: NullOperatorID + group: GroupOperatorID + modulo: ModuloOperatorInt +} + +input LikeOperatorID { + value: ID! + not: Boolean = false +} + +input BetweenOperatorID { + from: ID! + to: ID! + not: Boolean = false +} + +input EqualOperatorID { + value: ID! + not: Boolean = false +} + +input GreaterOperatorID { + value: ID! + not: Boolean = false +} + +input GreaterOrEqualOperatorID { + value: ID! + not: Boolean = false +} + +input InOperatorID { + values: [ID!]! + not: Boolean = false +} + +input LessOperatorID { + value: ID! + not: Boolean = false +} + +input LessOrEqualOperatorID { + value: ID! + not: Boolean = false +} + +input NullOperatorID { + not: Boolean = false +} + +""" +Will apply a `GROUP BY` on the field to select unique values existing in database. + +This is typically useful to present a list of suggestions to the end-user, while still allowing him to enter arbitrary values. +""" +input GroupOperatorID { + "This field is never used and can be ignored" + value: Boolean = null +} + +input ModuloOperatorInt { + value: Int! +} + "Type to specify a condition on a specific field" input PostFilterGroupConditionCreationDate { like: LikeOperatorDateTime @@ -287,80 +361,6 @@ input GroupOperatorPostStatus { value: Boolean = null } -"Type to specify a condition on a specific field" -input PostFilterGroupConditionId { - like: LikeOperatorID - between: BetweenOperatorID - equal: EqualOperatorID - greater: GreaterOperatorID - greaterOrEqual: GreaterOrEqualOperatorID - in: InOperatorID - less: LessOperatorID - lessOrEqual: LessOrEqualOperatorID - null: NullOperatorID - group: GroupOperatorID - modulo: ModuloOperatorInt -} - -input LikeOperatorID { - value: ID! - not: Boolean = false -} - -input BetweenOperatorID { - from: ID! - to: ID! - not: Boolean = false -} - -input EqualOperatorID { - value: ID! - not: Boolean = false -} - -input GreaterOperatorID { - value: ID! - not: Boolean = false -} - -input GreaterOrEqualOperatorID { - value: ID! - not: Boolean = false -} - -input InOperatorID { - values: [ID!]! - not: Boolean = false -} - -input LessOperatorID { - value: ID! - not: Boolean = false -} - -input LessOrEqualOperatorID { - value: ID! - not: Boolean = false -} - -input NullOperatorID { - not: Boolean = false -} - -""" -Will apply a `GROUP BY` on the field to select unique values existing in database. - -This is typically useful to present a list of suggestions to the end-user, while still allowing him to enter arbitrary values. -""" -input GroupOperatorID { - "This field is never used and can be ignored" - value: Boolean = null -} - -input ModuloOperatorInt { - value: Int! -} - "Type to specify a condition on a specific field" input PostFilterGroupConditionUser { have: HaveOperatorID @@ -435,16 +435,31 @@ enum JoinType { "Type to specify conditions on fields" input UserFilterGroupCondition { + id: UserFilterGroupConditionId creationDate: UserFilterGroupConditionCreationDate name: UserFilterGroupConditionName email: UserFilterGroupConditionEmail isAdministrator: UserFilterGroupConditionIsAdministrator - id: UserFilterGroupConditionId posts: UserFilterGroupConditionPosts favoritePosts: UserFilterGroupConditionFavoritePosts manager: UserFilterGroupConditionManager } +"Type to specify a condition on a specific field" +input UserFilterGroupConditionId { + like: LikeOperatorID + between: BetweenOperatorID + equal: EqualOperatorID + greater: GreaterOperatorID + greaterOrEqual: GreaterOrEqualOperatorID + in: InOperatorID + less: LessOperatorID + lessOrEqual: LessOrEqualOperatorID + null: NullOperatorID + group: GroupOperatorID + modulo: ModuloOperatorInt +} + "Type to specify a condition on a specific field" input UserFilterGroupConditionCreationDate { like: LikeOperatorDateTime @@ -556,21 +571,6 @@ input GroupOperatorBoolean { value: Boolean = null } -"Type to specify a condition on a specific field" -input UserFilterGroupConditionId { - like: LikeOperatorID - between: BetweenOperatorID - equal: EqualOperatorID - greater: GreaterOperatorID - greaterOrEqual: GreaterOrEqualOperatorID - in: InOperatorID - less: LessOperatorID - lessOrEqual: LessOrEqualOperatorID - null: NullOperatorID - group: GroupOperatorID - modulo: ModuloOperatorInt -} - "Type to specify a condition on a specific field" input UserFilterGroupConditionPosts { have: HaveOperatorID @@ -624,22 +624,8 @@ input JoinOnNoInversedBy { "Type to specify conditions on fields" input NoInversedByFilterGroupCondition { - creationDate: NoInversedByFilterGroupConditionCreationDate id: NoInversedByFilterGroupConditionId -} - -"Type to specify a condition on a specific field" -input NoInversedByFilterGroupConditionCreationDate { - like: LikeOperatorDateTime - between: BetweenOperatorDateTime - equal: EqualOperatorDateTime - greater: GreaterOperatorDateTime - greaterOrEqual: GreaterOrEqualOperatorDateTime - in: InOperatorDateTime - less: LessOperatorDateTime - lessOrEqual: LessOrEqualOperatorDateTime - null: NullOperatorDateTime - group: GroupOperatorDateTime + creationDate: NoInversedByFilterGroupConditionCreationDate } "Type to specify a condition on a specific field" @@ -656,3 +642,17 @@ input NoInversedByFilterGroupConditionId { group: GroupOperatorID modulo: ModuloOperatorInt } + +"Type to specify a condition on a specific field" +input NoInversedByFilterGroupConditionCreationDate { + like: LikeOperatorDateTime + between: BetweenOperatorDateTime + equal: EqualOperatorDateTime + greater: GreaterOperatorDateTime + greaterOrEqual: GreaterOrEqualOperatorDateTime + in: InOperatorDateTime + less: LessOperatorDateTime + lessOrEqual: LessOrEqualOperatorDateTime + null: NullOperatorDateTime + group: GroupOperatorDateTime +} diff --git a/tests/data/PostSorting.graphqls b/tests/data/PostSorting.graphqls index dda957b..4a5615f 100644 --- a/tests/data/PostSorting.graphqls +++ b/tests/data/PostSorting.graphqls @@ -19,12 +19,12 @@ input PostSorting { "Fields available for `PostSorting`" enum PostSortingField { + id creationDate title body publicationDate status - id userName postType pseudoRandom diff --git a/tests/data/UserSorting.graphqls b/tests/data/UserSorting.graphqls index 969a29f..962ea07 100644 --- a/tests/data/UserSorting.graphqls +++ b/tests/data/UserSorting.graphqls @@ -19,11 +19,11 @@ input UserSorting { "Fields available for `UserSorting`" enum UserSortingField { + id creationDate name email isAdministrator - id pseudoRandom } From 533612b03b99f79b54009927c7a5cedeefa4ae35 Mon Sep 17 00:00:00 2001 From: Adrien Crivelli Date: Tue, 22 Apr 2025 23:07:22 +0900 Subject: [PATCH 2/3] Support native enums in Filters #10257 If the custom types container is correctly configured to be able to create a `\GraphQL\Type\Definition\EnumType` matching the FQCN of a PHP native enum, then `graphql-doctrine` will be able to use PHP native enum in output, input and filters. --- .../Type/FilterGroupConditionTypeFactory.php | 2 +- tests/Blog/Enum/Status.php | 12 + tests/Blog/Model/Special/EnumSupport.php | 26 ++ tests/FilterTypesTest.php | 8 +- tests/InputTypesTest.php | 6 + tests/OutputTypesTest.php | 6 + tests/TypesTrait.php | 17 ++ tests/data/EnumSupport.graphqls | 5 + tests/data/EnumSupportFilter.graphqls | 257 ++++++++++++++++++ tests/data/EnumSupportInput.graphqls | 4 + 10 files changed, 341 insertions(+), 2 deletions(-) create mode 100644 tests/Blog/Enum/Status.php create mode 100644 tests/Blog/Model/Special/EnumSupport.php create mode 100644 tests/data/EnumSupport.graphqls create mode 100644 tests/data/EnumSupportFilter.graphqls create mode 100644 tests/data/EnumSupportInput.graphqls diff --git a/src/Factory/Type/FilterGroupConditionTypeFactory.php b/src/Factory/Type/FilterGroupConditionTypeFactory.php index 3fde991..c288d19 100644 --- a/src/Factory/Type/FilterGroupConditionTypeFactory.php +++ b/src/Factory/Type/FilterGroupConditionTypeFactory.php @@ -128,7 +128,7 @@ private function getLeafType(ReflectionProperty $property, FieldMapping $mapping } /** @var LeafType $leafType */ - $leafType = $this->types->get($mapping->type); + $leafType = $this->types->get($mapping->enumType ?? $mapping->type); return $leafType; } diff --git a/tests/Blog/Enum/Status.php b/tests/Blog/Enum/Status.php new file mode 100644 index 0000000..4ee2ffd --- /dev/null +++ b/tests/Blog/Enum/Status.php @@ -0,0 +1,12 @@ +status; + } + + public function setStatus(Status $status): void + { + $this->status = $status; + } +} diff --git a/tests/FilterTypesTest.php b/tests/FilterTypesTest.php index b67d2d7..a118a52 100644 --- a/tests/FilterTypesTest.php +++ b/tests/FilterTypesTest.php @@ -7,6 +7,7 @@ use Exception; use GraphQL\Type\Definition\Type; use GraphQLTests\Doctrine\Blog\Model\Post; +use GraphQLTests\Doctrine\Blog\Model\Special\EnumSupport; use GraphQLTests\Doctrine\Blog\Model\Special\InvalidFilter; use GraphQLTests\Doctrine\Blog\Model\Special\InvalidFilterGroupCondition; use GraphQLTests\Doctrine\Blog\Model\Special\ModelWithTraits; @@ -20,7 +21,6 @@ final class FilterTypesTest extends TestCase public function testCanGetPostFilter(): void { $actual = $this->types->getFilter(Post::class); - $this->assertAllTypes('tests/data/PostFilter.graphqls', $actual); } @@ -30,6 +30,12 @@ public function testCanInheritFilterFromTraits(): void $this->assertAllTypes('tests/data/ModelWithTraitsFilter.graphqls', $actual); } + public function testCanUseNativeEnum(): void + { + $actual = $this->types->getFilter(EnumSupport::class); + $this->assertAllTypes('tests/data/EnumSupportFilter.graphqls', $actual); + } + public static function providerFilteredQueryBuilder(): array { $values = []; diff --git a/tests/InputTypesTest.php b/tests/InputTypesTest.php index a02ca17..6f1fac6 100644 --- a/tests/InputTypesTest.php +++ b/tests/InputTypesTest.php @@ -41,6 +41,12 @@ public function testSelfSupportInput(): void $this->assertType('tests/data/SelfSupportInput.graphqls', $actual); } + public function testEnumSupportInput(): void + { + $actual = $this->types->getInput(Blog\Model\Special\EnumSupport::class); + $this->assertType('tests/data/EnumSupportInput.graphqls', $actual); + } + public function testNamespaceSupportInput(): void { $actual = $this->types->getInput(Blog\Model\Special\NamespaceSupport::class); diff --git a/tests/OutputTypesTest.php b/tests/OutputTypesTest.php index a882cca..b9f11fe 100644 --- a/tests/OutputTypesTest.php +++ b/tests/OutputTypesTest.php @@ -55,6 +55,12 @@ public function testSelfSupportOutput(): void $this->assertType('tests/data/SelfSupport.graphqls', $actual); } + public function testEnumSupportOutput(): void + { + $actual = $this->types->getOutput(Blog\Model\Special\EnumSupport::class); + $this->assertType('tests/data/EnumSupport.graphqls', $actual); + } + public function testNamespaceSupportOutput(): void { $actual = $this->types->getOutput(Blog\Model\Special\NamespaceSupport::class); diff --git a/tests/TypesTrait.php b/tests/TypesTrait.php index 6e9c5fa..6c8258f 100644 --- a/tests/TypesTrait.php +++ b/tests/TypesTrait.php @@ -11,14 +11,18 @@ use GraphQL\Type\Definition\InputType; use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\OutputType; +use GraphQL\Type\Definition\PhpEnumType; use GraphQL\Type\Definition\Type; use GraphQL\Type\Definition\WrappingType; use GraphQL\Type\Schema; use GraphQL\Utils\SchemaPrinter; +use GraphQLTests\Doctrine\Blog\Enum\Status; use GraphQLTests\Doctrine\Blog\Types\CustomType; use GraphQLTests\Doctrine\Blog\Types\DateTimeType; use GraphQLTests\Doctrine\Blog\Types\PostStatusType; +use Laminas\ServiceManager\Factory\AbstractFactoryInterface; use Laminas\ServiceManager\ServiceManager; +use Psr\Container\ContainerInterface; use stdClass; /** @@ -44,6 +48,19 @@ public function setUp(): void 'aliases' => [ 'datetime_immutable' => DateTimeImmutable::class, // Declare alias for Doctrine type to be used for filters ], + 'abstract_factories' => [ + new class() implements AbstractFactoryInterface { + public function canCreate(ContainerInterface $container, string $requestedName): bool + { + return $requestedName === Status::class; + } + + public function __invoke(ContainerInterface $container, string $requestedName, ?array $options = null): PhpEnumType + { + return new PhpEnumType(Status::class); + } + }, + ], ]); $this->types = new Types($this->entityManager, $customTypes); diff --git a/tests/data/EnumSupport.graphqls b/tests/data/EnumSupport.graphqls new file mode 100644 index 0000000..56239b4 --- /dev/null +++ b/tests/data/EnumSupport.graphqls @@ -0,0 +1,5 @@ +type EnumSupport { + status: Status! + id: ID! + creationDate: DateTime! +} diff --git a/tests/data/EnumSupportFilter.graphqls b/tests/data/EnumSupportFilter.graphqls new file mode 100644 index 0000000..dc34461 --- /dev/null +++ b/tests/data/EnumSupportFilter.graphqls @@ -0,0 +1,257 @@ +schema { + query: query +} + +type query { + defaultField(defaultArg: EnumSupportFilter): Boolean +} + +"To be used as a filter for objects of type `EnumSupport`" +input EnumSupportFilter { + groups: [EnumSupportFilterGroup!] +} + +"Specify a set of joins and conditions to filter `EnumSupport`" +input EnumSupportFilterGroup { + "The logic operator to be used to append this group" + groupLogic: LogicalOperator = AND + + "The logic operator to be used within all conditions in this group" + conditionsLogic: LogicalOperator = AND + + "Conditions to be applied on fields" + conditions: [EnumSupportFilterGroupCondition!] +} + +"Logical operator to be used in conditions" +enum LogicalOperator { + AND + OR +} + +"Type to specify conditions on fields" +input EnumSupportFilterGroupCondition { + id: EnumSupportFilterGroupConditionId + creationDate: EnumSupportFilterGroupConditionCreationDate + status: EnumSupportFilterGroupConditionStatus +} + +"Type to specify a condition on a specific field" +input EnumSupportFilterGroupConditionId { + like: LikeOperatorID + between: BetweenOperatorID + equal: EqualOperatorID + greater: GreaterOperatorID + greaterOrEqual: GreaterOrEqualOperatorID + in: InOperatorID + less: LessOperatorID + lessOrEqual: LessOrEqualOperatorID + null: NullOperatorID + group: GroupOperatorID + modulo: ModuloOperatorInt +} + +input LikeOperatorID { + value: ID! + not: Boolean = false +} + +input BetweenOperatorID { + from: ID! + to: ID! + not: Boolean = false +} + +input EqualOperatorID { + value: ID! + not: Boolean = false +} + +input GreaterOperatorID { + value: ID! + not: Boolean = false +} + +input GreaterOrEqualOperatorID { + value: ID! + not: Boolean = false +} + +input InOperatorID { + values: [ID!]! + not: Boolean = false +} + +input LessOperatorID { + value: ID! + not: Boolean = false +} + +input LessOrEqualOperatorID { + value: ID! + not: Boolean = false +} + +input NullOperatorID { + not: Boolean = false +} + +""" +Will apply a `GROUP BY` on the field to select unique values existing in database. + +This is typically useful to present a list of suggestions to the end-user, while still allowing him to enter arbitrary values. +""" +input GroupOperatorID { + "This field is never used and can be ignored" + value: Boolean = null +} + +input ModuloOperatorInt { + value: Int! +} + +"Type to specify a condition on a specific field" +input EnumSupportFilterGroupConditionCreationDate { + like: LikeOperatorDateTime + between: BetweenOperatorDateTime + equal: EqualOperatorDateTime + greater: GreaterOperatorDateTime + greaterOrEqual: GreaterOrEqualOperatorDateTime + in: InOperatorDateTime + less: LessOperatorDateTime + lessOrEqual: LessOrEqualOperatorDateTime + null: NullOperatorDateTime + group: GroupOperatorDateTime +} + +input LikeOperatorDateTime { + value: DateTime! + not: Boolean = false +} + +scalar DateTime + +input BetweenOperatorDateTime { + from: DateTime! + to: DateTime! + not: Boolean = false +} + +input EqualOperatorDateTime { + value: DateTime! + not: Boolean = false +} + +input GreaterOperatorDateTime { + value: DateTime! + not: Boolean = false +} + +input GreaterOrEqualOperatorDateTime { + value: DateTime! + not: Boolean = false +} + +input InOperatorDateTime { + values: [DateTime!]! + not: Boolean = false +} + +input LessOperatorDateTime { + value: DateTime! + not: Boolean = false +} + +input LessOrEqualOperatorDateTime { + value: DateTime! + not: Boolean = false +} + +input NullOperatorDateTime { + not: Boolean = false +} + +""" +Will apply a `GROUP BY` on the field to select unique values existing in database. + +This is typically useful to present a list of suggestions to the end-user, while still allowing him to enter arbitrary values. +""" +input GroupOperatorDateTime { + "This field is never used and can be ignored" + value: Boolean = null +} + +"Type to specify a condition on a specific field" +input EnumSupportFilterGroupConditionStatus { + like: LikeOperatorStatus + between: BetweenOperatorStatus + equal: EqualOperatorStatus + greater: GreaterOperatorStatus + greaterOrEqual: GreaterOrEqualOperatorStatus + in: InOperatorStatus + less: LessOperatorStatus + lessOrEqual: LessOrEqualOperatorStatus + null: NullOperatorStatus + group: GroupOperatorStatus +} + +input LikeOperatorStatus { + value: Status! + not: Boolean = false +} + +enum Status { + New + Active + Archived +} + +input BetweenOperatorStatus { + from: Status! + to: Status! + not: Boolean = false +} + +input EqualOperatorStatus { + value: Status! + not: Boolean = false +} + +input GreaterOperatorStatus { + value: Status! + not: Boolean = false +} + +input GreaterOrEqualOperatorStatus { + value: Status! + not: Boolean = false +} + +input InOperatorStatus { + values: [Status!]! + not: Boolean = false +} + +input LessOperatorStatus { + value: Status! + not: Boolean = false +} + +input LessOrEqualOperatorStatus { + value: Status! + not: Boolean = false +} + +input NullOperatorStatus { + not: Boolean = false +} + +""" +Will apply a `GROUP BY` on the field to select unique values existing in database. + +This is typically useful to present a list of suggestions to the end-user, while still allowing him to enter arbitrary values. +""" +input GroupOperatorStatus { + "This field is never used and can be ignored" + value: Boolean = null +} diff --git a/tests/data/EnumSupportInput.graphqls b/tests/data/EnumSupportInput.graphqls new file mode 100644 index 0000000..68e50fe --- /dev/null +++ b/tests/data/EnumSupportInput.graphqls @@ -0,0 +1,4 @@ +input EnumSupportInput { + status: Status! + creationDate: DateTime! +} From 9ce071d70edb37b0119c12c1c8c1d1e8cf58c3b2 Mon Sep 17 00:00:00 2001 From: Adrien Crivelli Date: Thu, 24 Apr 2025 18:22:42 +0900 Subject: [PATCH 3/3] BREAKING operators cannot return null anymore #10257 Instead, return an empty string, which will have the same effect as returning null. Removing null removes the confusion semantics difference between null and empty string. There never was any difference, and null should never have been allowed. --- .../AbstractAssociationOperatorType.php | 8 ++--- src/Definition/Operator/AbstractOperator.php | 2 +- .../Operator/AbstractSimpleOperator.php | 4 +-- .../Operator/BetweenOperatorType.php | 4 +-- src/Definition/Operator/EmptyOperatorType.php | 2 +- src/Definition/Operator/GroupOperatorType.php | 4 +-- src/Definition/Operator/HaveOperatorType.php | 2 +- src/Definition/Operator/InOperatorType.php | 4 +-- src/Definition/Operator/NullOperatorType.php | 4 +-- tests/Blog/Filtering/ModuloOperatorType.php | 4 +-- tests/Blog/Filtering/SearchOperatorType.php | 6 ++-- tests/Definition/Operator/OperatorsTest.php | 34 +++++++++---------- 12 files changed, 39 insertions(+), 39 deletions(-) diff --git a/src/Definition/Operator/AbstractAssociationOperatorType.php b/src/Definition/Operator/AbstractAssociationOperatorType.php index 1f49303..37c94e4 100644 --- a/src/Definition/Operator/AbstractAssociationOperatorType.php +++ b/src/Definition/Operator/AbstractAssociationOperatorType.php @@ -10,10 +10,10 @@ abstract class AbstractAssociationOperatorType extends AbstractOperator { - final public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string + final public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): string { if ($args === null) { - return null; + return ''; } if ($metadata->isSingleValuedAssociation($field)) { @@ -23,7 +23,7 @@ final public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, Clas return $this->getCollectionValuedDqlCondition($uniqueNameFactory, $metadata, $queryBuilder, $alias, $field, $args); } - abstract protected function getSingleValuedDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string; + abstract protected function getSingleValuedDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): string; - abstract protected function getCollectionValuedDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string; + abstract protected function getCollectionValuedDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): string; } diff --git a/src/Definition/Operator/AbstractOperator.php b/src/Definition/Operator/AbstractOperator.php index 1d90a12..066be1e 100644 --- a/src/Definition/Operator/AbstractOperator.php +++ b/src/Definition/Operator/AbstractOperator.php @@ -62,5 +62,5 @@ abstract protected function getConfiguration(LeafType $leafType): array; * @param string $field the field for the entity on which to apply the filter * @param null|array $args all arguments specific to this operator as declared in its configuration */ - abstract public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string; + abstract public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): string; } diff --git a/src/Definition/Operator/AbstractSimpleOperator.php b/src/Definition/Operator/AbstractSimpleOperator.php index 34e5841..c2d5d78 100644 --- a/src/Definition/Operator/AbstractSimpleOperator.php +++ b/src/Definition/Operator/AbstractSimpleOperator.php @@ -33,10 +33,10 @@ final protected function getConfiguration(LeafType $leafType): array ]; } - final public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string + final public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): string { if ($args === null) { - return null; + return ''; } $param = $uniqueNameFactory->createParameterName(); diff --git a/src/Definition/Operator/BetweenOperatorType.php b/src/Definition/Operator/BetweenOperatorType.php index a70eaae..8ad4584 100644 --- a/src/Definition/Operator/BetweenOperatorType.php +++ b/src/Definition/Operator/BetweenOperatorType.php @@ -32,10 +32,10 @@ protected function getConfiguration(LeafType $leafType): array ]; } - public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string + public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): string { if ($args === null) { - return null; + return ''; } $from = $uniqueNameFactory->createParameterName(); diff --git a/src/Definition/Operator/EmptyOperatorType.php b/src/Definition/Operator/EmptyOperatorType.php index 6efb51a..6caed68 100644 --- a/src/Definition/Operator/EmptyOperatorType.php +++ b/src/Definition/Operator/EmptyOperatorType.php @@ -25,7 +25,7 @@ protected function getConfiguration(LeafType $leafType): array ]; } - protected function getSingleValuedDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string + protected function getSingleValuedDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): string { $null = $this->types->getOperator(NullOperatorType::class, self::id()); diff --git a/src/Definition/Operator/GroupOperatorType.php b/src/Definition/Operator/GroupOperatorType.php index 929d64e..99e11ec 100644 --- a/src/Definition/Operator/GroupOperatorType.php +++ b/src/Definition/Operator/GroupOperatorType.php @@ -32,10 +32,10 @@ protected function getConfiguration(LeafType $leafType): array ]; } - public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string + public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): string { $queryBuilder->addGroupBy($alias . '.' . $field); - return null; + return ''; } } diff --git a/src/Definition/Operator/HaveOperatorType.php b/src/Definition/Operator/HaveOperatorType.php index 17b9318..b749196 100644 --- a/src/Definition/Operator/HaveOperatorType.php +++ b/src/Definition/Operator/HaveOperatorType.php @@ -30,7 +30,7 @@ protected function getConfiguration(LeafType $leafType): array ]; } - protected function getSingleValuedDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string + protected function getSingleValuedDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): string { $in = $this->types->getOperator(InOperatorType::class, self::id()); diff --git a/src/Definition/Operator/InOperatorType.php b/src/Definition/Operator/InOperatorType.php index 20df7da..d51274c 100644 --- a/src/Definition/Operator/InOperatorType.php +++ b/src/Definition/Operator/InOperatorType.php @@ -28,10 +28,10 @@ protected function getConfiguration(LeafType $leafType): array ]; } - public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string + public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): string { if ($args === null) { - return null; + return ''; } $values = $uniqueNameFactory->createParameterName(); diff --git a/src/Definition/Operator/NullOperatorType.php b/src/Definition/Operator/NullOperatorType.php index 71a785c..d1148e1 100644 --- a/src/Definition/Operator/NullOperatorType.php +++ b/src/Definition/Operator/NullOperatorType.php @@ -24,10 +24,10 @@ protected function getConfiguration(LeafType $leafType): array ]; } - public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string + public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): string { if ($args === null) { - return null; + return ''; } $not = $args['not'] ? 'NOT ' : ''; diff --git a/tests/Blog/Filtering/ModuloOperatorType.php b/tests/Blog/Filtering/ModuloOperatorType.php index 8390940..c17e814 100644 --- a/tests/Blog/Filtering/ModuloOperatorType.php +++ b/tests/Blog/Filtering/ModuloOperatorType.php @@ -25,10 +25,10 @@ protected function getConfiguration(LeafType $leafType): array ]; } - public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string + public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): string { if (!$args) { - return null; + return ''; } $param = $uniqueNameFactory->createParameterName(); diff --git a/tests/Blog/Filtering/SearchOperatorType.php b/tests/Blog/Filtering/SearchOperatorType.php index 8e4ca86..7514a5a 100644 --- a/tests/Blog/Filtering/SearchOperatorType.php +++ b/tests/Blog/Filtering/SearchOperatorType.php @@ -25,15 +25,15 @@ protected function getConfiguration(LeafType $leafType): array ]; } - public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string + public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): string { if (!$args) { - return null; + return ''; } $words = preg_split('/[[:space:]]+/', (string) $args['term'], -1, PREG_SPLIT_NO_EMPTY); if (!$words) { - return null; + return ''; } $fields = $this->getSearchableFields($metadata, $alias); diff --git a/tests/Definition/Operator/OperatorsTest.php b/tests/Definition/Operator/OperatorsTest.php index 37845c4..2df4443 100644 --- a/tests/Definition/Operator/OperatorsTest.php +++ b/tests/Definition/Operator/OperatorsTest.php @@ -32,7 +32,7 @@ final class OperatorsTest extends TestCase * @param class-string $className */ #[DataProvider('providerOperator')] - public function testOperator(?string $expected, string $className, ?array $args, string $field = 'field'): void + public function testOperator(string $expected, string $className, ?array $args, string $field = 'field'): void { $operator = new $className($this->types, Type::string()); $uniqueNameFactory = new UniqueNameFactory(); @@ -60,7 +60,7 @@ public static function providerOperator(): array { return [ [ - null, + '', BetweenOperatorType::class, null, ], @@ -82,7 +82,7 @@ public static function providerOperator(): array ], ], [ - null, + '', HaveOperatorType::class, null, 'posts', @@ -106,7 +106,7 @@ public static function providerOperator(): array 'posts', ], [ - null, + '', HaveOperatorType::class, null, 'manager', @@ -148,7 +148,7 @@ public static function providerOperator(): array 'favoritePosts', ], [ - null, + '', EmptyOperatorType::class, null, 'posts', @@ -170,7 +170,7 @@ public static function providerOperator(): array 'posts', ], [ - null, + '', EmptyOperatorType::class, null, 'manager', @@ -192,7 +192,7 @@ public static function providerOperator(): array 'manager', ], [ - null, + '', EqualOperatorType::class, null, ], @@ -213,7 +213,7 @@ public static function providerOperator(): array ], ], [ - null, + '', GreaterOperatorType::class, null, ], @@ -234,7 +234,7 @@ public static function providerOperator(): array ], ], [ - null, + '', GreaterOrEqualOperatorType::class, null, ], @@ -255,7 +255,7 @@ public static function providerOperator(): array ], ], [ - null, + '', InOperatorType::class, null, ], @@ -276,7 +276,7 @@ public static function providerOperator(): array ], ], [ - null, + '', LessOperatorType::class, null, ], @@ -297,7 +297,7 @@ public static function providerOperator(): array ], ], [ - null, + '', LessOrEqualOperatorType::class, null, ], @@ -318,7 +318,7 @@ public static function providerOperator(): array ], ], [ - null, + '', LikeOperatorType::class, null, ], @@ -339,7 +339,7 @@ public static function providerOperator(): array ], ], [ - null, + '', NullOperatorType::class, null, ], @@ -360,19 +360,19 @@ public static function providerOperator(): array ], ], [ - null, + '', GroupOperatorType::class, null, ], [ - null, + '', GroupOperatorType::class, [ 'value' => null, ], ], [ - null, + '', GroupOperatorType::class, [ 'value' => true,