diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 45bfe22..27d2a93 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -12,7 +12,7 @@ on: jobs: codestyle: - name: "Code Style" + name: "Rector + Code Style" runs-on: ubuntu-latest steps: @@ -22,11 +22,14 @@ jobs: - name: "Install PHP" uses: "shivammathur/setup-php@v2" with: - php-version: "8.1" + php-version: "8.2" - name: Install dependencies uses: ramsey/composer-install@v4 + - name: "Run Rector" + run: "vendor/bin/rector --dry-run" + - name: "Run PHP-CS-Fixer" run: "vendor/bin/php-cs-fixer fix --ansi --verbose --dry-run" @@ -62,10 +65,10 @@ jobs: strategy: matrix: php-version: - - "8.1" - "8.2" - "8.3" - "8.4" + - "8.5" deps: - "highest" codestyle: @@ -74,7 +77,7 @@ jobs: - php-version: "8.4" deps: "locked" codestyle: "true" - - php-version: "8.1" + - php-version: "8.2" deps: "lowest" codestyle: "false" diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 6c80af3..63276ff 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -5,45 +5,9 @@ * These rules will be added to default rules or will override them if the same key already exists. */ -$additionalRules = [ - '@PHP74Migration' => true, - '@PHP74Migration:risky' => true, - 'visibility_required' => true, - 'heredoc_indentation' => true, - 'heredoc_to_nowdoc' => true, - 'no_null_property_initialization' => true, - 'no_useless_else' => true, - 'no_useless_return' => true, - 'global_namespace_import' => [ - 'import_classes' => true, - 'import_constants' => true, - 'import_functions' => true, - ], - 'constant_case' => true, - 'declare_strict_types' => true, - 'indentation_type' => true, - 'no_superfluous_phpdoc_tags' => [ - 'allow_mixed' => true, - ], - 'phpdoc_line_span' => [ - 'const' => 'single', - 'method' => 'multi', - 'property' => 'single', - ], - 'phpdoc_trim_consecutive_blank_line_separation' => true, - // risky rules - 'fopen_flag_order' => true, - 'fopen_flags' => true, - 'ereg_to_preg' => true, - 'implode_call' => true, - 'no_unset_on_property' => true, - // custom - 'comment_to_phpdoc' => true, - 'phpdoc_to_comment' => false, -]; $rulesProvider = new Facile\CodingStandards\Rules\CompositeRulesProvider([ new Facile\CodingStandards\Rules\DefaultRulesProvider(), - new Facile\CodingStandards\Rules\ArrayRulesProvider($additionalRules), + new Facile\CodingStandards\Rules\RiskyRulesProvider(), ]); $config = new PhpCsFixer\Config(); diff --git a/composer.json b/composer.json index adfa230..8756889 100644 --- a/composer.json +++ b/composer.json @@ -12,6 +12,9 @@ "minimum-stability": "stable", "config": { "sort-packages": true, + "platform": { + "php": "8.2.99" + }, "allow-plugins": { "facile-it/facile-coding-standard": true, "laminas/laminas-component-installer": true, @@ -28,9 +31,9 @@ "identity" ], "require": { - "php": "^8.1", + "php": "^8.2", "ext-json": "*", - "facile-it/php-jose-verifier": "^0.5.0", + "facile-it/php-jose-verifier": "^1.0", "php-http/discovery": "^1.6", "psr/http-client": "^1.0", "psr/http-client-implementation": "^1.0", @@ -41,7 +44,7 @@ "psr/http-server-middleware": "^1.0", "spomky-labs/aes-key-wrap": "^7.0", "symfony/polyfill-php83": "^1.33", - "web-token/jwt-library": "^3.4.3" + "web-token/jwt-library": "^4.0" }, "autoload": { "files": [ @@ -66,7 +69,7 @@ }, "require-dev": { "dflydev/fig-cookies": "^2.0 || ^3.0", - "facile-it/facile-coding-standard": "^0.5.2 || ^1.0.0", + "facile-it/facile-coding-standard": "1.5.0", "friendsofphp/php-cs-fixer": "^3.0", "laminas/laminas-component-installer": "^2.1 || ^3.0", "laminas/laminas-config-aggregator": "^1.1", @@ -79,6 +82,7 @@ "phpspec/prophecy": "^1.10.3", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^10.5.60 || ^11.5.46 || ^12.0.0", + "rector/rector": "2.3.9", "symfony/console": "^4.3 || ^5.0 || ^6.0 || ^7.0 || ^8.0", "vimeo/psalm": "^6.14.3" }, @@ -88,13 +92,16 @@ "dflydev/fig-cookies": "To use the SessionCookieMiddleware" }, "scripts": { - "cs-check": "PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix --dry-run --diff --allow-risky=yes", - "cs-fix": "PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix --diff --allow-risky=yes", - "psalm": "psalm", - "test": "phpunit", - "test-coverage": "phpunit --coverage-text", + "rector-check": "vendor/bin/rector --dry-run", + "rector-fix": "vendor/bin/rector", + "cs-check": "PHP_CS_FIXER_IGNORE_ENV=1 vendor/bin/php-cs-fixer fix --dry-run --diff --allow-risky=yes", + "cs-fix": "PHP_CS_FIXER_IGNORE_ENV=1 vendor/bin/php-cs-fixer fix --diff --allow-risky=yes", + "psalm": "vendor/bin/psalm", + "test": "vendor/bin/phpunit", + "test-coverage": "vendor/bin/phpunit --coverage-text", "check": [ - "@cs-check", + "@rector-fix", + "@cs-fix", "@psalm", "@test" ] diff --git a/composer.lock b/composer.lock index 5d78c6d..1a182e8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,29 +4,28 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4d5a35ebb3a8b45b4affb90e99b4eba6", + "content-hash": "1b61f070c0c8e09ee6fb032ddc144ad6", "packages": [ { "name": "brick/math", - "version": "0.12.3", + "version": "0.17.2", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" + "reference": "8189e751995f9e15729c1aa2f89fa8f166ffe818" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", + "url": "https://api.github.com/repos/brick/math/zipball/8189e751995f9e15729c1aa2f89fa8f166ffe818", + "reference": "8189e751995f9e15729c1aa2f89fa8f166ffe818", "shasum": "" }, "require": { - "php": "^8.1" + "php": "^8.2" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^10.1", - "vimeo/psalm": "6.8.8" + "phpstan/phpstan": "2.1.22", + "phpunit/phpunit": "^11.5" }, "type": "library", "autoload": { @@ -56,7 +55,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.3" + "source": "https://github.com/brick/math/tree/0.17.2" }, "funding": [ { @@ -64,39 +63,42 @@ "type": "github" } ], - "time": "2025-02-28T13:11:00+00:00" + "time": "2026-05-25T20:34:43+00:00" }, { "name": "facile-it/php-jose-verifier", - "version": "0.5.0", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/facile-it/php-jose-verifier.git", - "reference": "513de20772b851c0518dd85588bdd65420a1e864" + "reference": "2fed59e21b28729c1fa57456ac129ffc2bc2c08e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facile-it/php-jose-verifier/zipball/513de20772b851c0518dd85588bdd65420a1e864", - "reference": "513de20772b851c0518dd85588bdd65420a1e864", + "url": "https://api.github.com/repos/facile-it/php-jose-verifier/zipball/2fed59e21b28729c1fa57456ac129ffc2bc2c08e", + "reference": "2fed59e21b28729c1fa57456ac129ffc2bc2c08e", "shasum": "" }, "require": { "ext-json": "*", "nyholm/psr7": "^1.8", - "php": "^8.1", + "php": "^8.2", + "psr/clock": "^1.0", "psr/http-client": "^1.0", "psr/http-message": "^1.0 || ^2.0", "psr/simple-cache": "^1.0 || ^2.0 || ^3.0", "spomky-labs/base64url": "^2.0.1", "symfony/http-client": "^6.0 || ^7.0 || ^8.0", "symfony/polyfill-mbstring": "^1.15", - "web-token/jwt-library": "^3.4" + "symfony/polyfill-php83": "^1.33", + "web-token/jwt-library": "^4.0" }, "require-dev": { - "facile-it/facile-coding-standard": "^1.4.1", + "facile-it/facile-coding-standard": "1.5.0", "friendsofphp/php-cs-fixer": "^3.92.3", "phpspec/prophecy-phpunit": "^2.0.1", "phpunit/phpunit": "^10.5.60 || ^11.5.46 || ^12.0.0", + "rector/rector": "2.3.9", "spomky-labs/aes-key-wrap": "^7.0", "vimeo/psalm": "^6.14.3" }, @@ -137,9 +139,9 @@ ], "support": { "issues": "https://github.com/facile-it/php-jose-verifier/issues", - "source": "https://github.com/facile-it/php-jose-verifier/tree/0.5.0" + "source": "https://github.com/facile-it/php-jose-verifier/tree/1.0.0" }, - "time": "2026-01-02T11:41:21+00:00" + "time": "2026-06-12T07:27:16+00:00" }, { "name": "nyholm/psr7", @@ -219,171 +221,6 @@ ], "time": "2024-09-09T07:06:30+00:00" }, - { - "name": "paragonie/constant_time_encoding", - "version": "v3.1.3", - "source": { - "type": "git", - "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", - "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", - "shasum": "" - }, - "require": { - "php": "^8" - }, - "require-dev": { - "infection/infection": "^0", - "nikic/php-fuzzer": "^0", - "phpunit/phpunit": "^9|^10|^11", - "vimeo/psalm": "^4|^5|^6" - }, - "type": "library", - "autoload": { - "psr-4": { - "ParagonIE\\ConstantTime\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com", - "role": "Maintainer" - }, - { - "name": "Steve 'Sc00bz' Thomas", - "email": "steve@tobtu.com", - "homepage": "https://www.tobtu.com", - "role": "Original Developer" - } - ], - "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", - "keywords": [ - "base16", - "base32", - "base32_decode", - "base32_encode", - "base64", - "base64_decode", - "base64_encode", - "bin2hex", - "encoding", - "hex", - "hex2bin", - "rfc4648" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/constant_time_encoding/issues", - "source": "https://github.com/paragonie/constant_time_encoding" - }, - "time": "2025-09-24T15:06:41+00:00" - }, - { - "name": "paragonie/sodium_compat", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/paragonie/sodium_compat.git", - "reference": "4714da6efdc782c06690bc72ce34fae7941c2d9f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/4714da6efdc782c06690bc72ce34fae7941c2d9f", - "reference": "4714da6efdc782c06690bc72ce34fae7941c2d9f", - "shasum": "" - }, - "require": { - "php": "^8.1", - "php-64bit": "*" - }, - "require-dev": { - "infection/infection": "^0", - "nikic/php-fuzzer": "^0", - "phpunit/phpunit": "^7|^8|^9|^10|^11", - "vimeo/psalm": "^4|^5|^6" - }, - "suggest": { - "ext-sodium": "Better performance, password hashing (Argon2i), secure memory management (memzero), and better security." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "files": [ - "autoload.php" - ], - "psr-4": { - "ParagonIE\\Sodium\\": "namespaced/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com" - }, - { - "name": "Frank Denis", - "email": "jedisct1@pureftpd.org" - } - ], - "description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists", - "keywords": [ - "Authentication", - "BLAKE2b", - "ChaCha20", - "ChaCha20-Poly1305", - "Chapoly", - "Curve25519", - "Ed25519", - "EdDSA", - "Edwards-curve Digital Signature Algorithm", - "Elliptic Curve Diffie-Hellman", - "Poly1305", - "Pure-PHP cryptography", - "RFC 7748", - "RFC 8032", - "Salpoly", - "Salsa20", - "X25519", - "XChaCha20-Poly1305", - "XSalsa20-Poly1305", - "Xchacha20", - "Xsalsa20", - "aead", - "cryptography", - "ecdh", - "elliptic curve", - "elliptic curve cryptography", - "encryption", - "libsodium", - "php", - "public-key cryptography", - "secret-key cryptography", - "side-channel resistant" - ], - "support": { - "issues": "https://github.com/paragonie/sodium_compat/issues", - "source": "https://github.com/paragonie/sodium_compat/tree/v2.5.0" - }, - "time": "2025-12-30T16:12:18+00:00" - }, { "name": "php-http/discovery", "version": "1.20.0", @@ -463,55 +300,6 @@ }, "time": "2024-10-02T11:20:13+00:00" }, - { - "name": "psr/cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" - }, - "time": "2021-02-03T23:26:27+00:00" - }, { "name": "psr/clock", "version": "1.0.0", @@ -1125,40 +913,41 @@ }, { "name": "spomky-labs/pki-framework", - "version": "1.4.1", + "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/pki-framework.git", - "reference": "f0e9a548df4e3942886adc9b7830581a46334631" + "reference": "aa576cbd07128075bef97ac2f8af9854e67513d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/f0e9a548df4e3942886adc9b7830581a46334631", - "reference": "f0e9a548df4e3942886adc9b7830581a46334631", + "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/aa576cbd07128075bef97ac2f8af9854e67513d8", + "reference": "aa576cbd07128075bef97ac2f8af9854e67513d8", "shasum": "" }, "require": { - "brick/math": "^0.10|^0.11|^0.12|^0.13|^0.14", + "brick/math": "^0.10|^0.11|^0.12|^0.13|^0.14|^0.15|^0.16|^0.17", "ext-mbstring": "*", - "php": ">=8.1" + "php": ">=8.1", + "psr/clock": "^1.0" }, "require-dev": { "ekino/phpstan-banned-code": "^1.0|^2.0|^3.0", "ext-gmp": "*", "ext-openssl": "*", - "infection/infection": "^0.28|^0.29|^0.31", + "infection/infection": "^0.28|^0.29|^0.31|^0.32", "php-parallel-lint/php-parallel-lint": "^1.3", "phpstan/extension-installer": "^1.3|^2.0", "phpstan/phpstan": "^1.8|^2.0", "phpstan/phpstan-deprecation-rules": "^1.0|^2.0", "phpstan/phpstan-phpunit": "^1.1|^2.0", "phpstan/phpstan-strict-rules": "^1.3|^2.0", - "phpunit/phpunit": "^10.1|^11.0|^12.0", + "phpunit/phpunit": "^10.1|^11.0|^12.0|^13.0", "rector/rector": "^1.0|^2.0", "roave/security-advisories": "dev-latest", "symfony/string": "^6.4|^7.0|^8.0", "symfony/var-dumper": "^6.4|^7.0|^8.0", - "symplify/easy-coding-standard": "^12.0" + "symplify/easy-coding-standard": "^12.0|^13.0" }, "suggest": { "ext-bcmath": "For better performance (or GMP)", @@ -1218,7 +1007,7 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/pki-framework/issues", - "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.4.1" + "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.4.2" }, "funding": [ { @@ -1230,118 +1019,20 @@ "type": "patreon" } ], - "time": "2025-12-20T12:57:40+00:00" - }, - { - "name": "symfony/console", - "version": "v6.4.31", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "f9f8a889f54c264f9abac3fc0f7a371ffca51997" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f9f8a889f54c264f9abac3fc0f7a371ffca51997", - "reference": "f9f8a889f54c264f9abac3fc0f7a371ffca51997", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0|^7.0" - }, - "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v6.4.31" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-12-22T08:30:34+00:00" + "time": "2026-03-23T22:56:56+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.6.0", + "version": "v3.7.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/50f59d1f3ca46d41ac911f97a78626b6756af35b", + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b", "shasum": "" }, "require": { @@ -1354,7 +1045,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -1379,7 +1070,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.0" }, "funding": [ { @@ -1390,29 +1081,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2026-04-13T15:52:40+00:00" }, { "name": "symfony/http-client", - "version": "v6.4.31", + "version": "v7.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "f166fe476c996237666bcf7ec2cf827cd82ad573" + "reference": "e8a112b8415707265a7e614278136a9d92989a6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/f166fe476c996237666bcf7ec2cf827cd82ad573", - "reference": "f166fe476c996237666bcf7ec2cf827cd82ad573", + "url": "https://api.github.com/repos/symfony/http-client/zipball/e8a112b8415707265a7e614278136a9d92989a6a", + "reference": "e8a112b8415707265a7e614278136a9d92989a6a", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-client-contracts": "~3.4.4|^3.5.2", @@ -1420,8 +1115,10 @@ "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "amphp/amp": "<2.5", + "amphp/socket": "<1.1", "php-http/discovery": "<1.15", - "symfony/http-foundation": "<6.3" + "symfony/http-foundation": "<6.4" }, "provide": { "php-http/async-client-implementation": "*", @@ -1430,19 +1127,20 @@ "symfony/http-client-implementation": "3.0" }, "require-dev": { - "amphp/amp": "^2.5", - "amphp/http-client": "^4.2.1", - "amphp/http-tunnel": "^1.0", - "amphp/socket": "^1.1", + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/amphp-http-client-meta": "^1.0|^2.0", + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -1473,7 +1171,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.31" + "source": "https://github.com/symfony/http-client/tree/v7.4.13" }, "funding": [ { @@ -1493,20 +1191,20 @@ "type": "tidelift" } ], - "time": "2025-12-23T14:19:38+00:00" + "time": "2026-05-24T09:57:54+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.6.0", + "version": "v3.7.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "75d7043853a42837e68111812f4d964b01e5101c" + "reference": "4a2d00c37651c0bdc2b9e1c773487a8bf4edb12d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", - "reference": "75d7043853a42837e68111812f4d964b01e5101c", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/4a2d00c37651c0bdc2b9e1c773487a8bf4edb12d", + "reference": "4a2d00c37651c0bdc2b9e1c773487a8bf4edb12d", "shasum": "" }, "require": { @@ -1519,7 +1217,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -1555,7 +1253,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.7.0" }, "funding": [ { @@ -1566,35 +1264,40 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-29T11:18:49+00:00" + "time": "2026-03-06T13:17:50+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.33.0", + "name": "symfony/polyfill-mbstring", + "version": "v1.38.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, "provide": { - "ext-ctype": "*" + "ext-mbstring": "*" }, "suggest": { - "ext-ctype": "For best performance" + "ext-mbstring": "For best performance" }, "type": "library", "extra": { @@ -1608,7 +1311,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" + "Symfony\\Polyfill\\Mbstring\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1617,24 +1320,25 @@ ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for ctype functions", + "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "ctype", + "mbstring", "polyfill", - "portable" + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" }, "funding": [ { @@ -1654,28 +1358,25 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-05-27T06:59:30+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", + "name": "symfony/polyfill-php83", + "version": "v1.38.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "796a26abb75ce49f3a84433cd81bf1009d73d5f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/796a26abb75ce49f3a84433cd81bf1009d73d5f8", + "reference": "796a26abb75ce49f3a84433cd81bf1009d73d5f8", "shasum": "" }, "require": { "php": ">=7.2" }, - "suggest": { - "ext-intl": "For best performance" - }, "type": "library", "extra": { "thanks": { @@ -1688,8 +1389,11 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1705,18 +1409,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "grapheme", - "intl", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.38.2" }, "funding": [ { @@ -1736,44 +1438,46 @@ "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2026-05-27T06:51:48+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "name": "symfony/service-contracts", + "version": "v3.7.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d25d82433a80eba6aa0e6c24b61d7370d99e444a", + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "suggest": { - "ext-intl": "For best performance" + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + "Symfony\\Contracts\\Service\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -1790,18 +1494,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", + "description": "Generic abstractions related to writing services", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.0" }, "funding": [ { @@ -1821,45 +1525,45 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-03-28T09:44:51+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "name": "web-token/jwt-library", + "version": "4.1.7", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "url": "https://github.com/web-token/jwt-library.git", + "reference": "fbcbf2c276d04d8b056f5c2957815abd5dfb704d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/web-token/jwt-library/zipball/fbcbf2c276d04d8b056f5c2957815abd5dfb704d", + "reference": "fbcbf2c276d04d8b056f5c2957815abd5dfb704d", "shasum": "" }, "require": { - "ext-iconv": "*", - "php": ">=7.2" + "brick/math": "^0.12|^0.13|^0.14|^0.15|^0.16|^0.17", + "php": ">=8.2", + "psr/clock": "^1.0", + "spomky-labs/pki-framework": "^1.2.1" }, - "provide": { - "ext-mbstring": "*" + "conflict": { + "spomky-labs/jose": "*" }, "suggest": { - "ext-mbstring": "For best performance" + "ext-bcmath": "GMP or BCMath is highly recommended to improve the library performance", + "ext-gmp": "GMP or BCMath is highly recommended to improve the library performance", + "ext-openssl": "For key management (creation, optimization, etc.) and some algorithms (AES, RSA, ECDSA, etc.)", + "ext-sodium": "Sodium is required for OKP key creation, EdDSA signature algorithm and ECDH-ES key encryption with OKP keys", + "paragonie/sodium_compat": "Sodium is required for OKP key creation, EdDSA signature algorithm and ECDH-ES key encryption with OKP keys", + "spomky-labs/aes-key-wrap": "For all Key Wrapping algorithms (AxxxKW, AxxxGCMKW, PBES2-HSxxx+AyyyKW...)", + "symfony/console": "Needed to use console commands", + "symfony/http-client": "To enable JKU/X5U support." }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" + "Jose\\Component\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1868,80 +1572,85 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Florent Morselli", + "homepage": "https://github.com/Spomky" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "All contributors", + "homepage": "https://github.com/web-token/jwt-framework/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", + "description": "JWT library", + "homepage": "https://github.com/web-token", "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" + "JOSE", + "JWE", + "JWK", + "JWKSet", + "JWS", + "Jot", + "RFC7515", + "RFC7516", + "RFC7517", + "RFC7518", + "RFC7519", + "RFC7520", + "bundle", + "jwa", + "jwt", + "symfony" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "issues": "https://github.com/web-token/jwt-library/issues", + "source": "https://github.com/web-token/jwt-library/tree/4.1.7" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/Spomky", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" } ], - "time": "2024-12-23T08:48:59+00:00" - }, + "time": "2026-06-06T18:12:39+00:00" + } + ], + "packages-dev": [ { - "name": "symfony/polyfill-php83", - "version": "v1.33.0", + "name": "amphp/amp", + "version": "v3.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + "url": "https://github.com/amphp/amp.git", + "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "url": "https://api.github.com/repos/amphp/amp/zipball/fa0ab33a6f47a82929c38d03ca47ebb71086a93f", + "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "5.23.1" }, + "type": "library", "autoload": { "files": [ - "bootstrap.php" + "src/functions.php", + "src/Future/functions.php", + "src/Internal/functions.php" ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "Amp\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1949,84 +1658,85 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", - "homepage": "https://symfony.com", + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v3.1.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/amphp", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2025-07-08T02:45:35+00:00" + "time": "2025-08-27T21:42:00+00:00" }, { - "name": "symfony/service-contracts", - "version": "v3.6.1", + "name": "amphp/byte-stream", + "version": "v2.1.2", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + "url": "https://github.com/amphp/byte-stream.git", + "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/55a6bd071aec26fa2a3e002618c20c35e3df1b46", + "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46", "shasum": "" }, "require": { + "amphp/amp": "^3", + "amphp/parser": "^1.1", + "amphp/pipeline": "^1", + "amphp/serialization": "^1", + "amphp/sync": "^2", "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" + "revolt/event-loop": "^1 || ^0.2.3" }, - "conflict": { - "ext-psr": "<1.1|>=2" + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.22.1" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.6-dev" - } - }, "autoload": { + "files": [ + "src/functions.php", + "src/Internal/functions.php" + ], "psr-4": { - "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] + "Amp\\ByteStream\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2034,88 +1744,68 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "https://amphp.org/byte-stream", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v2.1.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/amphp", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2025-07-15T11:30:57+00:00" + "time": "2025-03-16T17:10:27+00:00" }, { - "name": "symfony/string", - "version": "v6.4.30", + "name": "amphp/cache", + "version": "v2.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb" + "url": "https://github.com/amphp/cache.git", + "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb", + "url": "https://api.github.com/repos/amphp/cache/zipball/46912e387e6aa94933b61ea1ead9cf7540b7797c", + "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c", "shasum": "" }, "require": { + "amphp/amp": "^3", + "amphp/serialization": "^1", + "amphp/sync": "^2", "php": ">=8.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/translation-contracts": "<2.5" + "revolt/event-loop": "^1 || ^0.2" }, "require-dev": { - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/intl": "^6.2|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" }, "type": "library", "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Amp\\Cache\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2123,93 +1813,71 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Niklas Keller", + "email": "me@kelunik.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" } ], - "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": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], + "description": "A fiber-aware cache API based on Amp and Revolt.", + "homepage": "https://amphp.org/cache", "support": { - "source": "https://github.com/symfony/string/tree/v6.4.30" + "issues": "https://github.com/amphp/cache/issues", + "source": "https://github.com/amphp/cache/tree/v2.0.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/amphp", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2025-11-21T18:03:05+00:00" + "time": "2024-04-19T03:38:06+00:00" }, { - "name": "web-token/jwt-library", - "version": "3.4.9", + "name": "amphp/dns", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/web-token/jwt-library.git", - "reference": "8fe1650bf3a73673a9c520feff8f9a0e9cbbcd8f" + "url": "https://github.com/amphp/dns.git", + "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/web-token/jwt-library/zipball/8fe1650bf3a73673a9c520feff8f9a0e9cbbcd8f", - "reference": "8fe1650bf3a73673a9c520feff8f9a0e9cbbcd8f", + "url": "https://api.github.com/repos/amphp/dns/zipball/78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", + "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", "shasum": "" }, "require": { - "brick/math": "^0.9|^0.10|^0.11|^0.12", + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/cache": "^2", + "amphp/parser": "^1", + "amphp/process": "^2", + "daverandom/libdns": "^2.0.2", + "ext-filter": "*", "ext-json": "*", - "ext-mbstring": "*", - "paragonie/constant_time_encoding": "^2.6|^3.0", - "paragonie/sodium_compat": "^1.20|^2.0", "php": ">=8.1", - "psr/cache": "^2.0|^3.0", - "psr/clock": "^1.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "spomky-labs/pki-framework": "^1.2.1", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/polyfill-mbstring": "^1.12" - }, - "conflict": { - "spomky-labs/jose": "*" + "revolt/event-loop": "^1 || ^0.2" }, - "suggest": { - "ext-bcmath": "GMP or BCMath is highly recommended to improve the library performance", - "ext-gmp": "GMP or BCMath is highly recommended to improve the library performance", - "ext-openssl": "For key management (creation, optimization, etc.) and some algorithms (AES, RSA, ECDSA, etc.)", - "ext-sodium": "Sodium is required for OKP key creation, EdDSA signature algorithm and ECDH-ES key encryption with OKP keys", - "paragonie/sodium_compat": "Sodium is required for OKP key creation, EdDSA signature algorithm and ECDH-ES key encryption with OKP keys", - "spomky-labs/aes-key-wrap": "For all Key Wrapping algorithms (A128KW, A192KW, A256KW, A128GCMKW, A192GCMKW, A256GCMKW, PBES2-HS256+A128KW, PBES2-HS384+A192KW, PBES2-HS512+A256KW...)", - "symfony/http-client": "To enable JKU/X5U support." + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.20" }, "type": "library", "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Jose\\Component\\": "" + "Amp\\Dns\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2218,84 +1886,91 @@ ], "authors": [ { - "name": "Florent Morselli", - "homepage": "https://github.com/Spomky" + "name": "Chris Wright", + "email": "addr@daverandom.com" }, { - "name": "All contributors", - "homepage": "https://github.com/web-token/jwt-framework/contributors" + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" } ], - "description": "JWT library", - "homepage": "https://github.com/web-token", + "description": "Async DNS resolution for Amp.", + "homepage": "https://github.com/amphp/dns", "keywords": [ - "JOSE", - "JWE", - "JWK", - "JWKSet", - "JWS", - "Jot", - "RFC7515", - "RFC7516", - "RFC7517", - "RFC7518", - "RFC7519", - "RFC7520", - "bundle", - "jwa", - "jwt", - "symfony" + "amp", + "amphp", + "async", + "client", + "dns", + "resolve" ], "support": { - "issues": "https://github.com/web-token/jwt-library/issues", - "source": "https://github.com/web-token/jwt-library/tree/3.4.9" + "issues": "https://github.com/amphp/dns/issues", + "source": "https://github.com/amphp/dns/tree/v2.4.0" }, "funding": [ { - "url": "https://github.com/Spomky", + "url": "https://github.com/amphp", "type": "github" - }, - { - "url": "https://www.patreon.com/FlorentMorselli", - "type": "patreon" } ], - "time": "2025-11-17T20:20:37+00:00" - } - ], - "packages-dev": [ + "time": "2025-01-19T15:43:40+00:00" + }, { - "name": "amphp/amp", - "version": "v3.1.1", + "name": "amphp/parallel", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f" + "url": "https://github.com/amphp/parallel.git", + "reference": "37f5b2754fadc229c00f9416bd68fb8d04529a81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/fa0ab33a6f47a82929c38d03ca47ebb71086a93f", - "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f", + "url": "https://api.github.com/repos/amphp/parallel/zipball/37f5b2754fadc229c00f9416bd68fb8d04529a81", + "reference": "37f5b2754fadc229c00f9416bd68fb8d04529a81", "shasum": "" }, "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/cache": "^2", + "amphp/parser": "^1", + "amphp/pipeline": "^1", + "amphp/process": "^2", + "amphp/serialization": "^1", + "amphp/socket": "^2", + "amphp/sync": "^2", "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "revolt/event-loop": "^1" }, "require-dev": { "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", "phpunit/phpunit": "^9", - "psalm/phar": "5.23.1" + "psalm/phar": "6.16.1" }, "type": "library", "autoload": { "files": [ - "src/functions.php", - "src/Future/functions.php", - "src/Internal/functions.php" + "src/Context/functions.php", + "src/Context/Internal/functions.php", + "src/Ipc/functions.php", + "src/Worker/functions.php" ], "psr-4": { - "Amp\\": "src" + "Amp\\Parallel\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2307,35 +1982,27 @@ "name": "Aaron Piotrowski", "email": "aaron@trowski.com" }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, { "name": "Niklas Keller", "email": "me@kelunik.com" }, { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" + "name": "Stephen Coakley", + "email": "me@stephencoakley.com" } ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "https://amphp.org/amp", + "description": "Parallel processing component for Amp.", + "homepage": "https://github.com/amphp/parallel", "keywords": [ "async", "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" + "concurrent", + "multi-processing", + "multi-threading" ], "support": { - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v3.1.1" + "issues": "https://github.com/amphp/parallel/issues", + "source": "https://github.com/amphp/parallel/tree/v2.4.0" }, "funding": [ { @@ -2343,45 +2010,34 @@ "type": "github" } ], - "time": "2025-08-27T21:42:00+00:00" + "time": "2026-05-16T16:54:01+00:00" }, { - "name": "amphp/byte-stream", - "version": "v2.1.2", + "name": "amphp/parser", + "version": "v1.1.1", "source": { "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46" + "url": "https://github.com/amphp/parser.git", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/55a6bd071aec26fa2a3e002618c20c35e3df1b46", - "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46", + "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/parser": "^1.1", - "amphp/pipeline": "^1", - "amphp/serialization": "^1", - "amphp/sync": "^2", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2.3" + "php": ">=7.4" }, "require-dev": { "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", "phpunit/phpunit": "^9", - "psalm/phar": "5.22.1" + "psalm/phar": "^5.4" }, "type": "library", "autoload": { - "files": [ - "src/functions.php", - "src/Internal/functions.php" - ], "psr-4": { - "Amp\\ByteStream\\": "src" + "Amp\\Parser\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2398,19 +2054,17 @@ "email": "me@kelunik.com" } ], - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "https://amphp.org/byte-stream", + "description": "A generator parser to make streaming parsers simple.", + "homepage": "https://github.com/amphp/parser", "keywords": [ - "amp", - "amphp", "async", - "io", "non-blocking", + "parser", "stream" ], "support": { - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v2.1.2" + "issues": "https://github.com/amphp/parser/issues", + "source": "https://github.com/amphp/parser/tree/v1.1.1" }, "funding": [ { @@ -2418,39 +2072,37 @@ "type": "github" } ], - "time": "2025-03-16T17:10:27+00:00" + "time": "2024-03-21T19:16:53+00:00" }, { - "name": "amphp/cache", - "version": "v2.0.1", + "name": "amphp/pipeline", + "version": "v1.2.4", "source": { "type": "git", - "url": "https://github.com/amphp/cache.git", - "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c" + "url": "https://github.com/amphp/pipeline.git", + "reference": "a044733e080940d1483f56caff0c412ad6982776" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/cache/zipball/46912e387e6aa94933b61ea1ead9cf7540b7797c", - "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c", + "url": "https://api.github.com/repos/amphp/pipeline/zipball/a044733e080940d1483f56caff0c412ad6982776", + "reference": "a044733e080940d1483f56caff0c412ad6982776", "shasum": "" }, "require": { "amphp/amp": "^3", - "amphp/serialization": "^1", - "amphp/sync": "^2", "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "revolt/event-loop": "^1" }, "require-dev": { "amphp/php-cs-fixer-config": "^2", "amphp/phpunit-util": "^3", "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" + "psalm/phar": "6.16.1" }, "type": "library", "autoload": { "psr-4": { - "Amp\\Cache\\": "src" + "Amp\\Pipeline\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2458,24 +2110,28 @@ "MIT" ], "authors": [ - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, { "name": "Aaron Piotrowski", "email": "aaron@trowski.com" }, { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "A fiber-aware cache API based on Amp and Revolt.", - "homepage": "https://amphp.org/cache", + "description": "Asynchronous iterators and operators.", + "homepage": "https://amphp.org/pipeline", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "iterator", + "non-blocking" + ], "support": { - "issues": "https://github.com/amphp/cache/issues", - "source": "https://github.com/amphp/cache/tree/v2.0.1" + "issues": "https://github.com/amphp/pipeline/issues", + "source": "https://github.com/amphp/pipeline/tree/v1.2.4" }, "funding": [ { @@ -2483,31 +2139,26 @@ "type": "github" } ], - "time": "2024-04-19T03:38:06+00:00" + "time": "2026-05-06T05:37:57+00:00" }, { - "name": "amphp/dns", - "version": "v2.4.0", + "name": "amphp/process", + "version": "v2.1.0", "source": { "type": "git", - "url": "https://github.com/amphp/dns.git", - "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71" + "url": "https://github.com/amphp/process.git", + "reference": "583959df17d00304ad7b0b32285373f985935643" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/dns/zipball/78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", - "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", + "url": "https://api.github.com/repos/amphp/process/zipball/583959df17d00304ad7b0b32285373f985935643", + "reference": "583959df17d00304ad7b0b32285373f985935643", "shasum": "" }, "require": { "amphp/amp": "^3", "amphp/byte-stream": "^2", - "amphp/cache": "^2", - "amphp/parser": "^1", - "amphp/process": "^2", - "daverandom/libdns": "^2.0.2", - "ext-filter": "*", - "ext-json": "*", + "amphp/sync": "^2", "php": ">=8.1", "revolt/event-loop": "^1 || ^0.2" }, @@ -2515,7 +2166,7 @@ "amphp/php-cs-fixer-config": "^2", "amphp/phpunit-util": "^3", "phpunit/phpunit": "^9", - "psalm/phar": "5.20" + "psalm/phar": "6.16.1" }, "type": "library", "autoload": { @@ -2523,7 +2174,7 @@ "src/functions.php" ], "psr-4": { - "Amp\\Dns\\": "src" + "Amp\\Process\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2531,40 +2182,24 @@ "MIT" ], "authors": [ - { - "name": "Chris Wright", - "email": "addr@daverandom.com" - }, - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, { "name": "Bob Weinand", "email": "bobwei9@hotmail.com" }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, { "name": "Aaron Piotrowski", "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "Async DNS resolution for Amp.", - "homepage": "https://github.com/amphp/dns", - "keywords": [ - "amp", - "amphp", - "async", - "client", - "dns", - "resolve" - ], + "description": "A fiber-aware process manager based on Amp and Revolt.", + "homepage": "https://amphp.org/process", "support": { - "issues": "https://github.com/amphp/dns/issues", - "source": "https://github.com/amphp/dns/tree/v2.4.0" + "issues": "https://github.com/amphp/process/issues", + "source": "https://github.com/amphp/process/tree/v2.1.0" }, "funding": [ { @@ -2572,51 +2207,39 @@ "type": "github" } ], - "time": "2025-01-19T15:43:40+00:00" + "time": "2026-05-31T15:11:55+00:00" }, { - "name": "amphp/parallel", - "version": "v2.3.3", + "name": "amphp/serialization", + "version": "v1.1.0", "source": { "type": "git", - "url": "https://github.com/amphp/parallel.git", - "reference": "296b521137a54d3a02425b464e5aee4c93db2c60" + "url": "https://github.com/amphp/serialization.git", + "reference": "fdf2834d78cebb0205fb2672676c1b1eb84371f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/parallel/zipball/296b521137a54d3a02425b464e5aee4c93db2c60", - "reference": "296b521137a54d3a02425b464e5aee4c93db2c60", + "url": "https://api.github.com/repos/amphp/serialization/zipball/fdf2834d78cebb0205fb2672676c1b1eb84371f0", + "reference": "fdf2834d78cebb0205fb2672676c1b1eb84371f0", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/cache": "^2", - "amphp/parser": "^1", - "amphp/pipeline": "^1", - "amphp/process": "^2", - "amphp/serialization": "^1", - "amphp/socket": "^2", - "amphp/sync": "^2", - "php": ">=8.1", - "revolt/event-loop": "^1" + "php": ">=7.4" }, "require-dev": { "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", + "ext-json": "*", + "ext-zlib": "*", "phpunit/phpunit": "^9", - "psalm/phar": "^5.18" + "psalm/phar": "6.16.1" }, "type": "library", "autoload": { "files": [ - "src/Context/functions.php", - "src/Context/Internal/functions.php", - "src/Ipc/functions.php", - "src/Worker/functions.php" + "src/functions.php" ], "psr-4": { - "Amp\\Parallel\\": "src" + "Amp\\Serialization\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2631,24 +2254,19 @@ { "name": "Niklas Keller", "email": "me@kelunik.com" - }, - { - "name": "Stephen Coakley", - "email": "me@stephencoakley.com" } ], - "description": "Parallel processing component for Amp.", - "homepage": "https://github.com/amphp/parallel", + "description": "Serialization tools for IPC and data storage in PHP.", + "homepage": "https://github.com/amphp/serialization", "keywords": [ "async", "asynchronous", - "concurrent", - "multi-processing", - "multi-threading" + "serialization", + "serialize" ], "support": { - "issues": "https://github.com/amphp/parallel/issues", - "source": "https://github.com/amphp/parallel/tree/v2.3.3" + "issues": "https://github.com/amphp/serialization/issues", + "source": "https://github.com/amphp/serialization/tree/v1.1.0" }, "funding": [ { @@ -2656,34 +2274,49 @@ "type": "github" } ], - "time": "2025-11-15T06:23:42+00:00" + "time": "2026-04-05T15:59:53+00:00" }, { - "name": "amphp/parser", - "version": "v1.1.1", + "name": "amphp/socket", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/amphp/parser.git", - "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" + "url": "https://github.com/amphp/socket.git", + "reference": "dadb63c5d3179fd83803e29dfeac27350e619314" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", - "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "url": "https://api.github.com/repos/amphp/socket/zipball/dadb63c5d3179fd83803e29dfeac27350e619314", + "reference": "dadb63c5d3179fd83803e29dfeac27350e619314", "shasum": "" }, "require": { - "php": ">=7.4" + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/dns": "^2", + "ext-openssl": "*", + "kelunik/certificate": "^1.1", + "league/uri": "^7", + "league/uri-interfaces": "^7", + "php": ">=8.1", + "revolt/event-loop": "^1" }, "require-dev": { "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "amphp/process": "^2", "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" + "psalm/phar": "6.16.1" }, "type": "library", "autoload": { + "files": [ + "src/functions.php", + "src/Internal/functions.php", + "src/SocketAddress/functions.php" + ], "psr-4": { - "Amp\\Parser\\": "src" + "Amp\\Socket\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2691,6 +2324,10 @@ "MIT" ], "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@gmail.com" + }, { "name": "Aaron Piotrowski", "email": "aaron@trowski.com" @@ -2700,17 +2337,20 @@ "email": "me@kelunik.com" } ], - "description": "A generator parser to make streaming parsers simple.", - "homepage": "https://github.com/amphp/parser", + "description": "Non-blocking socket connection / server implementations based on Amp and Revolt.", + "homepage": "https://github.com/amphp/socket", "keywords": [ + "amp", "async", + "encryption", "non-blocking", - "parser", - "stream" + "sockets", + "tcp", + "tls" ], "support": { - "issues": "https://github.com/amphp/parser/issues", - "source": "https://github.com/amphp/parser/tree/v1.1.1" + "issues": "https://github.com/amphp/socket/issues", + "source": "https://github.com/amphp/socket/tree/v2.4.0" }, "funding": [ { @@ -2718,37 +2358,42 @@ "type": "github" } ], - "time": "2024-03-21T19:16:53+00:00" + "time": "2026-04-19T15:09:56+00:00" }, { - "name": "amphp/pipeline", - "version": "v1.2.3", + "name": "amphp/sync", + "version": "v2.3.0", "source": { "type": "git", - "url": "https://github.com/amphp/pipeline.git", - "reference": "7b52598c2e9105ebcddf247fc523161581930367" + "url": "https://github.com/amphp/sync.git", + "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/pipeline/zipball/7b52598c2e9105ebcddf247fc523161581930367", - "reference": "7b52598c2e9105ebcddf247fc523161581930367", + "url": "https://api.github.com/repos/amphp/sync/zipball/217097b785130d77cfcc58ff583cf26cd1770bf1", + "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1", "shasum": "" }, "require": { "amphp/amp": "^3", + "amphp/pipeline": "^1", + "amphp/serialization": "^1", "php": ">=8.1", - "revolt/event-loop": "^1" + "revolt/event-loop": "^1 || ^0.2" }, "require-dev": { "amphp/php-cs-fixer-config": "^2", "amphp/phpunit-util": "^3", "phpunit/phpunit": "^9", - "psalm/phar": "^5.18" + "psalm/phar": "5.23" }, "type": "library", "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Amp\\Pipeline\\": "src" + "Amp\\Sync\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2763,21 +2408,24 @@ { "name": "Niklas Keller", "email": "me@kelunik.com" + }, + { + "name": "Stephen Coakley", + "email": "me@stephencoakley.com" } ], - "description": "Asynchronous iterators and operators.", - "homepage": "https://amphp.org/pipeline", - "keywords": [ - "amp", - "amphp", + "description": "Non-blocking synchronization primitives for PHP based on Amp and Revolt.", + "homepage": "https://github.com/amphp/sync", + "keywords": [ "async", - "io", - "iterator", - "non-blocking" + "asynchronous", + "mutex", + "semaphore", + "synchronization" ], "support": { - "issues": "https://github.com/amphp/pipeline/issues", - "source": "https://github.com/amphp/pipeline/tree/v1.2.3" + "issues": "https://github.com/amphp/sync/issues", + "source": "https://github.com/amphp/sync/tree/v2.3.0" }, "funding": [ { @@ -2785,104 +2433,83 @@ "type": "github" } ], - "time": "2025-03-16T16:33:53+00:00" + "time": "2024-08-03T19:31:26+00:00" }, { - "name": "amphp/process", - "version": "v2.0.3", + "name": "brick/varexporter", + "version": "0.7.0", "source": { "type": "git", - "url": "https://github.com/amphp/process.git", - "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d" + "url": "https://github.com/brick/varexporter.git", + "reference": "b3a50b8f630a9ed5015ea3e1f00479af261ed80d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/process/zipball/52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d", - "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d", + "url": "https://api.github.com/repos/brick/varexporter/zipball/b3a50b8f630a9ed5015ea3e1f00479af261ed80d", + "reference": "b3a50b8f630a9ed5015ea3e1f00479af261ed80d", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/sync": "^2", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "nikic/php-parser": "^5.0", + "php": "^8.2" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^11.0", + "vimeo/psalm": "6.14.3" }, "type": "library", "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Amp\\Process\\": "src" + "Brick\\VarExporter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } + "description": "A powerful alternative to var_export(), which can export closures and objects without __set_state()", + "keywords": [ + "var_export" ], - "description": "A fiber-aware process manager based on Amp and Revolt.", - "homepage": "https://amphp.org/process", "support": { - "issues": "https://github.com/amphp/process/issues", - "source": "https://github.com/amphp/process/tree/v2.0.3" + "issues": "https://github.com/brick/varexporter/issues", + "source": "https://github.com/brick/varexporter/tree/0.7.0" }, "funding": [ { - "url": "https://github.com/amphp", + "url": "https://github.com/BenMorel", "type": "github" } ], - "time": "2024-04-19T03:13:44+00:00" + "time": "2026-01-06T22:56:00+00:00" }, { - "name": "amphp/serialization", - "version": "v1.0.0", + "name": "clue/ndjson-react", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/amphp/serialization.git", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=5.3", + "react/stream": "^1.2" }, "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "phpunit/phpunit": "^9 || ^8 || ^7" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" }, "type": "library", "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Amp\\Serialization\\": "src" + "Clue\\React\\NDJson\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2891,69 +2518,63 @@ ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Christian Lück", + "email": "christian@clue.engineering" } ], - "description": "Serialization tools for IPC and data storage in PHP.", - "homepage": "https://github.com/amphp/serialization", + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "homepage": "https://github.com/clue/reactphp-ndjson", "keywords": [ - "async", - "asynchronous", - "serialization", - "serialize" + "NDJSON", + "json", + "jsonlines", + "newline", + "reactphp", + "streaming" ], "support": { - "issues": "https://github.com/amphp/serialization/issues", - "source": "https://github.com/amphp/serialization/tree/master" + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" }, - "time": "2020-03-25T21:39:07+00:00" + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-12-23T10:58:28+00:00" }, { - "name": "amphp/socket", - "version": "v2.3.1", + "name": "clue/stream-filter", + "version": "v1.7.0", "source": { "type": "git", - "url": "https://github.com/amphp/socket.git", - "reference": "58e0422221825b79681b72c50c47a930be7bf1e1" + "url": "https://github.com/clue/stream-filter.git", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/socket/zipball/58e0422221825b79681b72c50c47a930be7bf1e1", - "reference": "58e0422221825b79681b72c50c47a930be7bf1e1", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/dns": "^2", - "ext-openssl": "*", - "kelunik/certificate": "^1.1", - "league/uri": "^6.5 | ^7", - "league/uri-interfaces": "^2.3 | ^7", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "php": ">=5.3" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "amphp/process": "^2", - "phpunit/phpunit": "^9", - "psalm/phar": "5.20" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { "files": [ - "src/functions.php", - "src/Internal/functions.php", - "src/SocketAddress/functions.php" + "src/functions_include.php" ], "psr-4": { - "Amp\\Socket\\": "src" + "Clue\\StreamFilter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2962,75 +2583,77 @@ ], "authors": [ { - "name": "Daniel Lowrey", - "email": "rdlowrey@gmail.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Christian Lück", + "email": "christian@clue.engineering" } ], - "description": "Non-blocking socket connection / server implementations based on Amp and Revolt.", - "homepage": "https://github.com/amphp/socket", + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/stream-filter", "keywords": [ - "amp", - "async", - "encryption", - "non-blocking", - "sockets", - "tcp", - "tls" + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" ], "support": { - "issues": "https://github.com/amphp/socket/issues", - "source": "https://github.com/amphp/socket/tree/v2.3.1" + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.7.0" }, "funding": [ { - "url": "https://github.com/amphp", + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", "type": "github" } ], - "time": "2024-04-21T14:33:03+00:00" + "time": "2023-12-20T15:40:13+00:00" }, { - "name": "amphp/sync", - "version": "v2.3.0", + "name": "composer/pcre", + "version": "3.4.0", "source": { "type": "git", - "url": "https://github.com/amphp/sync.git", - "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1" + "url": "https://github.com/composer/pcre.git", + "reference": "d5a341b3fb61f3001970940afb1d332968a183ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/sync/zipball/217097b785130d77cfcc58ff583cf26cd1770bf1", - "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1", + "url": "https://api.github.com/repos/composer/pcre/zipball/d5a341b3fb61f3001970940afb1d332968a183ed", + "reference": "d5a341b3fb61f3001970940afb1d332968a183ed", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/pipeline": "^1", - "amphp/serialization": "^1", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<2.2.2" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "5.23" + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^9" }, "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Amp\\Sync\\": "src" + "Composer\\Pcre\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -3039,300 +2662,37 @@ ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Stephen Coakley", - "email": "me@stephencoakley.com" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "Non-blocking synchronization primitives for PHP based on Amp and Revolt.", - "homepage": "https://github.com/amphp/sync", + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", "keywords": [ - "async", - "asynchronous", - "mutex", - "semaphore", - "synchronization" + "PCRE", + "preg", + "regex", + "regular expression" ], "support": { - "issues": "https://github.com/amphp/sync/issues", - "source": "https://github.com/amphp/sync/tree/v2.3.0" + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.4.0" }, "funding": [ { - "url": "https://github.com/amphp", + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", "type": "github" } ], - "time": "2024-08-03T19:31:26+00:00" + "time": "2026-06-07T11:47:49+00:00" }, { - "name": "brick/varexporter", - "version": "0.6.0", - "source": { - "type": "git", - "url": "https://github.com/brick/varexporter.git", - "reference": "af98bfc2b702a312abbcaff37656dbe419cec5bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/brick/varexporter/zipball/af98bfc2b702a312abbcaff37656dbe419cec5bc", - "reference": "af98bfc2b702a312abbcaff37656dbe419cec5bc", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^5.0", - "php": "^8.1" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "6.8.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Brick\\VarExporter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A powerful alternative to var_export(), which can export closures and objects without __set_state()", - "keywords": [ - "var_export" - ], - "support": { - "issues": "https://github.com/brick/varexporter/issues", - "source": "https://github.com/brick/varexporter/tree/0.6.0" - }, - "funding": [ - { - "url": "https://github.com/BenMorel", - "type": "github" - } - ], - "time": "2025-02-20T17:42:39+00:00" - }, - { - "name": "clue/ndjson-react", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/clue/reactphp-ndjson.git", - "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", - "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "react/stream": "^1.2" - }, - "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", - "react/event-loop": "^1.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Clue\\React\\NDJson\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering" - } - ], - "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", - "homepage": "https://github.com/clue/reactphp-ndjson", - "keywords": [ - "NDJSON", - "json", - "jsonlines", - "newline", - "reactphp", - "streaming" - ], - "support": { - "issues": "https://github.com/clue/reactphp-ndjson/issues", - "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" - }, - "funding": [ - { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-12-23T10:58:28+00:00" - }, - { - "name": "clue/stream-filter", - "version": "v1.7.0", - "source": { - "type": "git", - "url": "https://github.com/clue/stream-filter.git", - "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", - "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "Clue\\StreamFilter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering" - } - ], - "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/stream-filter", - "keywords": [ - "bucket brigade", - "callback", - "filter", - "php_user_filter", - "stream", - "stream_filter_append", - "stream_filter_register" - ], - "support": { - "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.7.0" - }, - "funding": [ - { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2023-12-20T15:40:13+00:00" - }, - { - "name": "composer/pcre", - "version": "3.3.2", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" - }, - "dist": { - "type": "zip", - "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.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" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.2" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-11-12T16:29:46+00:00" - }, - { - "name": "composer/semver", - "version": "3.4.4", + "name": "composer/semver", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/composer/semver.git", @@ -3475,22 +2835,22 @@ }, { "name": "danog/advanced-json-rpc", - "version": "v3.2.2", + "version": "v3.2.3", "source": { "type": "git", "url": "https://github.com/danog/php-advanced-json-rpc.git", - "reference": "aadb1c4068a88c3d0530cfe324b067920661efcb" + "reference": "ae703ea7b4811797a10590b6078de05b3b33dd91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/danog/php-advanced-json-rpc/zipball/aadb1c4068a88c3d0530cfe324b067920661efcb", - "reference": "aadb1c4068a88c3d0530cfe324b067920661efcb", + "url": "https://api.github.com/repos/danog/php-advanced-json-rpc/zipball/ae703ea7b4811797a10590b6078de05b3b33dd91", + "reference": "ae703ea7b4811797a10590b6078de05b3b33dd91", "shasum": "" }, "require": { "netresearch/jsonmapper": "^5", "php": ">=8.1", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0 || ^6" }, "replace": { "felixfbecker/php-advanced-json-rpc": "^3" @@ -3521,9 +2881,9 @@ "description": "A more advanced JSONRPC implementation", "support": { "issues": "https://github.com/danog/php-advanced-json-rpc/issues", - "source": "https://github.com/danog/php-advanced-json-rpc/tree/v3.2.2" + "source": "https://github.com/danog/php-advanced-json-rpc/tree/v3.2.3" }, - "time": "2025-02-14T10:55:15+00:00" + "time": "2026-01-12T21:07:10+00:00" }, { "name": "daverandom/libdns", @@ -3670,29 +3030,29 @@ }, { "name": "doctrine/deprecations", - "version": "1.1.5", + "version": "1.1.6", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" + "phpunit/phpunit": "<=7.5 || >=14" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^13", - "phpstan/phpstan": "1.4.10 || 2.1.11", + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", "psr/log": "^1 || ^2 || ^3" }, "suggest": { @@ -3712,9 +3072,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" }, - "time": "2025-04-07T20:06:18+00:00" + "time": "2026-02-07T07:09:04+00:00" }, { "name": "doctrine/instantiator", @@ -3787,29 +3147,52 @@ "time": "2022-12-30T00:23:10+00:00" }, { - "name": "evenement/evenement", - "version": "v3.0.2", + "name": "ergebnis/agent-detector", + "version": "1.2.0", "source": { "type": "git", - "url": "https://github.com/igorw/evenement.git", - "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + "url": "https://github.com/ergebnis/agent-detector.git", + "reference": "e211f17928c8b95a51e06040792d57f5462fb271" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", - "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "url": "https://api.github.com/repos/ergebnis/agent-detector/zipball/e211f17928c8b95a51e06040792d57f5462fb271", + "reference": "e211f17928c8b95a51e06040792d57f5462fb271", "shasum": "" }, "require": { - "php": ">=7.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0" }, "require-dev": { - "phpunit/phpunit": "^9 || ^6" + "ergebnis/composer-normalize": "^2.51.0", + "ergebnis/license": "^2.7.0", + "ergebnis/php-cs-fixer-config": "^6.60.2", + "ergebnis/phpstan-rules": "^2.13.1", + "ergebnis/phpunit-slow-test-detector": "^2.24.0", + "ergebnis/rector-rules": "^1.18.1", + "fakerphp/faker": "^1.24.1", + "infection/infection": "^0.26.6", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.54", + "phpstan/phpstan-deprecation-rules": "^2.0.4", + "phpstan/phpstan-phpunit": "^2.0.16", + "phpstan/phpstan-strict-rules": "^2.0.10", + "phpunit/phpunit": "^9.6.34", + "rector/rector": "^2.4.2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + }, + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, "autoload": { "psr-4": { - "Evenement\\": "src/" + "Ergebnis\\AgentDetector\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3818,11 +3201,57 @@ ], "authors": [ { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" } ], - "description": "Événement is a very simple event dispatching library for PHP", + "description": "Provides a detector for detecting the presence of an agent.", + "homepage": "https://github.com/ergebnis/agent-detector", + "support": { + "issues": "https://github.com/ergebnis/agent-detector/issues", + "security": "https://github.com/ergebnis/agent-detector/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/agent-detector" + }, + "time": "2026-05-07T08:19:07+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", "keywords": [ "event-dispatcher", "event-emitter" @@ -3835,35 +3264,35 @@ }, { "name": "facile-it/facile-coding-standard", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/facile-it/facile-coding-standard.git", - "reference": "d3554136624c16f2be471ec9ec32574e7a37b168" + "reference": "a7246be5b7e7d2e86d11fd18d3e48dc522fd3432" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facile-it/facile-coding-standard/zipball/d3554136624c16f2be471ec9ec32574e7a37b168", - "reference": "d3554136624c16f2be471ec9ec32574e7a37b168", + "url": "https://api.github.com/repos/facile-it/facile-coding-standard/zipball/a7246be5b7e7d2e86d11fd18d3e48dc522fd3432", + "reference": "a7246be5b7e7d2e86d11fd18d3e48dc522fd3432", "shasum": "" }, "require": { "composer-plugin-api": "^2.0", "ext-json": "*", "friendsofphp/php-cs-fixer": "^3.88", - "php": "^7.4 || ^8.0", - "symfony/console": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/polyfill-php80": "^1.0" + "php": "^8.1", + "symfony/console": "^5.4 || ^6.0 || ^7.0 || ^8.0" }, "require-dev": { "composer/composer": "^2.0", "composer/semver": "^3.0", "mikey179/vfsstream": "^1.6.8", "phpspec/prophecy": "^1.10", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5.28 || ^10.5.36", - "psalm/plugin-phpunit": "^0.19.0", - "vimeo/psalm": "^5.23" + "phpspec/prophecy-phpunit": "^2.3", + "phpunit/phpunit": "^10.5.36 || ^11.5.10 || ^12.5.0 || ^13.0.0", + "psalm/plugin-phpunit": "0.19.3", + "rector/rector": "2.4.4", + "vimeo/psalm": "6.16.1" }, "type": "composer-plugin", "extra": { @@ -3886,9 +3315,9 @@ ], "support": { "issues": "https://github.com/facile-it/facile-coding-standard/issues", - "source": "https://github.com/facile-it/facile-coding-standard/tree/1.4.1" + "source": "https://github.com/facile-it/facile-coding-standard/tree/1.5.0" }, - "time": "2025-12-05T22:26:23+00:00" + "time": "2026-05-29T22:20:33+00:00" }, { "name": "felixfbecker/language-server-protocol", @@ -4009,22 +3438,23 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.92.3", + "version": "v3.95.5", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "2ba8f5a60f6f42fb65758cfb3768434fa2d1c7e8" + "reference": "7f86d8763063f5d2e2e2d0e1e45bb2f15895361d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2ba8f5a60f6f42fb65758cfb3768434fa2d1c7e8", - "reference": "2ba8f5a60f6f42fb65758cfb3768434fa2d1c7e8", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7f86d8763063f5d2e2e2d0e1e45bb2f15895361d", + "reference": "7f86d8763063f5d2e2e2d0e1e45bb2f15895361d", "shasum": "" }, "require": { "clue/ndjson-react": "^1.3", "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.5", + "ergebnis/agent-detector": "^1.2", "ext-filter": "*", "ext-hash": "*", "ext-json": "*", @@ -4035,32 +3465,32 @@ "react/event-loop": "^1.5", "react/socket": "^1.16", "react/stream": "^1.4", - "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0", + "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0 || ^8.0 || ^9.0", "symfony/console": "^5.4.47 || ^6.4.24 || ^7.0 || ^8.0", "symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", "symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", - "symfony/polyfill-mbstring": "^1.33", - "symfony/polyfill-php80": "^1.33", - "symfony/polyfill-php81": "^1.33", - "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-mbstring": "^1.37", + "symfony/polyfill-php80": "^1.37", + "symfony/polyfill-php81": "^1.37", + "symfony/polyfill-php84": "^1.37", "symfony/process": "^5.4.47 || ^6.4.24 || ^7.2 || ^8.0", "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0" }, "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.7", - "infection/infection": "^0.31.0", - "justinrainbow/json-schema": "^6.5", - "keradus/cli-executor": "^2.2", + "facile-it/paraunit": "^1.3.1 || ^2.11.0", + "infection/infection": "^0.32.7", + "justinrainbow/json-schema": "^6.8.0", + "keradus/cli-executor": "^2.3", "mikey179/vfsstream": "^1.6.12", - "php-coveralls/php-coveralls": "^2.9", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", - "phpunit/phpunit": "^9.6.25 || ^10.5.53 || ^11.5.34", - "symfony/polyfill-php85": "^1.33", - "symfony/var-dumper": "^5.4.48 || ^6.4.24 || ^7.3.2 || ^8.0", - "symfony/yaml": "^5.4.45 || ^6.4.24 || ^7.3.2 || ^8.0" + "php-coveralls/php-coveralls": "^2.9.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.8", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.8", + "phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.55", + "symfony/polyfill-php85": "^1.37", + "symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.8", + "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.11" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -4101,7 +3531,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.92.3" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.5" }, "funding": [ { @@ -4109,29 +3539,30 @@ "type": "github" } ], - "time": "2025-12-18T10:45:02+00:00" + "time": "2026-06-09T14:55:16+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.10.0", + "version": "7.11.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + "reference": "5af96f374e0ab4ebd747b8310888c99d3adb0a8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", - "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/5af96f374e0ab4ebd747b8310888c99d3adb0a8c", + "reference": "5af96f374e0ab4ebd747b8310888c99d3adb0a8c", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^2.3", - "guzzlehttp/psr7": "^2.8", + "guzzlehttp/promises": "^2.5", + "guzzlehttp/psr7": "^2.11", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/polyfill-php80": "^1.24" }, "provide": { "psr/http-client-implementation": "1.0" @@ -4140,8 +3571,9 @@ "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "guzzle/client-integration-tests": "3.0.2", + "guzzlehttp/test-server": "^0.5", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "phpunit/phpunit": "^8.5.52 || ^9.6.34", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -4219,7 +3651,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + "source": "https://github.com/guzzle/guzzle/tree/7.11.1" }, "funding": [ { @@ -4235,28 +3667,29 @@ "type": "tidelift" } ], - "time": "2025-08-23T22:36:01+00:00" + "time": "2026-06-07T22:54:06+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.3.0", + "version": "2.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "481557b130ef3790cf82b713667b43030dc9c957" + "reference": "4360e982f87f5f258bf872d094647791db2f4c8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", - "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "url": "https://api.github.com/repos/guzzle/promises/zipball/4360e982f87f5f258bf872d094647791db2f4c8e", + "reference": "4360e982f87f5f258bf872d094647791db2f4c8e", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0" + "php": "^7.2.5 || ^8.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.44 || ^9.6.25" + "phpunit/phpunit": "^8.5.52 || ^9.6.34" }, "type": "library", "extra": { @@ -4302,7 +3735,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.3.0" + "source": "https://github.com/guzzle/promises/tree/2.5.0" }, "funding": [ { @@ -4318,27 +3751,29 @@ "type": "tidelift" } ], - "time": "2025-08-22T14:34:08+00:00" + "time": "2026-06-02T12:23:43+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.8.0", + "version": "2.11.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "21dc724a0583619cd1652f673303492272778051" + "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", - "reference": "21dc724a0583619cd1652f673303492272778051", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/bbb5e61349fa5cb822b3e87842b951088b76b81f", + "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" + "ralouphie/getallheaders": "^3.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/polyfill-php80": "^1.24" }, "provide": { "psr/http-factory-implementation": "1.0", @@ -4346,8 +3781,9 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.44 || ^9.6.25" + "http-interop/http-factory-tests": "1.1.0", + "jshttp/mime-db": "1.54.0.1", + "phpunit/phpunit": "^8.5.52 || ^9.6.34" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -4418,7 +3854,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.8.0" + "source": "https://github.com/guzzle/psr7/tree/2.11.0" }, "funding": [ { @@ -4434,7 +3870,7 @@ "type": "tidelift" } ], - "time": "2025-08-23T21:21:41+00:00" + "time": "2026-06-02T12:30:48+00:00" }, { "name": "kelunik/certificate", @@ -4496,21 +3932,21 @@ }, { "name": "laminas/laminas-component-installer", - "version": "3.6.0", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-component-installer.git", - "reference": "d36cd495624867985fc142e6004ade7c5f4a69bc" + "reference": "8eba3ef7054e4427cdd3c6c223e6c2b449fee9b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-component-installer/zipball/d36cd495624867985fc142e6004ade7c5f4a69bc", - "reference": "d36cd495624867985fc142e6004ade7c5f4a69bc", + "url": "https://api.github.com/repos/laminas/laminas-component-installer/zipball/8eba3ef7054e4427cdd3c6c223e6c2b449fee9b7", + "reference": "8eba3ef7054e4427cdd3c6c223e6c2b449fee9b7", "shasum": "" }, "require": { - "composer-plugin-api": "^2.0", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + "composer-plugin-api": "^2.6", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "conflict": { "zendframework/zend-component-installer": "*" @@ -4519,10 +3955,10 @@ "composer/composer": "^2.7.7", "laminas/laminas-coding-standard": "~3.1.0", "mikey179/vfsstream": "^1.6.11", - "phpunit/phpunit": "^10.5.35", + "phpunit/phpunit": "^11.5.42", "psalm/plugin-phpunit": "^0.19.5", "vimeo/psalm": "^6.13.1", - "webmozart/assert": "^1.11.0" + "webmozart/assert": "^1.11 || ^2.0.0" }, "type": "composer-plugin", "extra": { @@ -4559,26 +3995,26 @@ "type": "community_bridge" } ], - "time": "2025-10-16T15:07:11+00:00" + "time": "2026-05-20T14:12:39+00:00" }, { "name": "laminas/laminas-config-aggregator", - "version": "1.18.0", + "version": "1.20.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-config-aggregator.git", - "reference": "a5cc009f58daa4e1b968abd65972fa3a481c22c5" + "reference": "75331b17a9ba72c5fa8679988ef08a588ddd86af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-config-aggregator/zipball/a5cc009f58daa4e1b968abd65972fa3a481c22c5", - "reference": "a5cc009f58daa4e1b968abd65972fa3a481c22c5", + "url": "https://api.github.com/repos/laminas/laminas-config-aggregator/zipball/75331b17a9ba72c5fa8679988ef08a588ddd86af", + "reference": "75331b17a9ba72c5fa8679988ef08a588ddd86af", "shasum": "" }, "require": { - "brick/varexporter": "^0.5.0 || ^0.4.0 || ^0.6.0", + "brick/varexporter": "^0.5.0 || ^0.4.0 || ^0.6.0 || ^0.7.0", "laminas/laminas-stdlib": "^3.18.0", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", "webimpress/safe-writer": "^2.2.0" }, "conflict": { @@ -4586,11 +4022,11 @@ "zendframework/zend-config-aggregator": "*" }, "require-dev": { - "laminas/laminas-coding-standard": "~3.0.1", + "laminas/laminas-coding-standard": "~3.1.0", "laminas/laminas-config": "^3.10.1", - "phpunit/phpunit": "^10.5.45", - "psalm/plugin-phpunit": "^0.19.2", - "vimeo/psalm": "^6.8.6" + "phpunit/phpunit": "^11.5.42", + "psalm/plugin-phpunit": "^0.19.5", + "vimeo/psalm": "^6.13.1" }, "suggest": { "laminas/laminas-config": "Allows loading configuration from XML, INI, YAML, and JSON files", @@ -4627,25 +4063,25 @@ "type": "community_bridge" } ], - "time": "2025-02-21T18:18:40+00:00" + "time": "2026-06-01T15:37:55+00:00" }, { "name": "laminas/laminas-di", - "version": "3.15.0", + "version": "3.16.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-di.git", - "reference": "de00225cfbe30d7fab1e9cf476e154be25f2c878" + "reference": "7af1fdcbd1b79156b07e82a38f314ab6e07c79c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-di/zipball/de00225cfbe30d7fab1e9cf476e154be25f2c878", - "reference": "de00225cfbe30d7fab1e9cf476e154be25f2c878", + "url": "https://api.github.com/repos/laminas/laminas-di/zipball/7af1fdcbd1b79156b07e82a38f314ab6e07c79c0", + "reference": "7af1fdcbd1b79156b07e82a38f314ab6e07c79c0", "shasum": "" }, "require": { - "laminas/laminas-stdlib": "^3.18.0", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "laminas/laminas-stdlib": "^3.21.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", "psr/container": "^1.1.1", "psr/log": "^1.1.4 || ^2.0.0 || ^3.0.0" }, @@ -4660,10 +4096,10 @@ "laminas/laminas-servicemanager": "^3.22", "mikey179/vfsstream": "^1.6.12", "phpbench/phpbench": "^1.2.7", - "phpunit/phpunit": "^9.6.22", - "psalm/plugin-phpunit": "^0.18.0", + "phpunit/phpunit": "^11.0", + "psalm/plugin-phpunit": "^0.18.0 || ^0.19.0", "squizlabs/php_codesniffer": "^3.7.1", - "vimeo/psalm": "^5.0" + "vimeo/psalm": "^6.0" }, "suggest": { "laminas/laminas-servicemanager": "An IoC container without auto wiring capabilities" @@ -4705,24 +4141,24 @@ "type": "community_bridge" } ], - "time": "2025-02-25T14:43:45+00:00" + "time": "2026-02-05T10:48:44+00:00" }, { "name": "laminas/laminas-diactoros", - "version": "3.7.0", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "b6a3b5bebb1a124f6e4ae22f3571ac83dee4b07d" + "reference": "60c182916b2749480895601649563970f3f12ec4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/b6a3b5bebb1a124f6e4ae22f3571ac83dee4b07d", - "reference": "b6a3b5bebb1a124f6e4ae22f3571ac83dee4b07d", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/60c182916b2749480895601649563970f3f12ec4", + "reference": "60c182916b2749480895601649563970f3f12ec4", "shasum": "" }, "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", "psr/http-factory": "^1.1", "psr/http-message": "^1.1 || ^2.0" }, @@ -4793,25 +4229,25 @@ "type": "community_bridge" } ], - "time": "2025-10-11T18:30:50+00:00" + "time": "2025-10-12T15:31:36+00:00" }, { "name": "laminas/laminas-servicemanager", - "version": "3.23.1", + "version": "3.24.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-servicemanager.git", - "reference": "06594db3a644447521eace9b5efdb12dc8446a33" + "reference": "b172a0df568bf37ebdfb3658263156eefe3c1e8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-servicemanager/zipball/06594db3a644447521eace9b5efdb12dc8446a33", - "reference": "06594db3a644447521eace9b5efdb12dc8446a33", + "url": "https://api.github.com/repos/laminas/laminas-servicemanager/zipball/b172a0df568bf37ebdfb3658263156eefe3c1e8c", + "reference": "b172a0df568bf37ebdfb3658263156eefe3c1e8c", "shasum": "" }, "require": { "laminas/laminas-stdlib": "^3.19", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", "psr/container": "^1.0" }, "conflict": { @@ -4834,7 +4270,7 @@ "laminas/laminas-container-config-test": "^0.8", "mikey179/vfsstream": "^1.6.12", "phpbench/phpbench": "^1.4.1", - "phpunit/phpunit": "^10.5.51", + "phpunit/phpunit": "^10.5.58", "psalm/plugin-phpunit": "^0.18.4", "vimeo/psalm": "^5.26.1" }, @@ -4883,34 +4319,34 @@ "type": "community_bridge" } ], - "time": "2025-08-12T08:44:02+00:00" + "time": "2025-10-14T09:03:51+00:00" }, { "name": "laminas/laminas-stdlib", - "version": "3.20.0", + "version": "3.21.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-stdlib.git", - "reference": "8974a1213be42c3e2f70b2c27b17f910291ab2f4" + "reference": "b1c81514cfe158aadf724c42b34d3d0a8164c096" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/8974a1213be42c3e2f70b2c27b17f910291ab2f4", - "reference": "8974a1213be42c3e2f70b2c27b17f910291ab2f4", + "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/b1c81514cfe158aadf724c42b34d3d0a8164c096", + "reference": "b1c81514cfe158aadf724c42b34d3d0a8164c096", "shasum": "" }, "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "conflict": { "zendframework/zend-stdlib": "*" }, "require-dev": { - "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" + "laminas/laminas-coding-standard": "^3.1.0", + "phpbench/phpbench": "^1.4.1", + "phpunit/phpunit": "^11.5.42", + "psalm/plugin-phpunit": "^0.19.5", + "vimeo/psalm": "^6.13.1" }, "type": "library", "autoload": { @@ -4942,24 +4378,24 @@ "type": "community_bridge" } ], - "time": "2024-10-29T13:46:07+00:00" + "time": "2025-10-11T18:13:12+00:00" }, { "name": "league/uri", - "version": "7.7.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", - "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807" + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/8d587cddee53490f9b82bf203d3a9aa7ea4f9807", - "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", "shasum": "" }, "require": { - "league/uri-interfaces": "^7.7", + "league/uri-interfaces": "^7.8.1", "php": "^8.1", "psr/http-factory": "^1" }, @@ -4973,11 +4409,11 @@ "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", "ext-uri": "to use the PHP native URI class", - "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", - "league/uri-components": "Needed to easily manipulate URI objects components", - "league/uri-polyfill": "Needed to backport the PHP URI extension for older versions of PHP", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", "php-64bit": "to improve IPV4 host parsing", - "rowbot/url": "to handle WHATWG URL", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", @@ -5032,7 +4468,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/7.7.0" + "source": "https://github.com/thephpleague/uri/tree/7.8.1" }, "funding": [ { @@ -5040,20 +4476,20 @@ "type": "github" } ], - "time": "2025-12-07T16:02:06+00:00" + "time": "2026-03-15T20:22:25+00:00" }, { "name": "league/uri-interfaces", - "version": "7.7.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c" + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/62ccc1a0435e1c54e10ee6022df28d6c04c2946c", - "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", "shasum": "" }, "require": { @@ -5066,7 +4502,7 @@ "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", "php-64bit": "to improve IPV4 host parsing", - "rowbot/url": "to handle WHATWG URL", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", @@ -5116,7 +4552,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/7.7.0" + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" }, "funding": [ { @@ -5124,7 +4560,7 @@ "type": "github" } ], - "time": "2025-12-07T16:03:21+00:00" + "time": "2026-03-08T20:05:35+00:00" }, { "name": "myclabs/deep-copy", @@ -5188,16 +4624,16 @@ }, { "name": "netresearch/jsonmapper", - "version": "v5.0.0", + "version": "v5.0.1", "source": { "type": "git", "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c" + "reference": "980674efdda65913492d29a8fd51c82270dd37bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c", - "reference": "8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/980674efdda65913492d29a8fd51c82270dd37bb", + "reference": "980674efdda65913492d29a8fd51c82270dd37bb", "shasum": "" }, "require": { @@ -5233,9 +4669,9 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v5.0.0" + "source": "https://github.com/cweiske/jsonmapper/tree/v5.0.1" }, - "time": "2024-09-08T10:20:00+00:00" + "time": "2026-02-22T16:28:03+00:00" }, { "name": "nikic/php-parser", @@ -5415,16 +4851,16 @@ }, { "name": "php-http/cache-plugin", - "version": "2.0.2", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/php-http/cache-plugin.git", - "reference": "c7fd57abaf6d08578aee51a8f1f34ea33ddbfdef" + "reference": "1443d3882c4c18556fe9b409f664ebc8c021940c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/cache-plugin/zipball/c7fd57abaf6d08578aee51a8f1f34ea33ddbfdef", - "reference": "c7fd57abaf6d08578aee51a8f1f34ea33ddbfdef", + "url": "https://api.github.com/repos/php-http/cache-plugin/zipball/1443d3882c4c18556fe9b409f664ebc8c021940c", + "reference": "1443d3882c4c18556fe9b409f664ebc8c021940c", "shasum": "" }, "require": { @@ -5464,9 +4900,9 @@ ], "support": { "issues": "https://github.com/php-http/cache-plugin/issues", - "source": "https://github.com/php-http/cache-plugin/tree/2.0.2" + "source": "https://github.com/php-http/cache-plugin/tree/2.1.0" }, - "time": "2025-12-01T08:38:41+00:00" + "time": "2026-05-12T09:44:11+00:00" }, { "name": "php-http/client-common", @@ -5892,16 +5328,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.6", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8" + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/5cee1d3dfc2d2aa6599834520911d246f656bcb8", - "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/7bae67520aa9f5ecc506d646810bd40d9da54582", + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582", "shasum": "" }, "require": { @@ -5909,8 +5345,8 @@ "ext-filter": "*", "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.7", - "phpstan/phpdoc-parser": "^1.7|^2.0", + "phpdocumentor/type-resolver": "^2.0", + "phpstan/phpdoc-parser": "^2.0", "webmozart/assert": "^1.9.1 || ^2" }, "require-dev": { @@ -5920,7 +5356,8 @@ "phpstan/phpstan-mockery": "^1.1", "phpstan/phpstan-webmozart-assert": "^1.2", "phpunit/phpunit": "^9.5", - "psalm/phar": "^5.26" + "psalm/phar": "^5.26", + "shipmonk/dead-code-detector": "^0.5.1" }, "type": "library", "extra": { @@ -5950,44 +5387,44 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.6" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.3" }, - "time": "2025-12-22T21:13:58+00:00" + "time": "2026-03-18T20:49:53+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.12.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195" + "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195", - "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/327a05bbee54120d4786a0dc67aad30226ad4cf9", + "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9", "shasum": "" }, "require": { "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", + "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.18|^2.0" + "phpstan/phpdoc-parser": "^2.0" }, "require-dev": { "ext-tokenizer": "*", "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" + "psalm/phar": "^4" }, "type": "library", "extra": { "branch-alias": { - "dev-1.x": "1.x-dev" + "dev-1.x": "1.x-dev", + "dev-2.x": "2.x-dev" } }, "autoload": { @@ -6008,36 +5445,37 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/2.0.0" }, - "time": "2025-11-21T15:09:14+00:00" + "time": "2026-01-06T21:53:42+00:00" }, { "name": "phpspec/prophecy", - "version": "v1.22.0", + "version": "v1.26.1", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "35f1adb388946d92e6edab2aa2cb2b60e132ebd5" + "reference": "09c2e5949d676286358a62af818f8407167a9dd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/35f1adb388946d92e6edab2aa2cb2b60e132ebd5", - "reference": "35f1adb388946d92e6edab2aa2cb2b60e132ebd5", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/09c2e5949d676286358a62af818f8407167a9dd6", + "reference": "09c2e5949d676286358a62af818f8407167a9dd6", "shasum": "" }, "require": { "doctrine/instantiator": "^1.2 || ^2.0", - "php": "^7.4 || 8.0.* || 8.1.* || 8.2.* || 8.3.* || 8.4.*", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", - "sebastian/recursion-context": "^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + "php": "8.2.* || 8.3.* || 8.4.* || 8.5.*", + "phpdocumentor/reflection-docblock": "^5.2 || ^6.0", + "sebastian/comparator": "^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", + "sebastian/recursion-context": "^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", + "symfony/deprecation-contracts": "^2.5 || ^3.1" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.40", - "phpspec/phpspec": "^6.0 || ^7.0", - "phpstan/phpstan": "^2.1.13", - "phpunit/phpunit": "^8.0 || ^9.0 || ^10.0" + "php-cs-fixer/shim": "^3.93.1", + "phpspec/phpspec": "^6.0 || ^7.0 || ^8.0", + "phpstan/phpstan": "^2.1.13, <2.1.34 || ^2.1.39", + "phpunit/phpunit": "^11.0 || ^12.0 || ^13.0" }, "type": "library", "extra": { @@ -6078,28 +5516,28 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.22.0" + "source": "https://github.com/phpspec/prophecy/tree/v1.26.1" }, - "time": "2025-04-29T14:58:06+00:00" + "time": "2026-04-13T14:35:16+00:00" }, { "name": "phpspec/prophecy-phpunit", - "version": "v2.4.0", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy-phpunit.git", - "reference": "d3c28041d9390c9bca325a08c5b2993ac855bded" + "reference": "89f91b01d0640b7820e427e02a007bc6489d8a26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy-phpunit/zipball/d3c28041d9390c9bca325a08c5b2993ac855bded", - "reference": "d3c28041d9390c9bca325a08c5b2993ac855bded", + "url": "https://api.github.com/repos/phpspec/prophecy-phpunit/zipball/89f91b01d0640b7820e427e02a007bc6489d8a26", + "reference": "89f91b01d0640b7820e427e02a007bc6489d8a26", "shasum": "" }, "require": { "php": "^7.3 || ^8", "phpspec/prophecy": "^1.18", - "phpunit/phpunit": "^9.1 || ^10.1 || ^11.0 || ^12.0" + "phpunit/phpunit": "^9.1 || ^10.1 || ^11.0 || ^12.0 || ^13.0" }, "require-dev": { "phpstan/phpstan": "^1.10" @@ -6133,22 +5571,22 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy-phpunit/issues", - "source": "https://github.com/phpspec/prophecy-phpunit/tree/v2.4.0" + "source": "https://github.com/phpspec/prophecy-phpunit/tree/v2.5.0" }, - "time": "2025-05-13T13:52:32+00:00" + "time": "2026-02-09T15:40:55+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.0", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { @@ -6180,41 +5618,105 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" + }, + "time": "2026-01-25T14:56:51+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "2.2.2", + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e5cc34d491a90e79c216d824f60fe21fd4d93bd6", + "reference": "e5cc34d491a90e79c216d824f60fe21fd4d93bd6", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ondřej Mirtes" + }, + { + "name": "Markus Staab" + }, + { + "name": "Vincent Langlet" + } + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" }, - "time": "2025-08-30T15:50:23+00:00" + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2026-06-05T09:00:01+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.16", + "version": "11.0.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77" + "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2c1ed04922802c15e1de5d7447b4856de949cf56", + "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-text-template": "^3.0.1", - "sebastian/code-unit-reverse-lookup": "^3.0.0", - "sebastian/complexity": "^3.2.0", - "sebastian/environment": "^6.1.0", - "sebastian/lines-of-code": "^2.0.2", - "sebastian/version": "^4.0.1", - "theseer/tokenizer": "^1.2.3" + "nikic/php-parser": "^5.7.0", + "php": ">=8.2", + "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.1", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.3.1" }, "require-dev": { - "phpunit/phpunit": "^10.1" + "phpunit/phpunit": "^11.5.46" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -6223,7 +5725,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1.x-dev" + "dev-main": "11.0.x-dev" } }, "autoload": { @@ -6252,40 +5754,52 @@ "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/10.1.16" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.12" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" } ], - "time": "2024-08-22T04:31:57+00:00" + "time": "2025-12-24T07:01:01+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "4.1.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903", + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -6313,36 +5827,48 @@ "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/4.1.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" } ], - "time": "2023-08-31T06:24:48+00:00" + "time": "2026-02-02T13:52:54+00:00" }, { "name": "phpunit/php-invoker", - "version": "4.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "suggest": { "ext-pcntl": "*" @@ -6350,7 +5876,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -6376,7 +5902,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" }, "funding": [ { @@ -6384,32 +5911,32 @@ "type": "github" } ], - "time": "2023-02-03T06:56:09+00:00" + "time": "2024-07-03T05:07:44+00:00" }, { "name": "phpunit/php-text-template", - "version": "3.0.1", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -6436,7 +5963,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" }, "funding": [ { @@ -6444,32 +5971,32 @@ "type": "github" } ], - "time": "2023-08-31T14:07:24+00:00" + "time": "2024-07-03T05:08:43+00:00" }, { "name": "phpunit/php-timer", - "version": "6.0.0", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -6495,7 +6022,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" }, "funding": [ { @@ -6503,20 +6031,20 @@ "type": "github" } ], - "time": "2023-02-03T06:57:52+00:00" + "time": "2024-07-03T05:09:35+00:00" }, { "name": "phpunit/phpunit", - "version": "10.5.60", + "version": "11.5.55", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f2e26f52f80ef77832e359205f216eeac00e320c" + "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f2e26f52f80ef77832e359205f216eeac00e320c", - "reference": "f2e26f52f80ef77832e359205f216eeac00e320c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/adc7262fccc12de2b30f12a8aa0b33775d814f00", + "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00", "shasum": "" }, "require": { @@ -6529,23 +6057,24 @@ "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.16", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-invoker": "^4.0.0", - "phpunit/php-text-template": "^3.0.1", - "phpunit/php-timer": "^6.0.0", - "sebastian/cli-parser": "^2.0.1", - "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.4", - "sebastian/diff": "^5.1.1", - "sebastian/environment": "^6.1.0", - "sebastian/exporter": "^5.1.4", - "sebastian/global-state": "^6.0.2", - "sebastian/object-enumerator": "^5.0.0", - "sebastian/recursion-context": "^5.0.1", - "sebastian/type": "^4.0.0", - "sebastian/version": "^4.0.1" + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.12", + "phpunit/php-file-iterator": "^5.1.1", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.3", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.1", + "sebastian/exporter": "^6.3.2", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/recursion-context": "^6.0.3", + "sebastian/type": "^5.1.3", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files" @@ -6556,7 +6085,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.5-dev" + "dev-main": "11.5-dev" } }, "autoload": { @@ -6588,7 +6117,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.60" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.55" }, "funding": [ { @@ -6612,7 +6141,56 @@ "type": "tidelift" } ], - "time": "2025-12-06T07:50:42+00:00" + "time": "2026-02-18T12:37:06+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" }, { "name": "psr/event-dispatcher", @@ -7154,182 +6732,563 @@ "type": "open_collective" } ], - "time": "2025-11-19T20:47:34+00:00" + "time": "2025-11-19T20:47:34+00:00" + }, + { + "name": "react/stream", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-11T12:45:25+00:00" + }, + { + "name": "rector/rector", + "version": "2.3.9", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "917842143fd9f5331a2adefc214b8d7143bd32c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/917842143fd9f5331a2adefc214b8d7143bd32c4", + "reference": "917842143fd9f5331a2adefc214b8d7143bd32c4", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "phpstan/phpstan": "^2.1.40" + }, + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "suggest": { + "ext-dom": "To manipulate phpunit.xml via the custom-rule command" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "homepage": "https://getrector.com/", + "keywords": [ + "automation", + "dev", + "migration", + "refactoring" + ], + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/2.3.9" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2026-03-16T09:43:55+00:00" + }, + { + "name": "revolt/event-loop", + "version": "v1.0.9", + "source": { + "type": "git", + "url": "https://github.com/revoltphp/event-loop.git", + "reference": "44061cf513e53c6200372fc935ac42271566295d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/44061cf513e53c6200372fc935ac42271566295d", + "reference": "44061cf513e53c6200372fc935ac42271566295d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Revolt\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "ceesjank@gmail.com" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Rock-solid event loop for concurrent PHP applications.", + "keywords": [ + "async", + "asynchronous", + "concurrency", + "event", + "event-loop", + "non-blocking", + "scheduler" + ], + "support": { + "issues": "https://github.com/revoltphp/event-loop/issues", + "source": "https://github.com/revoltphp/event-loop/tree/v1.0.9" + }, + "time": "2026-05-16T17:55:38+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:41:36+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "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.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-19T07:56:08+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:45:54+00:00" }, { - "name": "react/stream", - "version": "v1.4.0", + "name": "sebastian/comparator", + "version": "6.3.3", "source": { "type": "git", - "url": "https://github.com/reactphp/stream.git", - "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", - "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.8", - "react/event-loop": "^1.2" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" }, "require-dev": { - "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" }, "type": "library", - "autoload": { - "psr-4": { - "React\\Stream\\": "src/" + "extra": { + "branch-alias": { + "dev-main": "6.3-dev" } }, + "autoload": { + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" }, { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" + "name": "Volker Dusch", + "email": "github@wallbash.com" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" } ], - "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", "keywords": [ - "event-driven", - "io", - "non-blocking", - "pipe", - "reactphp", - "readable", - "stream", - "writable" + "comparator", + "compare", + "equality" ], "support": { - "issues": "https://github.com/reactphp/stream/issues", - "source": "https://github.com/reactphp/stream/tree/v1.4.0" + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.3" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2024-06-11T12:45:25+00:00" + "time": "2026-01-24T09:26:40+00:00" }, { - "name": "revolt/event-loop", - "version": "v1.0.8", + "name": "sebastian/complexity", + "version": "4.0.1", "source": { "type": "git", - "url": "https://github.com/revoltphp/event-loop.git", - "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c" + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/b6fc06dce8e9b523c9946138fa5e62181934f91c", - "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", "shasum": "" }, "require": { - "php": ">=8.1" + "nikic/php-parser": "^5.0", + "php": ">=8.2" }, "require-dev": { - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.15" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.x-dev" + "dev-main": "4.0-dev" } }, "autoload": { - "psr-4": { - "Revolt\\": "src" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "ceesjank@gmail.com" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Rock-solid event loop for concurrent PHP applications.", - "keywords": [ - "async", - "asynchronous", - "concurrency", - "event", - "event-loop", - "non-blocking", - "scheduler" - ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", "support": { - "issues": "https://github.com/revoltphp/event-loop/issues", - "source": "https://github.com/revoltphp/event-loop/tree/v1.0.8" + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" }, - "time": "2025-08-27T21:33:23+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:49:50+00:00" }, { - "name": "sebastian/cli-parser", - "version": "2.0.1", + "name": "sebastian/diff", + "version": "6.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -7344,16 +7303,25 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" }, "funding": [ { @@ -7361,32 +7329,35 @@ "type": "github" } ], - "time": "2024-03-02T07:12:49+00:00" + "time": "2024-07-03T04:53:05+00:00" }, { - "name": "sebastian/code-unit", - "version": "2.0.0", + "name": "sebastian/environment", + "version": "7.2.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.3" + }, + "suggest": { + "ext-posix": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "7.2-dev" } }, "autoload": { @@ -7401,48 +7372,67 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "email": "sebastian@phpunit.de" } ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" } ], - "time": "2023-02-03T06:58:43+00:00" + "time": "2025-05-21T11:55:47+00:00" }, { - "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.0", + "name": "sebastian/exporter", + "version": "6.3.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", "shasum": "" }, "require": { - "php": ">=8.1" + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "6.3-dev" } }, "autoload": { @@ -7458,50 +7448,82 @@ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" } ], - "time": "2023-02-03T06:59:15+00:00" + "time": "2025-09-24T06:12:51+00:00" }, { - "name": "sebastian/comparator", - "version": "5.0.4", + "name": "sebastian/global-state", + "version": "7.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "e8e53097718d2b53cfb2aa859b06a41abf58c62e" + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e8e53097718d2b53cfb2aa859b06a41abf58c62e", - "reference": "e8e53097718d2b53cfb2aa859b06a41abf58c62e", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^10.5" + "ext-dom": "*", + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -7517,77 +7539,51 @@ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" } ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ - "comparator", - "compare", - "equality" + "global state" ], "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.4" + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", - "type": "tidelift" } ], - "time": "2025-09-07T05:25:07+00:00" + "time": "2024-07-03T04:57:36+00:00" }, { - "name": "sebastian/complexity", - "version": "3.2.0", + "name": "sebastian/lines-of-code", + "version": "3.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68ff824baeae169ec9f2137158ee529584553799" + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", - "reference": "68ff824baeae169ec9f2137158ee529584553799", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" + "nikic/php-parser": "^5.0", + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.2-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -7606,12 +7602,12 @@ "role": "lead" } ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" }, "funding": [ { @@ -7619,33 +7615,34 @@ "type": "github" } ], - "time": "2023-12-21T08:37:17+00:00" + "time": "2024-07-03T04:58:38+00:00" }, { - "name": "sebastian/diff", - "version": "5.1.1", + "name": "sebastian/object-enumerator", + "version": "6.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -7661,24 +7658,14 @@ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" } ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" }, "funding": [ { @@ -7686,35 +7673,32 @@ "type": "github" } ], - "time": "2024-03-02T07:15:17+00:00" + "time": "2024-07-03T05:00:13+00:00" }, { - "name": "sebastian/environment", - "version": "6.1.0", + "name": "sebastian/object-reflector", + "version": "4.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-posix": "*" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.1-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -7732,17 +7716,12 @@ "email": "sebastian@phpunit.de" } ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" }, "funding": [ { @@ -7750,34 +7729,32 @@ "type": "github" } ], - "time": "2024-03-23T08:47:14+00:00" + "time": "2024-07-03T05:01:32+00:00" }, { - "name": "sebastian/exporter", - "version": "5.1.4", + "name": "sebastian/recursion-context", + "version": "6.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "0735b90f4da94969541dac1da743446e276defa6" + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6", - "reference": "0735b90f4da94969541dac1da743446e276defa6", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", "shasum": "" }, "require": { - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/recursion-context": "^5.0" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.5" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -7798,29 +7775,17 @@ "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, { "name": "Adam Harvey", "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" } ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4" + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" }, "funding": [ { @@ -7836,39 +7801,36 @@ "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", "type": "tidelift" } ], - "time": "2025-09-24T06:09:11+00:00" + "time": "2025-08-13T04:42:22+00:00" }, { - "name": "sebastian/global-state", - "version": "6.0.2", + "name": "sebastian/type", + "version": "5.1.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", "shasum": "" }, "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" + "php": ">=8.2" }, "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -7883,52 +7845,58 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" } ], - "time": "2024-03-02T07:19:19+00:00" + "time": "2025-08-09T06:55:48+00:00" }, { - "name": "sebastian/lines-of-code", - "version": "2.0.2", + "name": "sebastian/version", + "version": "5.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" + "php": ">=8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -7947,12 +7915,12 @@ "role": "lead" } ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" }, "funding": [ { @@ -7960,338 +7928,421 @@ "type": "github" } ], - "time": "2023-12-21T08:38:20+00:00" + "time": "2024-10-09T05:16:32+00:00" }, { - "name": "sebastian/object-enumerator", - "version": "5.0.0", + "name": "spatie/array-to-xml", + "version": "3.4.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + "url": "https://github.com/spatie/array-to-xml.git", + "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/88b2f3852a922dd73177a68938f8eb2ec70c7224", + "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224", "shasum": "" }, "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" + "ext-dom": "*", + "php": "^8.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "mockery/mockery": "^1.2", + "pestphp/pest": "^1.21", + "spatie/pest-plugin-snapshots": "^1.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "3.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Spatie\\ArrayToXml\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://freek.dev", + "role": "Developer" } ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "description": "Convert an array to xml", + "homepage": "https://github.com/spatie/array-to-xml", + "keywords": [ + "array", + "convert", + "xml" + ], "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + "source": "https://github.com/spatie/array-to-xml/tree/3.4.4" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", "type": "github" } ], - "time": "2023-02-03T07:08:32+00:00" + "time": "2025-12-15T09:00:41+00:00" }, { - "name": "sebastian/object-reflector", - "version": "3.0.0", + "name": "staabm/side-effects-detector", + "version": "1.0.5", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", "shasum": "" }, "require": { - "php": ">=8.1" + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "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", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, "autoload": { "classmap": [ - "src/" + "lib/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + "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/sebastianbergmann", + "url": "https://github.com/staabm", "type": "github" } ], - "time": "2023-02-03T07:06:18+00:00" + "time": "2024-10-20T05:08:20+00:00" }, { - "name": "sebastian/recursion-context", - "version": "5.0.1", + "name": "symfony/console", + "version": "v7.4.13", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" + "url": "https://github.com/symfony/console.git", + "reference": "85095d2573eaefaf35e40b9513a9bf09f72cd217" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", + "url": "https://api.github.com/repos/symfony/console/zipball/85095d2573eaefaf35e40b9513a9bf09f72cd217", + "reference": "85095d2573eaefaf35e40b9513a9bf09f72cd217", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "phpunit/phpunit": "^10.5" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Adam Harvey", - "email": "aharvey@php.net" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" + "source": "https://github.com/symfony/console/tree/v7.4.13" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" + "url": "https://github.com/fabpot", + "type": "github" }, { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" + "url": "https://github.com/nicolas-grekas", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-08-10T07:50:56+00:00" + "time": "2026-05-24T08:56:14+00:00" }, { - "name": "sebastian/type", - "version": "4.0.0", + "name": "symfony/event-dispatcher", + "version": "v7.4.9", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "e4a2e29753c7801f7a8340e066cfa788f3bc8101" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e4a2e29753c7801f7a8340e066cfa788f3bc8101", + "reference": "e4a2e29753c7801f7a8340e066cfa788f3bc8101", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0|^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", + "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": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.9" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2023-02-03T07:10:45+00:00" + "time": "2026-04-18T13:18:21+00:00" }, { - "name": "sebastian/version", - "version": "4.0.1", + "name": "symfony/event-dispatcher-contracts", + "version": "v3.7.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/ccba7060602b7fed0b03c85bf025257f76d9ef32", + "reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.1", + "psr/event-dispatcher": "^1" }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "3.7-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2023-02-07T11:34:05+00:00" + "time": "2026-01-05T13:30:16+00:00" }, { - "name": "spatie/array-to-xml", - "version": "3.4.4", + "name": "symfony/filesystem", + "version": "v7.4.11", "source": { "type": "git", - "url": "https://github.com/spatie/array-to-xml.git", - "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224" + "url": "https://github.com/symfony/filesystem.git", + "reference": "d721ea61b4a5fba8c5b6e7c1feda19efea144b50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/88b2f3852a922dd73177a68938f8eb2ec70c7224", - "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d721ea61b4a5fba8c5b6e7c1feda19efea144b50", + "reference": "d721ea61b4a5fba8c5b6e7c1feda19efea144b50", "shasum": "" }, "require": { - "ext-dom": "*", - "php": "^8.0" + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "mockery/mockery": "^1.2", - "pestphp/pest": "^1.21", - "spatie/pest-plugin-snapshots": "^1.1" + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, "autoload": { "psr-4": { - "Spatie\\ArrayToXml\\": "src" - } + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8299,74 +8350,63 @@ ], "authors": [ { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://freek.dev", - "role": "Developer" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Convert an array to xml", - "homepage": "https://github.com/spatie/array-to-xml", - "keywords": [ - "array", - "convert", - "xml" - ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", "support": { - "source": "https://github.com/spatie/array-to-xml/tree/3.4.4" + "source": "https://github.com/symfony/filesystem/tree/v7.4.11" }, "funding": [ { - "url": "https://spatie.be/open-source/support-us", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://github.com/spatie", + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2025-12-15T09:00:41+00:00" + "time": "2026-05-11T16:38:44+00:00" }, { - "name": "symfony/event-dispatcher", - "version": "v6.4.25", + "name": "symfony/finder", + "version": "v7.4.8", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "b0cf3162020603587363f0551cd3be43958611ff" + "url": "https://github.com/symfony/finder.git", + "reference": "e0be088d22278583a82da281886e8c3592fbf149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b0cf3162020603587363f0551cd3be43958611ff", - "reference": "b0cf3162020603587363f0551cd3be43958611ff", + "url": "https://api.github.com/repos/symfony/finder/zipball/e0be088d22278583a82da281886e8c3592fbf149", + "reference": "e0be088d22278583a82da281886e8c3592fbf149", "shasum": "" }, - "require": { - "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/service-contracts": "<2.5" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" - }, + "require": { + "php": ">=8.2" + }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/filesystem": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" + "Symfony\\Component\\Finder\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -8386,10 +8426,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.25" + "source": "https://github.com/symfony/finder/tree/v7.4.8" }, "funding": [ { @@ -8409,40 +8449,34 @@ "type": "tidelift" } ], - "time": "2025-08-13T09:41:44+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { - "name": "symfony/event-dispatcher-contracts", - "version": "v3.6.0", + "name": "symfony/options-resolver", + "version": "v7.4.8", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + "url": "https://github.com/symfony/options-resolver.git", + "reference": "2888fcdc4dc2fd5f7c7397be78631e8af12e02b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/2888fcdc4dc2fd5f7c7397be78631e8af12e02b4", + "reference": "2888fcdc4dc2fd5f7c7397be78631e8af12e02b4", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/event-dispatcher": "^1" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.6-dev" - } - }, "autoload": { "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8450,26 +8484,23 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to dispatching event", + "description": "Provides an improved replacement for the array_replace PHP function", "homepage": "https://symfony.com", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "config", + "configuration", + "options" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.4.8" }, "funding": [ { @@ -8480,43 +8511,54 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { - "name": "symfony/filesystem", - "version": "v6.4.30", + "name": "symfony/polyfill-ctype", + "version": "v1.37.0", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/441c6b69f7222aadae7cbf5df588496d5ee37789", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" + "php": ">=7.2" }, - "require-dev": { - "symfony/process": "^5.4|^6.4|^7.0" + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8524,18 +8566,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides basic utilities for the filesystem", + "description": "Symfony polyfill for ctype functions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.30" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { @@ -8555,36 +8603,42 @@ "type": "tidelift" } ], - "time": "2025-11-26T14:43:45+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { - "name": "symfony/finder", - "version": "v6.4.31", + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.38.1", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "5547f2e1f0ca8e2e7abe490156b62da778cfbe2b" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "e9247d281d694a5120554d9afaf54e070e88a603" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/5547f2e1f0ca8e2e7abe490156b62da778cfbe2b", - "reference": "5547f2e1f0ca8e2e7abe490156b62da778cfbe2b", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603", + "reference": "e9247d281d694a5120554d9afaf54e070e88a603", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2" }, - "require-dev": { - "symfony/filesystem": "^6.0|^7.0" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8592,18 +8646,26 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Finds files and directories via an intuitive fluent interface", + "description": "Symfony polyfill for intl's grapheme_* functions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.31" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1" }, "funding": [ { @@ -8623,33 +8685,44 @@ "type": "tidelift" } ], - "time": "2025-12-11T14:52:17+00:00" + "time": "2026-05-26T05:58:03+00:00" }, { - "name": "symfony/options-resolver", - "version": "v6.4.30", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.38.0", "source": { "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "eeaa8cabe54c7b3516938c72a4a161c0cc80a34f" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/eeaa8cabe54c7b3516938c72a4a161c0cc80a34f", - "reference": "eeaa8cabe54c7b3516938c72a4a161c0cc80a34f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3" + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -8658,23 +8731,26 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides an improved replacement for the array_replace PHP function", + "description": "Symfony polyfill for intl's Normalizer class and related functions", "homepage": "https://symfony.com", "keywords": [ - "config", - "configuration", - "options" + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.4.30" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0" }, "funding": [ { @@ -8694,20 +8770,20 @@ "type": "tidelift" } ], - "time": "2025-11-12T13:06:53+00:00" + "time": "2026-05-25T13:48:31+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", "shasum": "" }, "require": { @@ -8758,7 +8834,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" }, "funding": [ { @@ -8778,20 +8854,20 @@ "type": "tidelift" } ], - "time": "2025-01-02T08:10:11+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + "reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/6bfb9c766cacffbc8e118cb87217d08ed84e5cd7", + "reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7", "shasum": "" }, "require": { @@ -8838,7 +8914,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.38.1" }, "funding": [ { @@ -8858,20 +8934,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-05-26T12:45:58+00:00" }, { "name": "symfony/polyfill-php84", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", "shasum": "" }, "require": { @@ -8918,7 +8994,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" }, "funding": [ { @@ -8938,24 +9014,24 @@ "type": "tidelift" } ], - "time": "2025-06-24T13:30:11+00:00" + "time": "2026-05-26T12:51:13+00:00" }, { "name": "symfony/process", - "version": "v6.4.31", + "version": "v7.4.13", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8541b7308fca001320e90bca8a73a28aa5604a6e" + "reference": "f5804be144caceb570f6747519999636b664f24c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8541b7308fca001320e90bca8a73a28aa5604a6e", - "reference": "8541b7308fca001320e90bca8a73a28aa5604a6e", + "url": "https://api.github.com/repos/symfony/process/zipball/f5804be144caceb570f6747519999636b664f24c", + "reference": "f5804be144caceb570f6747519999636b664f24c", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -8983,7 +9059,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.31" + "source": "https://github.com/symfony/process/tree/v7.4.13" }, "funding": [ { @@ -9003,24 +9079,24 @@ "type": "tidelift" } ], - "time": "2025-12-15T19:26:35+00:00" + "time": "2026-05-23T16:05:06+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.4.24", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898" + "reference": "70a852d72fec4d51efb1f48dcd968efcaf5ccb89" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b67e94e06a05d9572c2fa354483b3e13e3cb1898", - "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/70a852d72fec4d51efb1f48dcd968efcaf5ccb89", + "reference": "70a852d72fec4d51efb1f48dcd968efcaf5ccb89", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/service-contracts": "^2.5|^3" }, "type": "library", @@ -9049,7 +9125,98 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.24" + "source": "https://github.com/symfony/stopwatch/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/string", + "version": "v7.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "961683010db3b27ec6ebcd7308e6e1ee8fa7ffde" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/961683010db3b27ec6ebcd7308e6e1ee8fa7ffde", + "reference": "961683010db3b27ec6ebcd7308e6e1ee8fa7ffde", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "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": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.4.13" }, "funding": [ { @@ -9069,7 +9236,7 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2026-05-23T15:23:29+00:00" }, { "name": "theseer/tokenizer", @@ -9123,16 +9290,16 @@ }, { "name": "vimeo/psalm", - "version": "6.14.3", + "version": "6.16.1", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "d0b040a91f280f071c1abcb1b77ce3822058725a" + "reference": "f1f5de594dc76faf8784e02d3dc4716c91c6f6ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/d0b040a91f280f071c1abcb1b77ce3822058725a", - "reference": "d0b040a91f280f071c1abcb1b77ce3822058725a", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/f1f5de594dc76faf8784e02d3dc4716c91c6f6ac", + "reference": "f1f5de594dc76faf8784e02d3dc4716c91c6f6ac", "shasum": "" }, "require": { @@ -9156,7 +9323,7 @@ "netresearch/jsonmapper": "^5.0", "nikic/php-parser": "^5.0.0", "php": "~8.1.31 || ~8.2.27 || ~8.3.16 || ~8.4.3 || ~8.5.0", - "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", "spatie/array-to-xml": "^2.17.0 || ^3.0", "symfony/console": "^6.0 || ^7.0 || ^8.0", "symfony/filesystem": "~6.3.12 || ~6.4.3 || ^7.0.3 || ^8.0", @@ -9237,7 +9404,7 @@ "issues": "https://github.com/vimeo/psalm/issues", "source": "https://github.com/vimeo/psalm" }, - "time": "2025-12-23T15:36:48+00:00" + "time": "2026-03-19T10:56:09+00:00" }, { "name": "webimpress/safe-writer", @@ -9300,23 +9467,23 @@ }, { "name": "webmozart/assert", - "version": "1.12.1", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" + "reference": "9007ea6f45ecf352a9422b36644e4bfc039b9155" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/9007ea6f45ecf352a9422b36644e4bfc039b9155", + "reference": "9007ea6f45ecf352a9422b36644e4bfc039b9155", "shasum": "" }, "require": { "ext-ctype": "*", "ext-date": "*", "ext-filter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.2" }, "suggest": { "ext-intl": "", @@ -9325,8 +9492,12 @@ }, "type": "library", "extra": { + "psalm": { + "pluginClass": "Webmozart\\Assert\\PsalmPlugin" + }, "branch-alias": { - "dev-master": "1.10-dev" + "dev-master": "2.0-dev", + "dev-feature/2-0": "2.0-dev" } }, "autoload": { @@ -9342,6 +9513,10 @@ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" + }, + { + "name": "Woody Gilk", + "email": "woody.gilk@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", @@ -9352,9 +9527,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.12.1" + "source": "https://github.com/webmozarts/assert/tree/2.4.0" }, - "time": "2025-10-29T15:56:20+00:00" + "time": "2026-05-20T13:07:01+00:00" } ], "aliases": [], @@ -9363,9 +9538,12 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^8.1", + "php": "^8.2", "ext-json": "*" }, "platform-dev": {}, + "platform-overrides": { + "php": "8.2.99" + }, "plugin-api-version": "2.9.0" } diff --git a/conformance/src/AbstractRpTestCase.php b/conformance/src/AbstractRpTestCase.php index e0a33fa..25ac2ba 100644 --- a/conformance/src/AbstractRpTestCase.php +++ b/conformance/src/AbstractRpTestCase.php @@ -22,9 +22,9 @@ use ReflectionFunction; use RuntimeException; use Throwable; +use ReflectionClass; use function array_merge; -use function dirname; use function file; use function file_exists; use function file_put_contents; @@ -33,7 +33,6 @@ use function ltrim; use function mkdir; use function parse_str; -use function sprintf; use function var_export; use const PHP_EOL; @@ -82,7 +81,6 @@ public function getRedirectUri(): string protected function simulateAuthRedirect(string $uri): ServerRequestInterface { - /** @var HttpClient $client */ $httpClient = $this->getContainer()->has(HttpClient::class) ? $this->getContainer()->get(HttpClient::class) : Psr18ClientDiscovery::find(); @@ -114,8 +112,6 @@ protected function executeRpTest(string $profile, string $testName, callable $ca { echo $this->getClosureDump($callback); - $testUtil = $this->getContainer()->get(RpTestUtil::class); - try { $callback($profile, $testName); } catch (Throwable $e) { @@ -153,7 +149,7 @@ protected function getClosureDump(callable $closure) $s = ''; if ($p->isArray()) { $s .= 'array '; - } elseif ($p->getClass()) { + } elseif ($p->getClass() instanceof ReflectionClass) { $s .= $p->getClass()->name . ' '; } if ($p->isPassedByReference()) { @@ -190,10 +186,10 @@ public function getAndSaveTestLog(string $profile, string $testName): string $log = (string) $response->getBody(); $logFilePath = __DIR__ . '/../log/' . ltrim($profile, '@') . '/' . $testName . '.txt'; - $dirname = dirname($logFilePath); + $dirname = \dirname($logFilePath); if (! file_exists($dirname) && ! mkdir($concurrentDirectory = $dirname, 0o777, true) && ! is_dir($concurrentDirectory)) { - throw new RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory)); + throw new RuntimeException(\sprintf('Directory "%s" was not created', $concurrentDirectory)); } file_put_contents($logFilePath, $log); diff --git a/conformance/src/Command/RpTest.php b/conformance/src/Command/RpTest.php index ee7215b..5e39fdb 100644 --- a/conformance/src/Command/RpTest.php +++ b/conformance/src/Command/RpTest.php @@ -15,33 +15,19 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +use Throwable; use function array_filter; -use function count; use function fnmatch; -use function sprintf; use function str_repeat; class RpTest extends Command { - /** @var RpTestRunner */ - private $testRunner; - - /** @var RpProfileTestsProvider */ - private $testsProvider; - - /** @var RPLogsHelper */ - private $logsHelper; - public function __construct( - RpTestRunner $testRunner, - RpProfileTestsProvider $testsProvider, - RPLogsHelper $logsHelper + private readonly RpTestRunner $testRunner, + private readonly RpProfileTestsProvider $testsProvider, + private readonly RPLogsHelper $logsHelper, ) { - $this->testRunner = $testRunner; - $this->testsProvider = $testsProvider; - $this->logsHelper = $logsHelper; - parent::__construct('test'); } @@ -86,8 +72,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->logsHelper->clearLogs($testInfo->getRoot(), $testInfo->getRpId()); } - if (count($testIds)) { - $tests = array_filter($tests, static function (RpTestInterface $test) use ($testIds) { + if (\count($testIds) > 0) { + $tests = array_filter($tests, static function (RpTestInterface $test) use ($testIds): bool { foreach ($testIds as $testId) { if (fnmatch($testId, $test->getTestId())) { return true; @@ -111,7 +97,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int do { $result = $this->testRunner->run($test, $testInfo); - } while (null !== $result->getException() && ++$count < $retries); + } while ($result->getException() instanceof Throwable && ++$count < $retries); $output->writeln("Test: {$testName}", OutputInterface::VERBOSITY_NORMAL); @@ -134,7 +120,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->printRemoteLog($result, $output); } - if ($exception = $result->getException()) { + if (($exception = $result->getException()) instanceof Throwable) { $counters['errors'][] = $testName; $output->writeln('Result: Test failed!', OutputInterface::VERBOSITY_NORMAL); $output->writeln((string) $exception, OutputInterface::VERBOSITY_DEBUG); @@ -152,20 +138,20 @@ protected function execute(InputInterface $input, OutputInterface $output): int } $output->writeln('--- SUMMARY ---', OutputInterface::VERBOSITY_NORMAL); - $output->writeln(sprintf('Executed: %d', count($counters['executed'])), OutputInterface::VERBOSITY_NORMAL); - $output->writeln(sprintf('Success: %d', count($counters['success'])), OutputInterface::VERBOSITY_NORMAL); - $output->writeln(sprintf('Errors: %d', count($counters['errors'])), OutputInterface::VERBOSITY_NORMAL); + $output->writeln(\sprintf('Executed: %d', \count($counters['executed'])), OutputInterface::VERBOSITY_NORMAL); + $output->writeln(\sprintf('Success: %d', \count($counters['success'])), OutputInterface::VERBOSITY_NORMAL); + $output->writeln(\sprintf('Errors: %d', \count($counters['errors'])), OutputInterface::VERBOSITY_NORMAL); - if (count($counters['errors'])) { + if (\count($counters['errors'])) { $this->printSeparator($output, OutputInterface::VERBOSITY_NORMAL); $output->writeln('Failed tests', OutputInterface::VERBOSITY_NORMAL); foreach ($counters['errors'] as $testName) { - $output->writeln(sprintf(' - %s', $testName), OutputInterface::VERBOSITY_NORMAL); + $output->writeln(\sprintf(' - %s', $testName), OutputInterface::VERBOSITY_NORMAL); } } - if (count($counters['errors'])) { + if (\count($counters['errors'])) { return 1; } @@ -183,7 +169,7 @@ private function printRemoteLog(RpTestResult $result, OutputInterface $output): $body = (string) $this->logsHelper->getLog( $testInfo->getRoot(), $testInfo->getRpId(), - $result->getTest()->getTestId() + $result->getTest()->getTestId(), ) ->getBody(); $output->writeln('Remote Log:'); diff --git a/conformance/src/Provider/ImplementationProvider.php b/conformance/src/Provider/ImplementationProvider.php index 154eaee..9a91d1a 100644 --- a/conformance/src/Provider/ImplementationProvider.php +++ b/conformance/src/Provider/ImplementationProvider.php @@ -10,62 +10,51 @@ use function array_map; use function array_pop; use function array_shift; -use function array_slice; use function array_unshift; use function file; use function implode; -use function is_callable; use function preg_match; use function preg_replace; -use function sprintf; use function str_repeat; -use function strlen; class ImplementationProvider { - /** @var int */ - private $indent; + public function __construct( + private readonly int $indent = 4, + ) {} - /** - * ImplementationProvider constructor. - */ - public function __construct(int $indent = 4) + public function getCallableCode(callable $closure): string { - $this->indent = $indent; - } - - public function getCallableCode(callable $closure) - { - if (is_callable($closure)) { + if (\is_callable($closure)) { $closure = Closure::fromCallable($closure); } $r = new ReflectionFunction($closure); $lines = file($r->getFileName()); - $lines = array_slice($lines, $r->getStartLine(), $r->getEndLine() - $r->getStartLine()); + $lines = \array_slice($lines, $r->getStartLine(), $r->getEndLine() - $r->getStartLine()); if (preg_match('/^ *{ *$/', $lines[0] ?? '')) { unset($lines[0]); } $firstLine = array_shift($lines) ?: ''; - if (! preg_match('/^ *{ *$/', $firstLine)) { + if (! preg_match('/^ *{ *$/', (string) $firstLine)) { array_unshift($lines, $firstLine); } $lastLine = array_pop($lines) ?: ''; - if (! preg_match('/^ *} *$/', $lastLine)) { + if (! preg_match('/^ *} *$/', (string) $lastLine)) { $lines[] = $lastLine; } // remove spaces based on first line if (preg_match('/^( +)/', $lines[0] ?? '', $matches)) { - $toTrim = strlen($matches[1]); - $lines = array_map(static fn(string $line) => preg_replace(sprintf('/^ {0,%d}/', $toTrim), '', $line), $lines); + $toTrim = \strlen($matches[1]); + $lines = array_map(static fn(string $line): ?string => preg_replace(\sprintf('/^ {0,%d}/', $toTrim), '', $line), $lines); } - if ($this->indent) { - $lines = array_map(fn(string $line) => str_repeat(' ', $this->indent) . $line, $lines); + if ($this->indent !== 0) { + $lines = array_map(fn(string $line): string => str_repeat(' ', $this->indent) . $line, $lines); } return implode('', $lines); diff --git a/conformance/src/Provider/RpProfileTestsProvider.php b/conformance/src/Provider/RpProfileTestsProvider.php index fbd9df5..74db889 100644 --- a/conformance/src/Provider/RpProfileTestsProvider.php +++ b/conformance/src/Provider/RpProfileTestsProvider.php @@ -15,11 +15,8 @@ class RpProfileTestsProvider { - /** @var ContainerInterface */ - private $container; - /** @var array */ - private static $responseTypeMap = [ + private static array $responseTypeMap = [ TestInfo::PROFILE_BASIC_CODE => 'code', TestInfo::PROFILE_IMPLICIT_IDTOKEN => 'id_token', TestInfo::PROFILE_IMPLICIT_IDTOKEN_TOKEN => 'id_token token', @@ -30,7 +27,7 @@ class RpProfileTestsProvider TestInfo::PROFILE_DYNAMIC => 'code', ]; - private static $testMap = [ + private static array $testMap = [ TestInfo::PROFILE_BASIC_CODE => [ RpTest\ResponseTypeAndResponseMode\RPResponseTypeCodeTest::class, RpTest\ScopeRequestParameter\RpScopeUserinfoClaimsTest::class, @@ -396,19 +393,18 @@ class RpProfileTestsProvider /** * ProfileTestsProvider constructor. */ - public function __construct(ContainerInterface $container) - { - $this->container = $container; - } + public function __construct( + private readonly ContainerInterface $container, + ) {} public function getAvailableProfiles(): array { - return array_keys(static::$testMap); + return array_keys(self::$testMap); } public function getResponseTypeForProfile(string $profile): string { - $responseType = static::$responseTypeMap[$profile] ?? null; + $responseType = self::$responseTypeMap[$profile] ?? null; if (null === $responseType) { throw new InvalidArgumentException('No response type for profile ' . $profile); @@ -422,6 +418,6 @@ public function getResponseTypeForProfile(string $profile): string */ public function getTests(string $profile): array { - return array_map([$this->container, 'get'], static::$testMap[$profile] ?? []); + return array_map($this->container->get(...), self::$testMap[$profile] ?? []); } } diff --git a/conformance/src/RpTest/AbstractRpTest.php b/conformance/src/RpTest/AbstractRpTest.php index fe9201a..cf6a243 100644 --- a/conformance/src/RpTest/AbstractRpTest.php +++ b/conformance/src/RpTest/AbstractRpTest.php @@ -26,7 +26,6 @@ use function array_merge; use function json_decode; use function json_encode; -use function sprintf; use const PHP_EOL; @@ -34,13 +33,9 @@ abstract class AbstractRpTest implements RpTestInterface { protected const REDIRECT_URI = 'https://rp.test/callback'; - /** @var ContainerInterface */ - private $container; - - public function __construct(ContainerInterface $container) - { - $this->container = $container; - } + public function __construct( + private readonly ContainerInterface $container, + ) {} public function getContainer(): ContainerInterface { @@ -72,7 +67,7 @@ public function registerClient(TestInfo $testInfo, array $metadata = [], ?JWKSet try { $clientMetadata = ClientMetadata::fromArray($registrationService->register($issuer, $metadata)); } catch (OAuth2Exception $e) { - echo sprintf('%s (%s)', $e->getMessage(), $e->getDescription()) . PHP_EOL; + echo \sprintf('%s (%s)', $e->getMessage(), $e->getDescription()) . PHP_EOL; throw $e; } catch (RemoteException $e) { echo $e->getResponse()->getBody() . PHP_EOL; @@ -88,7 +83,6 @@ public function registerClient(TestInfo $testInfo, array $metadata = [], ?JWKSet protected function httpGet(string $uri, array $headers = []): ResponseInterface { - /** @var HttpClient $client */ $httpClient = $this->getContainer()->has(HttpClient::class) ? $this->getContainer()->get(HttpClient::class) : Psr18ClientDiscovery::find(); diff --git a/conformance/src/RpTest/Discovery/RPDiscoveryJwksUriKeys.php b/conformance/src/RpTest/Discovery/RPDiscoveryJwksUriKeys.php index 1774014..1f46d2d 100644 --- a/conformance/src/RpTest/Discovery/RPDiscoveryJwksUriKeys.php +++ b/conformance/src/RpTest/Discovery/RPDiscoveryJwksUriKeys.php @@ -9,8 +9,6 @@ use Facile\OpenIDClient\Issuer\IssuerBuilder; use PHPUnit\Framework\Assert; -use function sprintf; - /** * The Relying Party uses keys from the jwks_uri which has been obtained from the OpenID Provider Metadata. * @@ -25,7 +23,7 @@ public function getTestId(): string public function execute(TestInfo $testInfo): void { - $configUri = sprintf('%s/%s/%s/.well-known/openid-configuration', $testInfo->getRoot(), $testInfo->getRpId(), $this->getTestId()); + $configUri = \sprintf('%s/%s/%s/.well-known/openid-configuration', $testInfo->getRoot(), $testInfo->getRpId(), $this->getTestId()); $issuer = (new IssuerBuilder()) ->build($configUri); diff --git a/conformance/src/RpTest/Discovery/RPDiscoveryOpenIdConfiguration.php b/conformance/src/RpTest/Discovery/RPDiscoveryOpenIdConfiguration.php index 507bad5..83c6b90 100644 --- a/conformance/src/RpTest/Discovery/RPDiscoveryOpenIdConfiguration.php +++ b/conformance/src/RpTest/Discovery/RPDiscoveryOpenIdConfiguration.php @@ -9,8 +9,6 @@ use Facile\OpenIDClient\Issuer\IssuerBuilder; use PHPUnit\Framework\Assert; -use function sprintf; - /** * Retrieve and use the OpenID Provider Configuration Information. * @@ -25,11 +23,11 @@ public function getTestId(): string public function execute(TestInfo $testInfo): void { - $configUri = sprintf('%s/%s/%s/.well-known/openid-configuration', $testInfo->getRoot(), $testInfo->getRpId(), $this->getTestId()); + $configUri = \sprintf('%s/%s/%s/.well-known/openid-configuration', $testInfo->getRoot(), $testInfo->getRpId(), $this->getTestId()); $issuer = (new IssuerBuilder()) ->build($configUri); - $expected = sprintf('%s/%s/%s', $testInfo->getRoot(), $testInfo->getRpId(), $this->getTestId()); + $expected = \sprintf('%s/%s/%s', $testInfo->getRoot(), $testInfo->getRpId(), $this->getTestId()); Assert::assertSame($expected, $issuer->getMetadata()->getIssuer()); } } diff --git a/conformance/src/RpTest/Discovery/RPDiscoveryWebFingerAcct.php b/conformance/src/RpTest/Discovery/RPDiscoveryWebFingerAcct.php index edfe175..dc658b6 100644 --- a/conformance/src/RpTest/Discovery/RPDiscoveryWebFingerAcct.php +++ b/conformance/src/RpTest/Discovery/RPDiscoveryWebFingerAcct.php @@ -11,7 +11,6 @@ use function parse_url; use function rtrim; -use function sprintf; /** * Use WebFinger (RFC7033) and OpenID Provider Issuer Discovery to determine the location of the OpenID Provider. @@ -32,11 +31,11 @@ public function execute(TestInfo $testInfo): void $parsed = parse_url($testInfo->getRoot()); $issuerHostAndPort = rtrim($parsed['host'] . ':' . ($parsed['port'] ?? ''), ':'); - $input = sprintf('acct:%s.%s@%s', $testInfo->getRpId(), $this->getTestId(), $issuerHostAndPort); + $input = \sprintf('acct:%s.%s@%s', $testInfo->getRpId(), $this->getTestId(), $issuerHostAndPort); $issuer = (new IssuerBuilder()) ->build($input); - $expected = sprintf('%s/%s/%s', $testInfo->getRoot(), $testInfo->getRpId(), $this->getTestId()); + $expected = \sprintf('%s/%s/%s', $testInfo->getRoot(), $testInfo->getRpId(), $this->getTestId()); Assert::assertSame($expected, $issuer->getMetadata()->getIssuer()); } } diff --git a/conformance/src/RpTest/Discovery/RPDiscoveryWebFingerUnknownMember.php b/conformance/src/RpTest/Discovery/RPDiscoveryWebFingerUnknownMember.php index 4cf36cf..2a21820 100644 --- a/conformance/src/RpTest/Discovery/RPDiscoveryWebFingerUnknownMember.php +++ b/conformance/src/RpTest/Discovery/RPDiscoveryWebFingerUnknownMember.php @@ -9,8 +9,6 @@ use Facile\OpenIDClient\Issuer\IssuerBuilder; use PHPUnit\Framework\Assert; -use function sprintf; - /** * The webfinger response will contain a member that the client doesn't recognize. * @@ -30,7 +28,7 @@ public function execute(TestInfo $testInfo): void $issuer = (new IssuerBuilder()) ->build($input); - $expected = sprintf('%s/%s/%s', $testInfo->getRoot(), $testInfo->getRpId(), $this->getTestId()); + $expected = \sprintf('%s/%s/%s', $testInfo->getRoot(), $testInfo->getRpId(), $this->getTestId()); Assert::assertSame($expected, $issuer->getMetadata()->getIssuer()); } } diff --git a/conformance/src/RpTest/Discovery/RPDiscoveryWebFingerUrl.php b/conformance/src/RpTest/Discovery/RPDiscoveryWebFingerUrl.php index e079fd8..3b2897b 100644 --- a/conformance/src/RpTest/Discovery/RPDiscoveryWebFingerUrl.php +++ b/conformance/src/RpTest/Discovery/RPDiscoveryWebFingerUrl.php @@ -9,8 +9,6 @@ use Facile\OpenIDClient\Issuer\IssuerBuilder; use PHPUnit\Framework\Assert; -use function sprintf; - /** * Use WebFinger (RFC7033) and OpenID Provider Issuer Discovery to determine the location of the OpenID Provider. * The discovery should be done using URL syntax as user input identifier. @@ -31,7 +29,7 @@ public function execute(TestInfo $testInfo): void $issuer = (new IssuerBuilder()) ->build($input); - $expected = sprintf('%s/%s/%s', $testInfo->getRoot(), $testInfo->getRpId(), $this->getTestId()); + $expected = \sprintf('%s/%s/%s', $testInfo->getRoot(), $testInfo->getRpId(), $this->getTestId()); Assert::assertSame($expected, $issuer->getMetadata()->getIssuer()); } } diff --git a/conformance/src/RpTest/DynamicClientRegistration/RPRegistrationDynamic.php b/conformance/src/RpTest/DynamicClientRegistration/RPRegistrationDynamic.php index 9a9a234..07f3344 100644 --- a/conformance/src/RpTest/DynamicClientRegistration/RPRegistrationDynamic.php +++ b/conformance/src/RpTest/DynamicClientRegistration/RPRegistrationDynamic.php @@ -10,8 +10,6 @@ use Facile\OpenIDClient\Service\RegistrationService; use PHPUnit\Framework\Assert; -use function sprintf; - /** * Use the client registration endpoint in order to dynamically register the Relying Party. * @@ -28,7 +26,7 @@ public function execute(TestInfo $testInfo): void { $clientRegistrationService = new RegistrationService(); - $configUri = sprintf('%s/%s/%s/.well-known/openid-configuration', $testInfo->getRoot(), $testInfo->getRpId(), $this->getTestId()); + $configUri = \sprintf('%s/%s/%s/.well-known/openid-configuration', $testInfo->getRoot(), $testInfo->getRpId(), $this->getTestId()); $issuer = (new IssuerBuilder()) ->build($configUri); diff --git a/conformance/src/RpTest/IdToken/RpIdTokenSigEncA128KWTest.php b/conformance/src/RpTest/IdToken/RpIdTokenSigEncA128KWTest.php index 093b5cd..e35b3dd 100644 --- a/conformance/src/RpTest/IdToken/RpIdTokenSigEncA128KWTest.php +++ b/conformance/src/RpTest/IdToken/RpIdTokenSigEncA128KWTest.php @@ -50,6 +50,6 @@ public function execute(TestInfo $testInfo): void $tokenSet = $authorizationService->callback($client, $params); Assert::assertNotNull($tokenSet->getIdToken()); - Assert::arrayHasKey('email', $tokenSet->claims()); + Assert::assertArrayHasKey('email', $tokenSet->claims()); } } diff --git a/conformance/src/RpTest/IdToken/RpIdTokenSigEncTest.php b/conformance/src/RpTest/IdToken/RpIdTokenSigEncTest.php index af58398..f211225 100644 --- a/conformance/src/RpTest/IdToken/RpIdTokenSigEncTest.php +++ b/conformance/src/RpTest/IdToken/RpIdTokenSigEncTest.php @@ -37,7 +37,7 @@ public function execute(TestInfo $testInfo): void $jwkEncAlg = JWKFactory::createRSAKey(2_048, ['alg' => 'RSA1_5', 'use' => 'enc']); $jwks = new JWKSet([$jwkSig, $jwkEncAlg]); - $publicJwks = new JWKSet(array_map(fn(JWK $jwk) => $jwk->toPublic(), $jwks->all())); + $publicJwks = new JWKSet(array_map(fn(JWK $jwk): JWK => $jwk->toPublic(), $jwks->all())); $client = $this->registerClient($testInfo, [ 'id_token_signed_response_alg' => 'RS256', @@ -66,6 +66,6 @@ public function execute(TestInfo $testInfo): void $tokenSet = $authorizationService->callback($client, $params, null, $authSession); Assert::assertNotNull($tokenSet->getIdToken()); - Assert::arrayHasKey('email', $tokenSet->claims()); + Assert::assertArrayHasKey('email', $tokenSet->claims()); } } diff --git a/conformance/src/RpTest/KeyRotation/RPKeyRotationOPEncKeyTest.php b/conformance/src/RpTest/KeyRotation/RPKeyRotationOPEncKeyTest.php index 043520c..5f6a55c 100644 --- a/conformance/src/RpTest/KeyRotation/RPKeyRotationOPEncKeyTest.php +++ b/conformance/src/RpTest/KeyRotation/RPKeyRotationOPEncKeyTest.php @@ -40,7 +40,7 @@ public function execute(TestInfo $testInfo): void $jwkEncAlg = JWKFactory::createRSAKey(2_048, ['alg' => 'RSA-OAEP', 'use' => 'enc']); $jwks = new JWKSet([$jwkSig, $jwkEncAlg]); - $publicJwks = new JWKSet(array_map(static fn(JWK $jwk) => $jwk->toPublic(), $jwks->all())); + $publicJwks = new JWKSet(array_map(static fn(JWK $jwk): JWK => $jwk->toPublic(), $jwks->all())); $client = $this->registerClient($testInfo, [ 'request_object_signing_alg' => 'RS256', diff --git a/conformance/src/RpTest/NonceRequestParameter/RpNonceUnlessCodeFlowTest.php b/conformance/src/RpTest/NonceRequestParameter/RpNonceUnlessCodeFlowTest.php index c73f6d6..b77d14e 100644 --- a/conformance/src/RpTest/NonceRequestParameter/RpNonceUnlessCodeFlowTest.php +++ b/conformance/src/RpTest/NonceRequestParameter/RpNonceUnlessCodeFlowTest.php @@ -56,7 +56,7 @@ public function execute(TestInfo $testInfo): void $serverRequest = $this->simulateAuthRedirect($uri); $params = $authorizationService->getCallbackParams($serverRequest, $client); - $tokenSet = $authorizationService->callback($client, $params, null, $authSession); + $authorizationService->callback($client, $params, null, $authSession); Assert::assertTrue(true); } diff --git a/conformance/src/RpTest/ResponseTypeAndResponseMode/RPResponseModeFormPostErrorTest.php b/conformance/src/RpTest/ResponseTypeAndResponseMode/RPResponseModeFormPostErrorTest.php index 2b51b37..c3d8094 100644 --- a/conformance/src/RpTest/ResponseTypeAndResponseMode/RPResponseModeFormPostErrorTest.php +++ b/conformance/src/RpTest/ResponseTypeAndResponseMode/RPResponseModeFormPostErrorTest.php @@ -70,7 +70,7 @@ public function execute(TestInfo $testInfo): void throw new AssertionFailedError('No assertions'); } catch (OAuth2Exception $e) { Assert::assertSame('login_required', $e->getError()); - } catch (Throwable $e) { + } catch (Throwable) { throw new AssertionFailedError('No assertions'); } } diff --git a/conformance/src/RpTest/ScopeRequestParameter/RpScopeUserinfoClaimsTest.php b/conformance/src/RpTest/ScopeRequestParameter/RpScopeUserinfoClaimsTest.php index b1e30f6..903d317 100644 --- a/conformance/src/RpTest/ScopeRequestParameter/RpScopeUserinfoClaimsTest.php +++ b/conformance/src/RpTest/ScopeRequestParameter/RpScopeUserinfoClaimsTest.php @@ -52,7 +52,7 @@ public function execute(TestInfo $testInfo): void if ($accessToken) { $userInfo = $userInfoService->getUserInfo($client, $tokenSet); } else { - $userInfo = json_decode(base64url_decode(explode('.', $tokenSet->getIdToken())[1]), true); + $userInfo = json_decode(base64url_decode(explode('.', (string) $tokenSet->getIdToken())[1]), true); } Assert::assertArrayHasKey('email', $userInfo); diff --git a/conformance/src/RpTest/UserInfoEndpoint/RPUserInfoEncTest.php b/conformance/src/RpTest/UserInfoEndpoint/RPUserInfoEncTest.php index be37ee4..33ebd28 100644 --- a/conformance/src/RpTest/UserInfoEndpoint/RPUserInfoEncTest.php +++ b/conformance/src/RpTest/UserInfoEndpoint/RPUserInfoEncTest.php @@ -37,7 +37,7 @@ public function execute(TestInfo $testInfo): void $jwkEncAlg = JWKFactory::createRSAKey(2_048, ['alg' => 'RSA1_5', 'use' => 'enc']); $jwks = new JWKSet([$jwkEncAlg]); - $publicJwks = new JWKSet(array_map(static fn(JWK $jwk) => $jwk->toPublic(), $jwks->all())); + $publicJwks = new JWKSet(array_map(static fn(JWK $jwk): JWK => $jwk->toPublic(), $jwks->all())); $client = $this->registerClient($testInfo, [ 'userinfo_signed_response_alg' => 'none', diff --git a/conformance/src/RpTest/UserInfoEndpoint/RPUserInfoSigEncTest.php b/conformance/src/RpTest/UserInfoEndpoint/RPUserInfoSigEncTest.php index 44090b5..1dd48ac 100644 --- a/conformance/src/RpTest/UserInfoEndpoint/RPUserInfoSigEncTest.php +++ b/conformance/src/RpTest/UserInfoEndpoint/RPUserInfoSigEncTest.php @@ -38,7 +38,7 @@ public function execute(TestInfo $testInfo): void $jwkEncAlg = JWKFactory::createRSAKey(2_048, ['alg' => 'RSA1_5', 'use' => 'enc']); $jwks = new JWKSet([$jwkSig, $jwkEncAlg]); - $publicJwks = new JWKSet(array_map(static fn(JWK $jwk) => $jwk->toPublic(), $jwks->all())); + $publicJwks = new JWKSet(array_map(static fn(JWK $jwk): JWK => $jwk->toPublic(), $jwks->all())); $client = $this->registerClient($testInfo, [ 'userinfo_signed_response_alg' => 'RS256', diff --git a/conformance/src/RpTestUtil.php b/conformance/src/RpTestUtil.php index a53908c..7f4fcb7 100644 --- a/conformance/src/RpTestUtil.php +++ b/conformance/src/RpTestUtil.php @@ -19,7 +19,6 @@ use function ltrim; use function mkdir; use function preg_match; -use function sprintf; class RpTestUtil { @@ -29,23 +28,19 @@ class RpTestUtil /** @var RequestFactoryInterface */ private $requestFactory; - /** @var string */ - private $logDir; - public function __construct( ?ClientInterface $client = null, ?RequestFactoryInterface $requestFactory = null, - string $logDir = __DIR__ . '/../log' + private readonly string $logDir = __DIR__ . '/../log', ) { $this->client = $client ?? Psr18ClientDiscovery::find(); $this->requestFactory = $requestFactory ?? Psr17FactoryDiscovery::findRequestFactory(); - $this->logDir = $logDir; } private function mkdir(string $dirname): void { if (! file_exists($dirname) && ! mkdir($concurrentDirectory = $dirname, 0o777, true) && ! is_dir($concurrentDirectory)) { - throw new RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory)); + throw new RuntimeException(\sprintf('Directory "%s" was not created', $concurrentDirectory)); } } diff --git a/conformance/src/Runner/RpTestResult.php b/conformance/src/Runner/RpTestResult.php index 2cede13..d0a9268 100644 --- a/conformance/src/Runner/RpTestResult.php +++ b/conformance/src/Runner/RpTestResult.php @@ -10,28 +10,13 @@ class RpTestResult { - /** @var RpTestInterface */ - private $test; - - /** @var TestInfo */ - private $testInfo; - - /** @var string */ - private $implementation; - - /** @var Throwable */ - private $exception; - - /** - * RpTestResult constructor. - */ - public function __construct(RpTestInterface $test, TestInfo $testInfo, string $implementation, ?Throwable $exception = null) - { - $this->test = $test; - $this->testInfo = $testInfo; - $this->implementation = $implementation; - $this->exception = $exception; - } + public function __construct( + private readonly RpTestInterface $test, + private readonly TestInfo $testInfo, + private readonly string $implementation, + /** @var Throwable */ + private ?Throwable $exception = null, + ) {} public function getTest(): RpTestInterface { diff --git a/conformance/src/Runner/RpTestRunner.php b/conformance/src/Runner/RpTestRunner.php index 96894fc..845791d 100644 --- a/conformance/src/Runner/RpTestRunner.php +++ b/conformance/src/Runner/RpTestRunner.php @@ -13,23 +13,16 @@ class RpTestRunner { - /** @var ImplementationProvider */ - private $implementationProvider; + public function __construct( + private readonly ImplementationProvider $implementationProvider, + ) {} - /** - * RpTestRunner constructor. - */ - public function __construct(ImplementationProvider $implementationProvider) - { - $this->implementationProvider = $implementationProvider; - } - - public function run(RpTestInterface $test, TestInfo $testInfo) + public function run(RpTestInterface $test, TestInfo $testInfo): RpTestResult { $testResult = new RpTestResult( $test, $testInfo, - $this->implementationProvider->getCallableCode([$test, 'execute']) + $this->implementationProvider->getCallableCode($test->execute(...)), ); try { diff --git a/conformance/src/TestInfo.php b/conformance/src/TestInfo.php index 47e591c..6810e98 100644 --- a/conformance/src/TestInfo.php +++ b/conformance/src/TestInfo.php @@ -25,30 +25,14 @@ class TestInfo public const PROFILE_DYNAMIC = 'dynamic'; - /** @var string */ - private $profile; + private readonly string $root; - /** @var string */ - private $responseType; - - /** @var string */ - private $rpId; - - /** @var string */ - private $root; - - /** - * TestInfo constructor. - */ public function __construct( - string $profile, - string $responseType = 'code', - string $baseRpId = 'tmv_php-openid-client', - string $root = 'https://rp.certification.openid.net:8080/' + private readonly string $profile, + private readonly string $responseType = 'code', + private readonly string $rpId = 'tmv_php-openid-client', + string $root = 'https://rp.certification.openid.net:8080/', ) { - $this->profile = $profile; - $this->responseType = $responseType; - $this->rpId = $baseRpId; $this->root = rtrim($root, '/'); } diff --git a/conformance/src/TestListener.php b/conformance/src/TestListener.php index 7309333..f5e7632 100644 --- a/conformance/src/TestListener.php +++ b/conformance/src/TestListener.php @@ -16,19 +16,13 @@ use function array_map; use function array_pop; -use function array_push; use function array_shift; -use function array_slice; use function array_unshift; use function file; use function implode; -use function is_callable; use function preg_match; use function preg_replace; -use function sprintf; use function str_repeat; -use function strlen; -use function strpos; use function substr; class TestListener implements TestListenerInterface @@ -71,7 +65,7 @@ public function getRpId(): string */ public function startTestSuite(TestSuite $suite): void { - if (0 !== strpos($suite->getName(), 'rp-')) { + if (! str_starts_with($suite->getName(), 'rp-')) { return; } @@ -103,12 +97,7 @@ public function endTestSuite(TestSuite $suite): void /** * A test started. */ - public function startTest(Test $test): void - { - if (! $test instanceof RpTestInterface) { - return; - } - } + public function startTest(Test $test): void {} /** * A test ended. @@ -119,43 +108,43 @@ public function endTest(Test $test, float $time): void return; } - $testUtil = $this->container->get(RpTestUtil::class); + $this->container->get(RpTestUtil::class); - $implementation = $this->getClosureDump([$test, 'execute']); + $this->getClosureDump([$test, 'execute']); } - protected function getClosureDump(callable $closure, int $indent = 4) + protected function getClosureDump(callable $closure, int $indent = 4): string { - if (is_callable($closure)) { + if (\is_callable($closure)) { $closure = Closure::fromCallable($closure); } $r = new ReflectionFunction($closure); $lines = file($r->getFileName()); - $lines = array_slice($lines, $r->getStartLine(), $r->getEndLine() - $r->getStartLine()); + $lines = \array_slice($lines, $r->getStartLine(), $r->getEndLine() - $r->getStartLine()); if (preg_match('/^ *{ *$/', $lines[0] ?? '')) { unset($lines[0]); } $firstLine = array_shift($lines) ?: ''; - if (! preg_match('/^ *{ *$/', $firstLine)) { + if (! preg_match('/^ *{ *$/', (string) $firstLine)) { array_unshift($lines, $firstLine); } $lastLine = array_pop($lines) ?: ''; - if (! preg_match('/^ *} *$/', $lastLine)) { - array_push($lines, $lastLine); + if (! preg_match('/^ *} *$/', (string) $lastLine)) { + $lines[] = $lastLine; } // remove spaces based on first line if (preg_match('/^( +)/', $lines[0] ?? '', $matches)) { - $toTrim = strlen($matches[1]); - $lines = array_map(static fn(string $line) => preg_replace(sprintf('/^ {0,%d}/', $toTrim), '', $line), $lines); + $toTrim = \strlen($matches[1]); + $lines = array_map(static fn(string $line): ?string => preg_replace(\sprintf('/^ {0,%d}/', $toTrim), '', $line), $lines); } - if ($indent) { - $lines = array_map(static fn(string $line) => str_repeat(' ', $indent) . $line, $lines); + if ($indent !== 0) { + $lines = array_map(static fn(string $line): string => str_repeat(' ', $indent) . $line, $lines); } return implode('', $lines); diff --git a/rector.php b/rector.php new file mode 100644 index 0000000..9866a39 --- /dev/null +++ b/rector.php @@ -0,0 +1,20 @@ +withPaths([ + __DIR__ . '/conformance', + __DIR__ . '/src', + __DIR__ . '/tests', + ]) + // uncomment to reach your current PHP version + ->withPhpSets() + ->withPreparedSets( + deadCode: true, + codeQuality: true, + typeDeclarations: true + ) +; diff --git a/src/AlgorithmManagerBuilder.php b/src/AlgorithmManagerBuilder.php index 936cf3a..f903c14 100644 --- a/src/AlgorithmManagerBuilder.php +++ b/src/AlgorithmManagerBuilder.php @@ -10,7 +10,7 @@ use Jose\Component\Signature\Algorithm; use Throwable; -final class AlgorithmManagerBuilder +final readonly class AlgorithmManagerBuilder { /** * @var string[] @@ -36,7 +36,7 @@ public function build(): AlgorithmManager if (class_exists($algorithmClass)) { try { $algorithms[] = new $algorithmClass(); - } catch (Throwable $throwable) { + } catch (Throwable) { // does nothing } } diff --git a/src/AuthMethod/AbstractJwtAuth.php b/src/AuthMethod/AbstractJwtAuth.php index 04c45d1..6ba79b1 100644 --- a/src/AuthMethod/AbstractJwtAuth.php +++ b/src/AuthMethod/AbstractJwtAuth.php @@ -22,7 +22,7 @@ abstract protected function createAuthJwt(OpenIDClient $client, array $claims = public function createRequest( RequestInterface $request, OpenIDClient $client, - array $claims + array $claims, ): RequestInterface { $clientId = $client->getMetadata()->getClientId(); diff --git a/src/AuthMethod/AbstractTLS.php b/src/AuthMethod/AbstractTLS.php index 96eb505..a809fb9 100644 --- a/src/AuthMethod/AbstractTLS.php +++ b/src/AuthMethod/AbstractTLS.php @@ -17,7 +17,7 @@ abstract class AbstractTLS implements AuthMethodInterface public function createRequest( RequestInterface $request, OpenIDClient $client, - array $claims + array $claims, ): RequestInterface { $clientId = $client->getMetadata()->getClientId(); diff --git a/src/AuthMethod/ClientSecretBasic.php b/src/AuthMethod/ClientSecretBasic.php index 8050d65..6c34881 100644 --- a/src/AuthMethod/ClientSecretBasic.php +++ b/src/AuthMethod/ClientSecretBasic.php @@ -25,7 +25,7 @@ public function getSupportedMethod(): string public function createRequest( RequestInterface $request, OpenIDClient $client, - array $claims + array $claims, ): RequestInterface { $clientId = $client->getMetadata()->getClientId(); $clientSecret = $client->getMetadata()->getClientSecret(); @@ -36,7 +36,7 @@ public function createRequest( $request = $request->withHeader( 'Authorization', - 'Basic ' . base64_encode(urlencode($clientId) . ':' . urlencode($clientSecret)) + 'Basic ' . base64_encode(urlencode($clientId) . ':' . urlencode($clientSecret)), ); $request->getBody()->write(http_build_query($claims)); diff --git a/src/AuthMethod/ClientSecretJwt.php b/src/AuthMethod/ClientSecretJwt.php index 449a009..9281ab7 100644 --- a/src/AuthMethod/ClientSecretJwt.php +++ b/src/AuthMethod/ClientSecretJwt.php @@ -24,20 +24,10 @@ final class ClientSecretJwt extends AbstractJwtAuth { - private ?JWSBuilder $jwsBuilder; - - private JWSSerializer $jwsSerializer; - - /** - * ClientSecretJwt constructor. - */ public function __construct( - ?JWSBuilder $jwsBuilder = null, - ?JWSSerializer $jwsSerializer = null - ) { - $this->jwsBuilder = $jwsBuilder; - $this->jwsSerializer = $jwsSerializer ?? new CompactSerializer(); - } + private ?JWSBuilder $jwsBuilder = null, + private readonly JWSSerializer $jwsSerializer = new CompactSerializer(), + ) {} #[Override] public function getSupportedMethod(): string @@ -47,7 +37,7 @@ public function getSupportedMethod(): string private function getJwsBuilder(): JWSBuilder { - if (null !== $this->jwsBuilder) { + if ($this->jwsBuilder instanceof JWSBuilder) { return $this->jwsBuilder; } @@ -82,7 +72,7 @@ protected function createAuthJwt(OpenIDClient $client, array $claims = []): stri 'iat' => $time, 'exp' => $time + 60, 'jti' => $jti, - ], JSON_THROW_ON_ERROR); + ], \JSON_THROW_ON_ERROR); $jws = $this->getJwsBuilder()->create() ->withPayload($payload) diff --git a/src/AuthMethod/ClientSecretPost.php b/src/AuthMethod/ClientSecretPost.php index cda87f6..5cafde5 100644 --- a/src/AuthMethod/ClientSecretPost.php +++ b/src/AuthMethod/ClientSecretPost.php @@ -24,7 +24,7 @@ public function getSupportedMethod(): string public function createRequest( RequestInterface $request, OpenIDClient $client, - array $claims + array $claims, ): RequestInterface { $clientSecret = $client->getMetadata()->getClientSecret(); diff --git a/src/AuthMethod/None.php b/src/AuthMethod/None.php index 69efd64..6dc4bc2 100644 --- a/src/AuthMethod/None.php +++ b/src/AuthMethod/None.php @@ -23,7 +23,7 @@ public function getSupportedMethod(): string public function createRequest( RequestInterface $request, OpenIDClient $client, - array $claims + array $claims, ): RequestInterface { $params = array_merge(['client_id' => $client->getMetadata()->getClientId()], $claims); $request->getBody()->write(http_build_query($params)); diff --git a/src/AuthMethod/PrivateKeyJwt.php b/src/AuthMethod/PrivateKeyJwt.php index 64fb9df..57fecbb 100644 --- a/src/AuthMethod/PrivateKeyJwt.php +++ b/src/AuthMethod/PrivateKeyJwt.php @@ -23,27 +23,18 @@ final class PrivateKeyJwt extends AbstractJwtAuth { - private JWSBuilder $jwsBuilder; + private readonly JWSBuilder $jwsBuilder; - private JWSSerializer $jwsSerializer; + private readonly JWSSerializer $jwsSerializer; - private ?JWK $jwk; - - private int $tokenTTL; - - /** - * PrivateKeyJwt constructor. - */ public function __construct( ?JWSBuilder $jwsBuilder = null, ?JWSSerializer $serializer = null, - ?JWK $jwk = null, - int $tokenTTL = 60 + private readonly ?JWK $jwk = null, + private readonly int $tokenTTL = 60, ) { $this->jwsBuilder = $jwsBuilder ?? new JWSBuilder((new AlgorithmManagerBuilder())->build()); $this->jwsSerializer = $serializer ?? new CompactSerializer(); - $this->jwk = $jwk; - $this->tokenTTL = $tokenTTL; } #[Override] @@ -62,7 +53,7 @@ protected function createAuthJwt(OpenIDClient $client, array $claims = []): stri $jwk = $this->jwk ?? JWKSet::createFromKeyData($client->getJwksProvider()->getJwks())->selectKey('sig'); - if (null === $jwk) { + if (! $jwk instanceof JWK) { throw new RuntimeException('Unable to get a client signature jwk'); } @@ -78,12 +69,12 @@ protected function createAuthJwt(OpenIDClient $client, array $claims = []): stri 'iat' => $time, 'exp' => $time + $this->tokenTTL, 'jti' => $jti, - ] - ), JSON_THROW_ON_ERROR); + ], + ), \JSON_THROW_ON_ERROR); $jwkAlg = $jwk->get('alg'); - if (! is_string($jwkAlg)) { + if (! \is_string($jwkAlg)) { throw new RuntimeException('Invalid JWK `alg` value'); } diff --git a/src/Authorization/AuthRequest.php b/src/Authorization/AuthRequest.php index b0b2b5d..d0e4b70 100644 --- a/src/Authorization/AuthRequest.php +++ b/src/Authorization/AuthRequest.php @@ -12,7 +12,6 @@ use function array_flip; use function array_keys; use function array_merge; -use function count; use function implode; /** @@ -39,7 +38,7 @@ final class AuthRequest implements AuthRequestInterface public function __construct( string $clientId, string $redirectUri, - array $params = [] + array $params = [], ) { $defaults = [ 'scope' => 'openid', @@ -61,20 +60,18 @@ public function __construct( * @param array $params * * @psalm-param array{client_id: string, redirect_uri: string} $params - * - * @return static */ public static function fromParams(array $params): self { $missingKeys = array_diff(self::$requiredKeys, array_keys($params)); - if (0 !== count($missingKeys)) { + if (0 !== \count($missingKeys)) { throw new InvalidArgumentException(implode(', ', $missingKeys) . ' keys not provided'); } - return new static( + return new self( $params['client_id'], $params['redirect_uri'], - $params + $params, ); } @@ -256,7 +253,7 @@ public function withParams(array $params): AuthRequestInterface $instance->params = $params; - if (0 === count(array_diff_key($instance->params, array_flip(self::$requiredKeys)))) { + if (0 === \count(array_diff_key($instance->params, array_flip(self::$requiredKeys)))) { throw new InvalidArgumentException(implode(', ', self::$requiredKeys) . ' should be provided'); } diff --git a/src/Claims/AbstractClaims.php b/src/Claims/AbstractClaims.php index 8dde72a..e5c764f 100644 --- a/src/Claims/AbstractClaims.php +++ b/src/Claims/AbstractClaims.php @@ -12,6 +12,7 @@ use Facile\OpenIDClient\Issuer\IssuerBuilderInterface; use Facile\OpenIDClient\Token\TokenSetInterface; use Jose\Component\Core\AlgorithmManager; +use Jose\Component\Core\JWK; use Jose\Component\Core\JWKSet; use Jose\Component\Signature\JWSVerifier; use Jose\Component\Signature\Serializer\CompactSerializer; @@ -20,12 +21,9 @@ use function array_diff_key; use function array_flip; -use function array_key_exists; -use function count; use function explode; use function Facile\OpenIDClient\base64url_decode; use function json_decode; -use function sprintf; /** * @psalm-import-type TokenSetClaimsType from TokenSetInterface @@ -47,7 +45,7 @@ public function __construct( ?IssuerBuilderInterface $issuerBuilder = null, ?AlgorithmManager $algorithmManager = null, ?JWSVerifier $JWSVerifier = null, - ?JWSSerializer $serializer = null + ?JWSSerializer $serializer = null, ) { $this->issuerBuilder = $issuerBuilder ?? new IssuerBuilder(); $this->algorithmManager = $algorithmManager ?? (new AlgorithmManagerBuilder())->build(); @@ -64,7 +62,7 @@ public function __construct( */ protected function isAggregateSource(array $data): bool { - return array_key_exists('JWT', $data); + return \array_key_exists('JWT', $data); } /** @@ -76,7 +74,7 @@ protected function isAggregateSource(array $data): bool */ protected function isDistributedSource(array $data): bool { - return array_key_exists('endpoint', $data); + return \array_key_exists('endpoint', $data); } /** @@ -88,9 +86,9 @@ protected function claimJWT(OpenIDClient $client, string $jwt): array try { /** @var null|array $header */ - $header = json_decode(base64url_decode(explode('.', $jwt)[0] ?? '{}'), true, 512, JSON_THROW_ON_ERROR); + $header = json_decode(base64url_decode(explode('.', $jwt)[0] ?? '{}'), true, 512, \JSON_THROW_ON_ERROR); /** @var array $payload */ - $payload = json_decode(base64url_decode(explode('.', $jwt)[1] ?? '{}'), true, 512, JSON_THROW_ON_ERROR); + $payload = json_decode(base64url_decode(explode('.', $jwt)[1] ?? '{}'), true, 512, \JSON_THROW_ON_ERROR); } catch (JsonException $e) { throw new InvalidArgumentException('Invalid JWT content', 0, $e); } @@ -122,7 +120,7 @@ protected function claimJWT(OpenIDClient $client, string $jwt): array $jwk = $jwks->selectKey('sig', $this->algorithmManager->get($alg), null !== $kid ? ['kid' => $kid] : []); - if (null === $jwk) { + if (! $jwk instanceof JWK) { throw new RuntimeException('Unable to get a key to verify claim source JWT'); } @@ -147,12 +145,12 @@ protected function claimJWT(OpenIDClient $client, string $jwt): array protected function assignClaims(array $claims, array $sourceNames, array $sources): array { foreach ($sourceNames as $claim => $inSource) { - if (! array_key_exists($inSource, $sources)) { + if (! \array_key_exists($inSource, $sources)) { continue; } - if (! array_key_exists($claim, $sources[$inSource])) { - throw new RuntimeException(sprintf('Unable to find claim "%s" in source "%s"', $claim, $inSource)); + if (! \array_key_exists($claim, $sources[$inSource])) { + throw new RuntimeException(\sprintf('Unable to find claim "%s" in source "%s"', $claim, $inSource)); } /** @psalm-var scalar $value */ @@ -177,12 +175,12 @@ protected function assignClaims(array $claims, array $sourceNames, array $source */ protected function cleanClaims(array $claims): array { - if (array_key_exists('_claim_names', $claims) && 0 === count($claims['_claim_names'] ?? [])) { + if (\array_key_exists('_claim_names', $claims) && 0 === \count($claims['_claim_names'] ?? [])) { /** @var TokenSetClaimsType $claims */ $claims = array_diff_key($claims, array_flip(['_claim_names'])); } - if (array_key_exists('_claim_sources', $claims) && 0 === count($claims['_claim_sources'] ?? [])) { + if (\array_key_exists('_claim_sources', $claims) && 0 === \count($claims['_claim_sources'] ?? [])) { /** @var TokenSetClaimsType $claims */ $claims = array_diff_key($claims, array_flip(['_claim_sources'])); } diff --git a/src/Claims/AggregateParser.php b/src/Claims/AggregateParser.php index 700e46f..42c1fce 100644 --- a/src/Claims/AggregateParser.php +++ b/src/Claims/AggregateParser.php @@ -7,9 +7,6 @@ use Facile\OpenIDClient\Client\ClientInterface; use Override; -use function array_filter; -use function array_key_exists; - /** * @psalm-api */ @@ -18,18 +15,20 @@ final class AggregateParser extends AbstractClaims implements AggregatedParserIn #[Override] public function unpack(ClientInterface $client, array $claims): array { - if (! array_key_exists('_claim_sources', $claims)) { + if (! \array_key_exists('_claim_sources', $claims)) { return $claims; } - if (! array_key_exists('_claim_names', $claims)) { + if (! \array_key_exists('_claim_names', $claims)) { return $claims; } - $aggregatedSources = array_filter($claims['_claim_sources'], fn($value): bool => $this->isAggregateSource($value)); - $claimPayloads = []; - foreach ($aggregatedSources as $sourceName => $source) { + foreach ($claims['_claim_sources'] as $sourceName => $source) { + if (! $this->isAggregateSource($source)) { + continue; + } + $claimPayloads[$sourceName] = $this->claimJWT($client, $source['JWT']); unset($claims['_claim_sources'][$sourceName]); } diff --git a/src/Claims/DistributedParser.php b/src/Claims/DistributedParser.php index 99f94e1..b8ee407 100644 --- a/src/Claims/DistributedParser.php +++ b/src/Claims/DistributedParser.php @@ -18,8 +18,6 @@ use Throwable; use Override; -use function array_filter; -use function array_key_exists; use function Facile\OpenIDClient\check_server_response; /** @@ -27,9 +25,9 @@ */ final class DistributedParser extends AbstractClaims implements DistributedParserInterface { - private ClientInterface $client; + private readonly ClientInterface $client; - private RequestFactoryInterface $requestFactory; + private readonly RequestFactoryInterface $requestFactory; public function __construct( ?IssuerBuilderInterface $issuerBuilder = null, @@ -37,7 +35,7 @@ public function __construct( ?RequestFactoryInterface $requestFactory = null, ?AlgorithmManager $algorithmManager = null, ?JWSVerifier $JWSVerifier = null, - ?JWSSerializer $serializer = null + ?JWSSerializer $serializer = null, ) { parent::__construct($issuerBuilder, $algorithmManager, $JWSVerifier, $serializer); @@ -48,19 +46,21 @@ public function __construct( #[Override] public function fetch(OpenIDClient $client, array $claims, array $accessTokens = []): array { - if (! array_key_exists('_claim_sources', $claims)) { + if (! \array_key_exists('_claim_sources', $claims)) { return $claims; } - if (! array_key_exists('_claim_names', $claims)) { + if (! \array_key_exists('_claim_names', $claims)) { return $claims; } - $distributedSources = array_filter($claims['_claim_sources'], fn($value): bool => $this->isDistributedSource($value)); - /** @var array $responses */ $responses = []; - foreach ($distributedSources as $sourceName => $source) { + foreach ($claims['_claim_sources'] as $sourceName => $source) { + if (! $this->isDistributedSource($source)) { + continue; + } + $request = $this->requestFactory->createRequest('GET', $source['endpoint']) ->withHeader('accept', 'application/jwt'); diff --git a/src/Client/Client.php b/src/Client/Client.php index cc7915d..939a4ef 100644 --- a/src/Client/Client.php +++ b/src/Client/Client.php @@ -20,32 +20,13 @@ use Psr\Http\Client\ClientInterface as HttpClient; use Override; -final class Client implements ClientInterface +final readonly class Client implements ClientInterface { - private IssuerInterface $issuer; - - private ClientMetadataInterface $metadata; - - private JwksProviderInterface $jwksProvider; - - private AuthMethodFactoryInterface $authMethodFactory; - - private ?HttpClient $httpClient; - - /** - * Client constructor. - */ public function __construct( - IssuerInterface $issuer, - ClientMetadataInterface $metadata, - ?JwksProviderInterface $jwksProvider = null, - ?AuthMethodFactoryInterface $authMethodFactory = null, - ?HttpClient $httpClient = null - ) { - $this->issuer = $issuer; - $this->metadata = $metadata; - $this->jwksProvider = $jwksProvider ?? new MemoryJwksProvider(); - $this->authMethodFactory = $authMethodFactory ?? new AuthMethodFactory([ + private IssuerInterface $issuer, + private ClientMetadataInterface $metadata, + private JwksProviderInterface $jwksProvider = new MemoryJwksProvider(), + private AuthMethodFactoryInterface $authMethodFactory = new AuthMethodFactory([ new ClientSecretBasic(), new ClientSecretJwt(), new ClientSecretPost(), @@ -53,9 +34,9 @@ public function __construct( new PrivateKeyJwt(), new TLSClientAuth(), new SelfSignedTLSClientAuth(), - ]); - $this->httpClient = $httpClient; - } + ]), + private ?HttpClient $httpClient = null, + ) {} #[Override] public function getIssuer(): IssuerInterface diff --git a/src/Client/ClientBuilder.php b/src/Client/ClientBuilder.php index f973322..5246979 100644 --- a/src/Client/ClientBuilder.php +++ b/src/Client/ClientBuilder.php @@ -73,11 +73,11 @@ public function setHttpClient(?HttpClient $httpClient): self private function buildJwksProvider(): JwksProviderInterface { - if (null !== $this->jwksProvider) { + if ($this->jwksProvider instanceof JwksProviderInterface) { return $this->jwksProvider; } - if (null === $this->clientMetadata) { + if (! $this->clientMetadata instanceof ClientMetadataInterface) { return new MemoryJwksProvider(['keys' => []]); } @@ -110,11 +110,11 @@ private function buildHttpClient(): HttpClient public function build(): ClientInterface { - if (null === $this->issuer) { + if (! $this->issuer instanceof IssuerInterface) { throw new InvalidArgumentException('Issuer must be provided'); } - if (null === $this->clientMetadata) { + if (! $this->clientMetadata instanceof ClientMetadataInterface) { throw new InvalidArgumentException('Client metadata must be provided'); } @@ -123,7 +123,7 @@ public function build(): ClientInterface $this->clientMetadata, $this->buildJwksProvider(), $this->buildAuthMethodFactory(), - $this->buildHttpClient() + $this->buildHttpClient(), ); } } diff --git a/src/Client/Metadata/ClientMetadata.php b/src/Client/Metadata/ClientMetadata.php index 998a655..5b4d9d1 100644 --- a/src/Client/Metadata/ClientMetadata.php +++ b/src/Client/Metadata/ClientMetadata.php @@ -9,10 +9,8 @@ use Override; use function array_diff; -use function array_key_exists; use function array_keys; use function array_merge; -use function count; use function implode; /** @@ -59,19 +57,17 @@ public function __construct(string $clientId, array $claims = []) * @param array $claims * * @psalm-param ClientMetadataType $claims - * - * @return static */ public static function fromArray(array $claims): self { $missingKeys = array_diff(self::$requiredKeys, array_keys($claims)); - if (0 !== count($missingKeys)) { + if (0 !== \count($missingKeys)) { throw new InvalidArgumentException( - 'Invalid client metadata. Missing keys: ' . implode(', ', $missingKeys) + 'Invalid client metadata. Missing keys: ' . implode(', ', $missingKeys), ); } - return new static($claims['client_id'], $claims); + return new self($claims['client_id'], $claims); } #[Override] @@ -209,7 +205,7 @@ public function toArray(): array #[Override] public function has(string $name): bool { - return array_key_exists($name, $this->metadata); + return \array_key_exists($name, $this->metadata); } /** diff --git a/src/Exception/OAuth2Exception.php b/src/Exception/OAuth2Exception.php index b438032..1d5adc6 100644 --- a/src/Exception/OAuth2Exception.php +++ b/src/Exception/OAuth2Exception.php @@ -10,10 +10,7 @@ use Throwable; use Override; -use function array_key_exists; -use function is_array; use function json_decode; -use function sprintf; /** * @psalm-type OAuth2ErrorType = array{}&array{ @@ -25,11 +22,9 @@ */ final class OAuth2Exception extends RuntimeException implements JsonSerializable { - private string $error; + private readonly string $error; - private ?string $description; - - private ?string $errorUri; + private readonly ?string $description; /** * @psalm-param array $data @@ -38,7 +33,7 @@ final class OAuth2Exception extends RuntimeException implements JsonSerializable */ public static function isOAuth2Error(array $data): bool { - return array_key_exists('error', $data); + return \array_key_exists('error', $data); } /** @@ -48,12 +43,12 @@ public static function fromResponse(ResponseInterface $response, ?Throwable $pre { try { /** @psalm-var false|array{error?: string, error_description?: string, error_uri?: string} $data */ - $data = json_decode((string) $response->getBody(), true, 512, JSON_THROW_ON_ERROR); - } catch (JsonException $e) { + $data = json_decode((string) $response->getBody(), true, 512, \JSON_THROW_ON_ERROR); + } catch (JsonException) { throw new RemoteException($response, $response->getReasonPhrase(), $previous); } - if (! is_array($data) || ! isset($data['error'])) { + if (! \is_array($data) || ! isset($data['error'])) { throw new RemoteException($response, $response->getReasonPhrase(), $previous); } @@ -67,7 +62,7 @@ public static function fromResponse(ResponseInterface $response, ?Throwable $pre */ public static function fromParameters(array $params, ?Throwable $previous = null): self { - if (! static::isOAuth2Error($params)) { + if (! self::isOAuth2Error($params)) { throw new InvalidArgumentException('Invalid OAuth2 exception', 0, $previous); } @@ -76,26 +71,25 @@ public static function fromParameters(array $params, ?Throwable $previous = null $params['error_description'] ?? null, $params['error_uri'] ?? null, 0, - $previous + $previous, ); } public function __construct( string $error, ?string $description = null, - ?string $errorUri = null, + private readonly ?string $errorUri = null, int $code = 0, - ?Throwable $previous = null + ?Throwable $previous = null, ) { $message = $error; if (null !== $description) { - $message = sprintf('%s (%s)', $description, $error); + $message = \sprintf('%s (%s)', $description, $error); } parent::__construct($message, $code, $previous); $this->error = $error; $this->description = $description; - $this->errorUri = $errorUri; } public function getError(): string diff --git a/src/Exception/RemoteException.php b/src/Exception/RemoteException.php index 787a74e..58783dc 100644 --- a/src/Exception/RemoteException.php +++ b/src/Exception/RemoteException.php @@ -12,14 +12,14 @@ */ final class RemoteException extends RuntimeException { - private ResponseInterface $response; + private readonly ResponseInterface $response; public function __construct(ResponseInterface $response, ?string $message = null, ?Throwable $previous = null) { parent::__construct( $message ?? $response->getReasonPhrase(), $response->getStatusCode(), - $previous + $previous, ); $this->response = $response; } diff --git a/src/Issuer/Issuer.php b/src/Issuer/Issuer.php index 6a75186..0419555 100644 --- a/src/Issuer/Issuer.php +++ b/src/Issuer/Issuer.php @@ -8,17 +8,12 @@ use Facile\OpenIDClient\Issuer\Metadata\IssuerMetadataInterface; use Override; -final class Issuer implements IssuerInterface +final readonly class Issuer implements IssuerInterface { - private IssuerMetadataInterface $metadata; - - private JwksProviderInterface $jwksProvider; - - public function __construct(IssuerMetadataInterface $metadata, JwksProviderInterface $jwksProvider) - { - $this->metadata = $metadata; - $this->jwksProvider = $jwksProvider; - } + public function __construct( + private IssuerMetadataInterface $metadata, + private JwksProviderInterface $jwksProvider, + ) {} #[Override] public function getMetadata(): IssuerMetadataInterface diff --git a/src/Issuer/IssuerBuilder.php b/src/Issuer/IssuerBuilder.php index e933969..9f83cd4 100644 --- a/src/Issuer/IssuerBuilder.php +++ b/src/Issuer/IssuerBuilder.php @@ -53,7 +53,7 @@ public function build(string $resource): IssuerInterface return new Issuer( $metadata, - $jwksProvider + $jwksProvider, ); } } diff --git a/src/Issuer/Metadata/IssuerMetadata.php b/src/Issuer/Metadata/IssuerMetadata.php index 8840313..1586975 100644 --- a/src/Issuer/Metadata/IssuerMetadata.php +++ b/src/Issuer/Metadata/IssuerMetadata.php @@ -9,10 +9,8 @@ use Override; use function array_diff; -use function array_key_exists; use function array_keys; use function array_merge; -use function count; use function implode; /** @@ -43,7 +41,7 @@ public function __construct( string $issuer, string $authorizationEndpoint, string $jwksUri, - array $claims = [] + array $claims = [], ) { $requiredClaims = [ 'issuer' => $issuer, @@ -60,21 +58,19 @@ public function __construct( * @param array $claims * * @psalm-param IssuerRemoteMetadataType $claims - * - * @return static */ public static function fromArray(array $claims): self { $missingKeys = array_diff(self::$requiredKeys, array_keys($claims)); - if (0 !== count($missingKeys)) { + if (0 !== \count($missingKeys)) { throw new InvalidArgumentException('Invalid issuer metadata. Missing keys: ' . implode(', ', $missingKeys)); } - return new IssuerMetadata( + return new self( $claims['issuer'], $claims['authorization_endpoint'], $claims['jwks_uri'], - $claims + $claims, ); } @@ -438,7 +434,7 @@ public function toArray(): array #[Override] public function has(string $name): bool { - return array_key_exists($name, $this->metadata); + return \array_key_exists($name, $this->metadata); } #[Override] diff --git a/src/Issuer/Metadata/Provider/CachedProviderDecorator.php b/src/Issuer/Metadata/Provider/CachedProviderDecorator.php index 069d7bd..ff54de8 100644 --- a/src/Issuer/Metadata/Provider/CachedProviderDecorator.php +++ b/src/Issuer/Metadata/Provider/CachedProviderDecorator.php @@ -9,7 +9,6 @@ use Psr\SimpleCache\CacheInterface; use Override; -use function is_array; use function json_decode; use function json_encode; use function sha1; @@ -20,12 +19,6 @@ */ final class CachedProviderDecorator implements RemoteProviderInterface { - private RemoteProviderInterface $provider; - - private CacheInterface $cache; - - private ?int $cacheTtl = null; - /** * @var callable * @@ -37,14 +30,11 @@ final class CachedProviderDecorator implements RemoteProviderInterface * @psalm-param null|callable(string): string $cacheIdGenerator */ public function __construct( - RemoteProviderInterface $provider, - CacheInterface $cache, - ?int $cacheTtl = null, - ?callable $cacheIdGenerator = null + private readonly RemoteProviderInterface $provider, + private readonly CacheInterface $cache, + private readonly ?int $cacheTtl = null, + ?callable $cacheIdGenerator = null, ) { - $this->provider = $provider; - $this->cache = $cache; - $this->cacheTtl = $cacheTtl; $this->cacheIdGenerator = $cacheIdGenerator ?? static fn(string $uri): string => substr(sha1($uri), 0, 65); } @@ -65,19 +55,19 @@ public function fetch(string $uri): array try { /** @psalm-var null|string|IssuerRemoteMetadataType $data */ - $data = json_decode($cached, true, 512, JSON_THROW_ON_ERROR); - } catch (JsonException $e) { + $data = json_decode($cached, true, 512, \JSON_THROW_ON_ERROR); + } catch (JsonException) { $data = null; } - if (is_array($data)) { + if (\is_array($data)) { /** @psalm-var IssuerRemoteMetadataType $data */ return $data; } $data = $this->provider->fetch($uri); - $this->cache->set($cacheId, json_encode($data, JSON_THROW_ON_ERROR), $this->cacheTtl); + $this->cache->set($cacheId, json_encode($data, \JSON_THROW_ON_ERROR), $this->cacheTtl); return $data; } diff --git a/src/Issuer/Metadata/Provider/DiscoveryProvider.php b/src/Issuer/Metadata/Provider/DiscoveryProvider.php index 6afc988..936a4d5 100644 --- a/src/Issuer/Metadata/Provider/DiscoveryProvider.php +++ b/src/Issuer/Metadata/Provider/DiscoveryProvider.php @@ -12,7 +12,6 @@ use Psr\Http\Message\UriFactoryInterface; use Override; -use function array_key_exists; use function Facile\OpenIDClient\parse_metadata_response; use function preg_match; use function rtrim; @@ -20,27 +19,17 @@ /** * @psalm-import-type IssuerRemoteMetadataType from TokenVerifierInterface */ -final class DiscoveryProvider implements DiscoveryProviderInterface +final readonly class DiscoveryProvider implements DiscoveryProviderInterface { private const OIDC_DISCOVERY = '/.well-known/openid-configuration'; private const OAUTH2_DISCOVERY = '/.well-known/oauth-authorization-server'; - private ClientInterface $client; - - private RequestFactoryInterface $requestFactory; - - private UriFactoryInterface $uriFactory; - public function __construct( - ClientInterface $client, - RequestFactoryInterface $requestFactory, - UriFactoryInterface $uriFactory - ) { - $this->client = $client; - $this->requestFactory = $requestFactory; - $this->uriFactory = $uriFactory; - } + private ClientInterface $client, + private RequestFactoryInterface $requestFactory, + private UriFactoryInterface $uriFactory, + ) {} #[Override] public function isAllowedUri(string $uri): bool @@ -75,7 +64,7 @@ public function discovery(string $url): array foreach ($uris as $wellKnownUri) { try { return $this->fetchOpenIdConfiguration((string) $wellKnownUri); - } catch (RuntimeException $e) { + } catch (RuntimeException) { } } @@ -99,7 +88,7 @@ private function fetchOpenIdConfiguration(string $uri): array throw new RuntimeException('Unable to fetch provider metadata', 0, $e); } - if (! array_key_exists('issuer', $data)) { + if (! \array_key_exists('issuer', $data)) { throw new RuntimeException('Invalid metadata content, no "issuer" key found'); } diff --git a/src/Issuer/Metadata/Provider/MetadataProviderBuilder.php b/src/Issuer/Metadata/Provider/MetadataProviderBuilder.php index 69e06c3..5c8ce3a 100644 --- a/src/Issuer/Metadata/Provider/MetadataProviderBuilder.php +++ b/src/Issuer/Metadata/Provider/MetadataProviderBuilder.php @@ -109,7 +109,7 @@ private function buildDiscoveryProvider(): DiscoveryProviderInterface return $this->discoveryProvider ?? new DiscoveryProvider( $this->buildClient(), $this->buildRequestFactory(), - $this->buildUriFactory() + $this->buildUriFactory(), ); } @@ -119,7 +119,7 @@ public function buildWebFingerProvider(): WebFingerProviderInterface $this->buildClient(), $this->buildRequestFactory(), $this->buildUriFactory(), - $this->buildDiscoveryProvider() + $this->buildDiscoveryProvider(), ); } @@ -130,7 +130,7 @@ public function build(): RemoteProviderInterface $this->buildWebFingerProvider(), ]); - if (null !== $this->cache) { + if ($this->cache instanceof CacheInterface) { $provider = new CachedProviderDecorator($provider, $this->cache, $this->cacheTtl); } diff --git a/src/Issuer/Metadata/Provider/RemoteProvider.php b/src/Issuer/Metadata/Provider/RemoteProvider.php index 5ca0fd8..837af9f 100644 --- a/src/Issuer/Metadata/Provider/RemoteProvider.php +++ b/src/Issuer/Metadata/Provider/RemoteProvider.php @@ -10,18 +10,14 @@ use function array_filter; -final class RemoteProvider implements RemoteProviderInterface +final readonly class RemoteProvider implements RemoteProviderInterface { - /** @var RemoteProviderInterface[] */ - private array $providers; - /** * @param RemoteProviderInterface[] $providers */ - public function __construct(array $providers) - { - $this->providers = $providers; - } + public function __construct( + private array $providers, + ) {} #[Override] public function isAllowedUri(string $uri): bool diff --git a/src/Issuer/Metadata/Provider/WebFingerProvider.php b/src/Issuer/Metadata/Provider/WebFingerProvider.php index 0c1f822..ac93c22 100644 --- a/src/Issuer/Metadata/Provider/WebFingerProvider.php +++ b/src/Issuer/Metadata/Provider/WebFingerProvider.php @@ -13,13 +13,10 @@ use Psr\Http\Message\UriFactoryInterface; use Override; -use function array_key_exists; use function array_pop; use function explode; use function Facile\OpenIDClient\parse_metadata_response; use function http_build_query; -use function is_array; -use function is_string; use function parse_url; use function preg_match; use function preg_replace; @@ -29,35 +26,18 @@ /** * @psalm-import-type IssuerRemoteMetadataType from TokenVerifierInterface */ -final class WebFingerProvider implements RemoteProviderInterface, WebFingerProviderInterface +final readonly class WebFingerProvider implements RemoteProviderInterface, WebFingerProviderInterface { - private const OIDC_DISCOVERY = '/.well-known/openid-configuration'; - private const WEBFINGER = '/.well-known/webfinger'; private const REL = 'http://openid.net/specs/connect/1.0/issuer'; - private const AAD_MULTITENANT_DISCOVERY = 'https://login.microsoftonline.com/common/v2.0$' . self::OIDC_DISCOVERY; - - private ClientInterface $client; - - private RequestFactoryInterface $requestFactory; - - private UriFactoryInterface $uriFactory; - - private DiscoveryProviderInterface $discoveryProvider; - public function __construct( - ClientInterface $client, - RequestFactoryInterface $requestFactory, - UriFactoryInterface $uriFactory, - DiscoveryProviderInterface $discoveryProvider - ) { - $this->client = $client; - $this->requestFactory = $requestFactory; - $this->uriFactory = $uriFactory; - $this->discoveryProvider = $discoveryProvider; - } + private ClientInterface $client, + private RequestFactoryInterface $requestFactory, + private UriFactoryInterface $uriFactory, + private DiscoveryProviderInterface $discoveryProvider, + ) {} #[Override] public function isAllowedUri(string $uri): bool @@ -70,13 +50,11 @@ public function fetch(string $uri): array { $uri = $this->normalizeWebfinger($uri); $parts = explode('@', $uri, 2); - if (isset($parts[1])) { - $parsedUrl = parse_url('https://' . $parts[1]); - } else { - $parsedUrl = parse_url($uri); - } + $parsedUrl = isset($parts[1]) + ? parse_url('https://' . $parts[1]) + : parse_url($uri); - if (! is_array($parsedUrl) || ! array_key_exists('host', $parsedUrl)) { + if (! \is_array($parsedUrl) || ! \array_key_exists('host', $parsedUrl)) { throw new RuntimeException('Unable to parse resource'); } @@ -103,9 +81,9 @@ public function fetch(string $uri): array /** @var array $links */ $links = $data['links'] ?? []; - $href = null; + $href = ''; foreach ($links as $link) { - if (! is_array($link)) { + if (! \is_array($link)) { continue; } @@ -113,14 +91,14 @@ public function fetch(string $uri): array continue; } - if (! array_key_exists('href', $link)) { + if (! \array_key_exists('href', $link)) { continue; } $href = $link['href']; } - if (! is_string($href) || 0 !== strpos($href, 'https://')) { + if (! str_starts_with($href, 'https://')) { throw new InvalidArgumentException('Invalid issuer location'); } @@ -137,7 +115,7 @@ public function fetch(string $uri): array private function normalizeWebfinger(string $input): string { $hasScheme = static function (string $resource): bool { - if (false !== strpos($resource, '://')) { + if (str_contains($resource, '://')) { return true; } @@ -153,7 +131,7 @@ private function normalizeWebfinger(string $input): string }; $acctSchemeAssumed = static function (string $input): bool { - if (false === strpos($input, '@')) { + if (! str_contains($input, '@')) { return false; } diff --git a/src/Middleware/AuthRedirectHandler.php b/src/Middleware/AuthRedirectHandler.php index 2c862c4..0e33cb4 100644 --- a/src/Middleware/AuthRedirectHandler.php +++ b/src/Middleware/AuthRedirectHandler.php @@ -23,30 +23,20 @@ /** * @psalm-api */ -final class AuthRedirectHandler implements RequestHandlerInterface +final readonly class AuthRedirectHandler implements RequestHandlerInterface { - private AuthorizationService $authorizationService; - private ResponseFactoryInterface $responseFactory; - private ?ClientInterface $client = null; - - /** @psalm-var positive-int */ - private int $randomBytes; - /** * @psalm-param positive-int $randomBytes */ public function __construct( - AuthorizationService $authorizationService, + private AuthorizationService $authorizationService, ?ResponseFactoryInterface $responseFactory = null, - ?ClientInterface $client = null, - int $randomBytes = 32 + private ?ClientInterface $client = null, + private int $randomBytes = 32, ) { - $this->authorizationService = $authorizationService; $this->responseFactory = $responseFactory ?? Psr17FactoryDiscovery::findResponseFactory(); - $this->client = $client; - $this->randomBytes = $randomBytes; } #[Override] diff --git a/src/Middleware/AuthRequestProviderMiddleware.php b/src/Middleware/AuthRequestProviderMiddleware.php index 70aa539..16f0f2d 100644 --- a/src/Middleware/AuthRequestProviderMiddleware.php +++ b/src/Middleware/AuthRequestProviderMiddleware.php @@ -14,14 +14,11 @@ /** * @psalm-api */ -final class AuthRequestProviderMiddleware implements MiddlewareInterface +final readonly class AuthRequestProviderMiddleware implements MiddlewareInterface { - private AuthRequestInterface $authRequest; - - public function __construct(AuthRequestInterface $authRequest) - { - $this->authRequest = $authRequest; - } + public function __construct( + private AuthRequestInterface $authRequest, + ) {} #[Override] public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface diff --git a/src/Middleware/CallbackMiddleware.php b/src/Middleware/CallbackMiddleware.php index f093d9d..394c723 100644 --- a/src/Middleware/CallbackMiddleware.php +++ b/src/Middleware/CallbackMiddleware.php @@ -20,25 +20,12 @@ */ class CallbackMiddleware implements MiddlewareInterface { - private AuthorizationService $authorizationService; - - private ?string $redirectUri; - - private ?ClientInterface $client; - - private ?int $maxAge; - public function __construct( - AuthorizationService $authorizationService, - ?ClientInterface $client = null, - ?string $redirectUri = null, - ?int $maxAge = null - ) { - $this->authorizationService = $authorizationService; - $this->client = $client; - $this->redirectUri = $redirectUri; - $this->maxAge = $maxAge; - } + private readonly AuthorizationService $authorizationService, + private readonly ?ClientInterface $client = null, + private readonly ?string $redirectUri = null, + private readonly ?int $maxAge = null, + ) {} #[Override] public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface @@ -60,7 +47,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface $params, $this->redirectUri, $authSession, - $this->maxAge + $this->maxAge, ); return $handler->handle($request->withAttribute(TokenSetInterface::class, $tokenSet)); diff --git a/src/Middleware/ClientProviderMiddleware.php b/src/Middleware/ClientProviderMiddleware.php index f40ab67..f3bd5c0 100644 --- a/src/Middleware/ClientProviderMiddleware.php +++ b/src/Middleware/ClientProviderMiddleware.php @@ -14,14 +14,11 @@ /** * @psalm-api */ -final class ClientProviderMiddleware implements MiddlewareInterface +final readonly class ClientProviderMiddleware implements MiddlewareInterface { - private ClientInterface $client; - - public function __construct(ClientInterface $client) - { - $this->client = $client; - } + public function __construct( + private ClientInterface $client, + ) {} #[Override] public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface diff --git a/src/Middleware/SessionCookieMiddleware.php b/src/Middleware/SessionCookieMiddleware.php index 6628f1c..62038e8 100644 --- a/src/Middleware/SessionCookieMiddleware.php +++ b/src/Middleware/SessionCookieMiddleware.php @@ -4,6 +4,7 @@ namespace Facile\OpenIDClient\Middleware; +use Dflydev\FigCookies\Cookie; use Dflydev\FigCookies\Cookies; use Dflydev\FigCookies\FigResponseCookies; use Dflydev\FigCookies\Modifier\SameSite; @@ -21,7 +22,6 @@ use function bin2hex; use function class_exists; -use function is_array; use function json_decode; use function json_encode; use function random_bytes; @@ -31,22 +31,15 @@ * * @psalm-import-type AuthSessionType from AuthSessionInterface */ -final class SessionCookieMiddleware implements MiddlewareInterface +final readonly class SessionCookieMiddleware implements MiddlewareInterface { public const SESSION_ATTRIBUTE = AuthSessionInterface::class; - private string $cookieName; - - private int $ttl; - - private CacheInterface $cache; - - public function __construct(CacheInterface $cache, string $cookieName = 'openid', int $ttl = 300) - { - $this->cache = $cache; - $this->cookieName = $cookieName; - $this->ttl = $ttl; - } + public function __construct( + private CacheInterface $cache, + private string $cookieName = 'openid', + private int $ttl = 300, + ) {} #[Override] public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface @@ -58,13 +51,13 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface $cookies = Cookies::fromRequest($request); $sessionCookie = $cookies->get($this->cookieName); - $sessionId = null !== $sessionCookie ? $sessionCookie->getValue() : null; + $sessionId = $sessionCookie instanceof Cookie ? $sessionCookie->getValue() : null; /** @var string|null $sessionValue */ $sessionValue = null !== $sessionId ? $this->cache->get($sessionId) : null; /** @var false|AuthSessionType $data */ - $data = null !== $sessionValue ? json_decode($sessionValue, true, 512, JSON_THROW_ON_ERROR) : []; + $data = null !== $sessionValue ? json_decode($sessionValue, true, 512, \JSON_THROW_ON_ERROR) : []; - if (! is_array($data)) { + if (! \is_array($data)) { $data = []; } @@ -74,7 +67,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface $sessionId ??= bin2hex(random_bytes(32)); - $sessionValue = json_encode($authSession, JSON_THROW_ON_ERROR); + $sessionValue = json_encode($authSession, \JSON_THROW_ON_ERROR); if (false === $this->cache->set($sessionId, $sessionValue, $this->ttl)) { throw new RuntimeException('Unable to save session'); @@ -87,8 +80,6 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface ->withPath('/') ->withSameSite(SameSite::strict()); - $response = FigResponseCookies::set($response, $sessionCookie); - - return $response; + return FigResponseCookies::set($response, $sessionCookie); } } diff --git a/src/Middleware/UserInfoMiddleware.php b/src/Middleware/UserInfoMiddleware.php index f567039..d4ac3b3 100644 --- a/src/Middleware/UserInfoMiddleware.php +++ b/src/Middleware/UserInfoMiddleware.php @@ -18,21 +18,14 @@ /** * @psalm-api */ -final class UserInfoMiddleware implements MiddlewareInterface +final readonly class UserInfoMiddleware implements MiddlewareInterface { public const USERINFO_ATTRIBUTE = self::class; - private UserInfoService $userInfoService; - - private ?ClientInterface $client; - public function __construct( - UserInfoService $userInfoService, - ?ClientInterface $client = null - ) { - $this->userInfoService = $userInfoService; - $this->client = $client; - } + private UserInfoService $userInfoService, + private ?ClientInterface $client = null, + ) {} #[Override] public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface diff --git a/src/RequestObject/RequestObjectFactory.php b/src/RequestObject/RequestObjectFactory.php index 51c9ba9..a3cc73b 100644 --- a/src/RequestObject/RequestObjectFactory.php +++ b/src/RequestObject/RequestObjectFactory.php @@ -8,6 +8,7 @@ use Facile\OpenIDClient\Client\ClientInterface; use Facile\OpenIDClient\Exception\RuntimeException; use Jose\Component\Core\AlgorithmManager; +use Jose\Component\Core\JWK; use Jose\Component\Core\JWKSet; use Jose\Component\Encryption\JWEBuilder; use Jose\Component\Encryption\Serializer\CompactSerializer as EncryptionCompactSerializer; @@ -25,13 +26,12 @@ use function json_encode; use function preg_match; use function random_bytes; -use function strpos; use function time; /** * @psalm-api */ -final class RequestObjectFactory +final readonly class RequestObjectFactory { private AlgorithmManager $algorithmManager; @@ -39,22 +39,16 @@ final class RequestObjectFactory private JWEBuilder $jweBuilder; - private JWSSerializer $signatureSerializer; - - private JWESerializer $encryptionSerializer; - public function __construct( ?AlgorithmManager $algorithmManager = null, ?JWSBuilder $jwsBuilder = null, ?JWEBuilder $jweBuilder = null, - ?JWSSerializer $signatureSerializer = null, - ?JWESerializer $encryptionSerializer = null + private JWSSerializer $signatureSerializer = new SignatureCompactSerializer(), + private JWESerializer $encryptionSerializer = new EncryptionCompactSerializer(), ) { $this->algorithmManager = $algorithmManager ?? (new AlgorithmManagerBuilder())->build(); $this->jwsBuilder = $jwsBuilder ?? new JWSBuilder($this->algorithmManager); $this->jweBuilder = $jweBuilder ?? new JWEBuilder($this->algorithmManager); - $this->signatureSerializer = $signatureSerializer ?? new SignatureCompactSerializer(); - $this->encryptionSerializer = $encryptionSerializer ?? new EncryptionCompactSerializer(); } /** @@ -86,7 +80,7 @@ private function createPayload(ClientInterface $client, array $params = []): str ]); try { - $payload = json_encode($payloadParams, JSON_THROW_ON_ERROR); + $payload = json_encode($payloadParams, \JSON_THROW_ON_ERROR); } catch (JsonException $e) { throw new RuntimeException('Unable to encode payload', 0, $e); } @@ -103,20 +97,20 @@ private function createSignedToken(ClientInterface $client, string $payload): st if ('none' === $alg) { return implode('.', [ - base64url_encode(json_encode(['alg' => $alg], JSON_THROW_ON_ERROR)), + base64url_encode(json_encode(['alg' => $alg], \JSON_THROW_ON_ERROR)), base64url_encode($payload), '', ]); } - if (0 === strpos($alg, 'HS')) { + if (str_starts_with($alg, 'HS')) { $jwk = jose_secret_key($metadata->getClientSecret() ?? ''); } else { $jwk = JWKSet::createFromKeyData($client->getJwksProvider()->getJwks()) ->selectKey('sig', $this->algorithmManager->get($alg)); } - if (null === $jwk) { + if (! $jwk instanceof JWK) { throw new RuntimeException('No key to sign with alg ' . $alg); } @@ -156,11 +150,11 @@ private function createEncryptedToken(ClientInterface $client, string $payload): } else { $jwk = jose_secret_key( $metadata->getClientSecret() ?? '', - 'dir' === $alg ? $enc : $alg + 'dir' === $alg ? $enc : $alg, ); } - if (null === $jwk) { + if (! $jwk instanceof JWK) { throw new RuntimeException('No key to encrypt with alg ' . $alg); } diff --git a/src/Service/AuthorizationService.php b/src/Service/AuthorizationService.php index 142fa87..f90a450 100644 --- a/src/Service/AuthorizationService.php +++ b/src/Service/AuthorizationService.php @@ -20,14 +20,11 @@ use Psr\Http\Message\ServerRequestInterface; use function array_filter; -use function array_key_exists; use function array_merge; use function Facile\OpenIDClient\get_endpoint_uri; use function Facile\OpenIDClient\parse_callback_params; use function Facile\OpenIDClient\parse_metadata_response; use function http_build_query; -use function is_array; -use function is_string; use function json_encode; /** @@ -56,31 +53,15 @@ * } * @psalm-type CallbackParamsType = array */ -final class AuthorizationService +final readonly class AuthorizationService { - private TokenSetFactoryInterface $tokenSetFactory; - - private ClientInterface $client; - - private RequestFactoryInterface $requestFactory; - - private IdTokenVerifierBuilderInterface $idTokenVerifierBuilder; - - private TokenVerifierBuilderInterface $responseVerifierBuilder; - public function __construct( - TokenSetFactoryInterface $tokenSetFactory, - ClientInterface $client, - RequestFactoryInterface $requestFactory, - IdTokenVerifierBuilderInterface $idTokenVerifierBuilder, - TokenVerifierBuilderInterface $responseVerifierBuilder - ) { - $this->tokenSetFactory = $tokenSetFactory; - $this->client = $client; - $this->requestFactory = $requestFactory; - $this->idTokenVerifierBuilder = $idTokenVerifierBuilder; - $this->responseVerifierBuilder = $responseVerifierBuilder; - } + private TokenSetFactoryInterface $tokenSetFactory, + private ClientInterface $client, + private RequestFactoryInterface $requestFactory, + private IdTokenVerifierBuilderInterface $idTokenVerifierBuilder, + private TokenVerifierBuilderInterface $responseVerifierBuilder, + ) {} /** * @param array $params @@ -108,14 +89,14 @@ public function getAuthorizationUri(OpenIDClient $client, array $params = []): s foreach ($params as $key => $value) { if (null === $value) { unset($params[$key]); - } elseif ('claims' === $key && (is_array($value) || $value instanceof JsonSerializable)) { - $params['claims'] = json_encode($value, JSON_THROW_ON_ERROR); - } elseif (! is_string($value)) { + } elseif ('claims' === $key && (\is_array($value) || $value instanceof JsonSerializable)) { + $params['claims'] = json_encode($value, \JSON_THROW_ON_ERROR); + } elseif (! \is_string($value)) { $params[$key] = (string) $value; } } - if (! array_key_exists('nonce', $params) && 'code' !== ($params['response_type'] ?? '')) { + if (! \array_key_exists('nonce', $params) && 'code' !== ($params['response_type'] ?? '')) { throw new InvalidArgumentException('nonce MUST be provided for implicit and hybrid flows'); } @@ -151,13 +132,13 @@ public function callback( array $params, ?string $redirectUri = null, ?AuthSessionInterface $authSession = null, - ?int $maxAge = null + ?int $maxAge = null, ): TokenSetInterface { $allowedParams = ['code', 'state', 'token_type', 'access_token', 'id_token', 'refresh_token', 'expires_in', 'code_verifier']; /** @psalm-var AuthorizationResponseType $safeParams */ $safeParams = array_intersect_key( $params, - array_fill_keys($allowedParams, true) + array_fill_keys($allowedParams, true), ); $tokenSet = $this->tokenSetFactory->fromArray($safeParams); @@ -191,7 +172,7 @@ public function fetchToken( TokenSetInterface $tokenSet, ?string $redirectUri = null, ?AuthSessionInterface $authSession = null, - ?int $maxAge = null + ?int $maxAge = null, ): TokenSetInterface { $code = $tokenSet->getCode(); @@ -213,7 +194,7 @@ public function fetchToken( 'redirect_uri' => $redirectUri, ]; - if (null !== $authSession && null !== $authSession->getCodeVerifier()) { + if ($authSession instanceof AuthSessionInterface && null !== $authSession->getCodeVerifier()) { $params['code_verifier'] = $authSession->getCodeVerifier(); } @@ -303,7 +284,7 @@ public function grant(OpenIDClient $client, array $params = []): TokenSetInterfa */ private function isAuthorizationResponseObject(array $params): bool { - return array_key_exists('response', $params); + return \array_key_exists('response', $params); } /** diff --git a/src/Service/Builder/AuthorizationServiceBuilder.php b/src/Service/Builder/AuthorizationServiceBuilder.php index a5780c9..eb41f98 100644 --- a/src/Service/Builder/AuthorizationServiceBuilder.php +++ b/src/Service/Builder/AuthorizationServiceBuilder.php @@ -66,7 +66,7 @@ public function build(): AuthorizationService $this->getHttpClient(), $this->getRequestFactory(), $this->getIdTokenVerifierBuilder(), - $this->getResponseVerifierBuilder() + $this->getResponseVerifierBuilder(), ); } } diff --git a/src/Service/Builder/IntrospectionServiceBuilder.php b/src/Service/Builder/IntrospectionServiceBuilder.php index 9150aec..36a14b3 100644 --- a/src/Service/Builder/IntrospectionServiceBuilder.php +++ b/src/Service/Builder/IntrospectionServiceBuilder.php @@ -15,7 +15,7 @@ public function build(): IntrospectionService { return new IntrospectionService( $this->getHttpClient(), - $this->getRequestFactory() + $this->getRequestFactory(), ); } } diff --git a/src/Service/Builder/RegistrationServiceBuilder.php b/src/Service/Builder/RegistrationServiceBuilder.php index b52ff21..498ac85 100644 --- a/src/Service/Builder/RegistrationServiceBuilder.php +++ b/src/Service/Builder/RegistrationServiceBuilder.php @@ -15,7 +15,7 @@ public function build(): RegistrationService { return new RegistrationService( $this->getHttpClient(), - $this->getRequestFactory() + $this->getRequestFactory(), ); } } diff --git a/src/Service/Builder/RevocationServiceBuilder.php b/src/Service/Builder/RevocationServiceBuilder.php index 854fedd..5114de6 100644 --- a/src/Service/Builder/RevocationServiceBuilder.php +++ b/src/Service/Builder/RevocationServiceBuilder.php @@ -15,7 +15,7 @@ public function build(): RevocationService { return new RevocationService( $this->getHttpClient(), - $this->getRequestFactory() + $this->getRequestFactory(), ); } } diff --git a/src/Service/Builder/UserInfoServiceBuilder.php b/src/Service/Builder/UserInfoServiceBuilder.php index a75e8f7..d2c2728 100644 --- a/src/Service/Builder/UserInfoServiceBuilder.php +++ b/src/Service/Builder/UserInfoServiceBuilder.php @@ -25,7 +25,7 @@ public function build(): UserInfoService return new UserInfoService( $this->getUserInfoVerifierBuilder(), $this->getHttpClient(), - $this->getRequestFactory() + $this->getRequestFactory(), ); } } diff --git a/src/Service/IntrospectionService.php b/src/Service/IntrospectionService.php index 281494e..23402e1 100644 --- a/src/Service/IntrospectionService.php +++ b/src/Service/IntrospectionService.php @@ -20,19 +20,12 @@ * * @psalm-api */ -final class IntrospectionService +final readonly class IntrospectionService { - private ClientInterface $client; - - private RequestFactoryInterface $requestFactory; - public function __construct( - ClientInterface $client, - RequestFactoryInterface $requestFactory - ) { - $this->client = $client; - $this->requestFactory = $requestFactory; - } + private ClientInterface $client, + private RequestFactoryInterface $requestFactory, + ) {} /** * @param array $params diff --git a/src/Service/RegistrationService.php b/src/Service/RegistrationService.php index 7e09491..0811e2f 100644 --- a/src/Service/RegistrationService.php +++ b/src/Service/RegistrationService.php @@ -15,7 +15,6 @@ use function array_diff_key; use function array_flip; use function array_intersect_key; -use function array_key_exists; use function array_merge; use function Facile\OpenIDClient\check_server_response; use function Facile\OpenIDClient\parse_metadata_response; @@ -31,10 +30,6 @@ */ final class RegistrationService { - private ClientInterface $client; - - private RequestFactoryInterface $requestFactory; - /** @var string[] */ private static array $registrationClaims = [ 'registration_access_token', @@ -44,12 +39,9 @@ final class RegistrationService ]; public function __construct( - ClientInterface $client, - RequestFactoryInterface $requestFactory - ) { - $this->client = $client; - $this->requestFactory = $requestFactory; - } + private readonly ClientInterface $client, + private readonly RequestFactoryInterface $requestFactory, + ) {} /** * @param array $metadata @@ -59,7 +51,7 @@ public function __construct( public function register( IssuerInterface $issuer, array $metadata, - ?string $initialToken = null + ?string $initialToken = null, ): array { $registrationEndpoint = $issuer->getMetadata()->getRegistrationEndpoint(); @@ -68,7 +60,7 @@ public function register( } try { - $encodedMetadata = json_encode($metadata, JSON_THROW_ON_ERROR); + $encodedMetadata = json_encode($metadata, \JSON_THROW_ON_ERROR); } catch (JsonException $e) { throw new RuntimeException('Unable to encode client metadata', 0, $e); } @@ -91,7 +83,7 @@ public function register( $data = parse_metadata_response($response, 201); - if (! array_key_exists('client_id', $data)) { + if (! \array_key_exists('client_id', $data)) { throw new RuntimeException('Registration response did not return a client_id field'); } @@ -115,7 +107,7 @@ public function read(string $clientUri, string $accessToken): array $claims = parse_metadata_response($response, 200); - if (! array_key_exists('client_id', $claims)) { + if (! \array_key_exists('client_id', $claims)) { throw new RuntimeException('Registration response did not return a client_id field'); } @@ -130,13 +122,13 @@ public function read(string $clientUri, string $accessToken): array public function update( string $clientUri, string $accessToken, - array $metadata + array $metadata, ): array { $clientRegistrationMetadata = array_intersect_key($metadata, array_flip(self::$registrationClaims)); $metadata = array_diff_key($metadata, $clientRegistrationMetadata); try { - $encodedMetadata = json_encode($metadata, JSON_THROW_ON_ERROR); + $encodedMetadata = json_encode($metadata, \JSON_THROW_ON_ERROR); } catch (JsonException $e) { throw new RuntimeException('Unable to encode client metadata', 0, $e); } @@ -156,7 +148,7 @@ public function update( $data = parse_metadata_response($response, 200); - if (! array_key_exists('client_id', $data)) { + if (! \array_key_exists('client_id', $data)) { throw new RuntimeException('Registration response did not return a client_id field'); } diff --git a/src/Service/RevocationService.php b/src/Service/RevocationService.php index bc6bd1f..ee9dfb8 100644 --- a/src/Service/RevocationService.php +++ b/src/Service/RevocationService.php @@ -20,19 +20,12 @@ * * @psalm-api */ -final class RevocationService +final readonly class RevocationService { - private ClientInterface $client; - - private RequestFactoryInterface $requestFactory; - public function __construct( - ClientInterface $client, - RequestFactoryInterface $requestFactory - ) { - $this->client = $client; - $this->requestFactory = $requestFactory; - } + private ClientInterface $client, + private RequestFactoryInterface $requestFactory, + ) {} /** * @param array $params diff --git a/src/Service/UserInfoService.php b/src/Service/UserInfoService.php index 592ac63..1776144 100644 --- a/src/Service/UserInfoService.php +++ b/src/Service/UserInfoService.php @@ -17,28 +17,17 @@ use function http_build_query; use function json_decode; -use function sprintf; /** * @psalm-import-type TokenSetClaimsType from TokenSetInterface */ -final class UserInfoService +final readonly class UserInfoService { - private ClientInterface $client; - - private RequestFactoryInterface $requestFactory; - - private TokenVerifierBuilderInterface $userInfoVerifierBuilder; - public function __construct( - TokenVerifierBuilderInterface $userInfoVerifierBuilder, - ClientInterface $client, - RequestFactoryInterface $requestFactory - ) { - $this->userInfoVerifierBuilder = $userInfoVerifierBuilder; - $this->client = $client; - $this->requestFactory = $requestFactory; - } + private TokenVerifierBuilderInterface $userInfoVerifierBuilder, + private ClientInterface $client, + private RequestFactoryInterface $requestFactory, + ) {} /** * @return array @@ -100,7 +89,7 @@ public function getUserInfo(OpenIDClient $client, TokenSetInterface $tokenSet, b } else { try { /** @var TokenSetClaimsType $payload */ - $payload = json_decode((string) $response->getBody(), true, 512, JSON_THROW_ON_ERROR); + $payload = json_decode((string) $response->getBody(), true, 512, \JSON_THROW_ON_ERROR); } catch (JsonException $e) { throw new RuntimeException('Unable to parse userinfo claims', 0, $e); } @@ -121,7 +110,7 @@ public function getUserInfo(OpenIDClient $client, TokenSetInterface $tokenSet, b if ($expectedSub !== ($payload['sub'] ?? null)) { throw new RuntimeException( - sprintf('Userinfo sub mismatch, expected %s, got: %s', $expectedSub, $payload['sub'] ?? '') + \sprintf('Userinfo sub mismatch, expected %s, got: %s', $expectedSub, $payload['sub'] ?? ''), ); } diff --git a/src/Session/AuthSession.php b/src/Session/AuthSession.php index 659aa21..05f6196 100644 --- a/src/Session/AuthSession.php +++ b/src/Session/AuthSession.php @@ -76,7 +76,7 @@ public function setCustoms(array $customs): void #[Override] public static function fromArray(array $array): AuthSessionInterface { - $session = new static(); + $session = new self(); $session->setState($array['state'] ?? null); $session->setNonce($array['nonce'] ?? null); $session->setCodeVerifier($array['code_verifier'] ?? null); diff --git a/src/Token/TokenSet.php b/src/Token/TokenSet.php index 3cbabe6..2c396d8 100644 --- a/src/Token/TokenSet.php +++ b/src/Token/TokenSet.php @@ -7,8 +7,6 @@ use JsonSerializable; use Override; -use function array_key_exists; - /** * @psalm-import-type TokenSetType from TokenSetInterface * @psalm-import-type TokenSetAttributesType from TokenSetInterface @@ -18,28 +16,16 @@ final class TokenSet implements TokenSetInterface, JsonSerializable { /** - * @var array - * - * @psalm-var TokenSetAttributesType - */ - private array $attributes; - - /** - * @var array + * @param array $attributes + * @param array $claims * - * @psalm-var TokenSetClaimsType - */ - private array $claims; - - /** * @psalm-param TokenSetAttributesType $attributes * @psalm-param TokenSetClaimsType $claims */ - private function __construct(array $attributes, array $claims) - { - $this->attributes = $attributes; - $this->claims = $claims; - } + private function __construct( + private array $attributes, + private array $claims, + ) {} /** * @param array $data @@ -49,14 +35,14 @@ private function __construct(array $attributes, array $claims) public static function fromParams(array $data): TokenSetInterface { $claims = []; - if (array_key_exists('claims', $data)) { + if (\array_key_exists('claims', $data)) { $claims = $data['claims']; unset($data['claims']); } /** @psalm-var TokenSetAttributesType $data */ - return new static($data, $claims); + return new self($data, $claims); } #[Override] diff --git a/src/functions/base64url_decode.php b/src/functions/base64url_decode.php index 2843309..2fce630 100644 --- a/src/functions/base64url_decode.php +++ b/src/functions/base64url_decode.php @@ -8,12 +8,11 @@ use function base64_decode; use function str_pad; -use function strlen; use function strtr; function base64url_decode(string $data): string { - $decoded = base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '='), true); + $decoded = base64_decode(str_pad(strtr($data, '-_', '+/'), \strlen($data) % 4, '='), true); if (false === $decoded) { throw new RuntimeException('Unable to base64url_decode'); diff --git a/src/functions/get_endpoint_uri.php b/src/functions/get_endpoint_uri.php index 7f1dcbd..29ab18d 100644 --- a/src/functions/get_endpoint_uri.php +++ b/src/functions/get_endpoint_uri.php @@ -7,9 +7,6 @@ use Facile\OpenIDClient\Client\ClientInterface as OpenIDClient; use Facile\OpenIDClient\Exception\RuntimeException; -use function is_string; -use function strpos; - /** * Handle endpoint URI based on auth method. * @@ -22,7 +19,7 @@ function get_endpoint_uri(OpenIDClient $client, string $endpointMetadata): strin $endpoint = null; - if (null !== $authMethod && false !== strpos($authMethod, 'tls_client_auth')) { + if (null !== $authMethod && str_contains($authMethod, 'tls_client_auth')) { $endpoint = $client->getIssuer() ->getMetadata() ->getMtlsEndpointAliases()['token_endpoint'] ?? null; @@ -33,7 +30,7 @@ function get_endpoint_uri(OpenIDClient $client, string $endpointMetadata): strin $endpoint = $client->getIssuer()->getMetadata()->get($endpointMetadata); } - if (! is_string($endpoint)) { + if (! \is_string($endpoint)) { throw new RuntimeException('Unable to retrieve the token endpoint'); } diff --git a/src/functions/jose_secret_key.php b/src/functions/jose_secret_key.php index 3727432..98748ac 100644 --- a/src/functions/jose_secret_key.php +++ b/src/functions/jose_secret_key.php @@ -23,10 +23,8 @@ function jose_secret_key(string $secret, ?string $alg = null): JWK return derived_key($secret, (int) ($matches[2] ?? $matches[1])); } - $key = new JWK([ + return new JWK([ 'k' => base64url_encode($secret), 'kty' => 'oct', ]); - - return $key; } diff --git a/src/functions/parse_callback_params.php b/src/functions/parse_callback_params.php index 7438718..fa3ee19 100644 --- a/src/functions/parse_callback_params.php +++ b/src/functions/parse_callback_params.php @@ -7,7 +7,6 @@ use Facile\OpenIDClient\Exception\RuntimeException; use Psr\Http\Message\ServerRequestInterface; -use function in_array; use function parse_str; use function strtoupper; @@ -20,7 +19,7 @@ function parse_callback_params(ServerRequestInterface $serverRequest): array { $method = strtoupper($serverRequest->getMethod()); - if (! in_array($method, ['GET', 'POST'], true)) { + if (! \in_array($method, ['GET', 'POST'], true)) { throw new RuntimeException('Invalid callback method'); } diff --git a/src/functions/parse_metadata_response.php b/src/functions/parse_metadata_response.php index 32d6679..1dfda44 100644 --- a/src/functions/parse_metadata_response.php +++ b/src/functions/parse_metadata_response.php @@ -8,7 +8,6 @@ use JsonException; use Psr\Http\Message\ResponseInterface; -use function is_array; use function json_decode; /** @@ -24,12 +23,12 @@ function parse_metadata_response(ResponseInterface $response, ?int $expectedCode try { /** @var null|(array{}&array{error?: string, error_description?: string, error_uri?: string, response?: string}) $data */ - $data = json_decode((string) $response->getBody(), true, 512, JSON_THROW_ON_ERROR); + $data = json_decode((string) $response->getBody(), true, 512, \JSON_THROW_ON_ERROR); } catch (JsonException $e) { throw new InvalidArgumentException('Invalid metadata content', 0, $e); } - if (! is_array($data)) { + if (! \is_array($data)) { throw new InvalidArgumentException('Invalid metadata content'); } diff --git a/tests/AuthMethod/AuthMethodFactoryTest.php b/tests/AuthMethod/AuthMethodFactoryTest.php index 9d0d755..38c8d39 100644 --- a/tests/AuthMethod/AuthMethodFactoryTest.php +++ b/tests/AuthMethod/AuthMethodFactoryTest.php @@ -24,9 +24,9 @@ public function testFactory(): void $authMethod2->reveal(), ]); - static::assertCount(2, $factory->all()); - static::assertSame($authMethod1->reveal(), $factory->create('foo')); - static::assertSame($authMethod2->reveal(), $factory->create('bar')); + self::assertCount(2, $factory->all()); + self::assertSame($authMethod1->reveal(), $factory->create('foo')); + self::assertSame($authMethod2->reveal(), $factory->create('bar')); } public function testCreateWithUnknownAuthMethod(): void diff --git a/tests/AuthMethod/ClientSecretBasicTest.php b/tests/AuthMethod/ClientSecretBasicTest.php index a59c8a7..faac9ba 100644 --- a/tests/AuthMethod/ClientSecretBasicTest.php +++ b/tests/AuthMethod/ClientSecretBasicTest.php @@ -19,7 +19,7 @@ class ClientSecretBasicTest extends TestCase public function testGetSupportedMethod(): void { $auth = new ClientSecretBasic(); - static::assertSame('client_secret_basic', $auth->getSupportedMethod()); + self::assertSame('client_secret_basic', $auth->getSupportedMethod()); } public function testCreateRequest(): void @@ -48,10 +48,10 @@ public function testCreateRequest(): void $result = $auth->createRequest( $request->reveal(), $client->reveal(), - ['foo' => 'bar'] + ['foo' => 'bar'], ); - static::assertSame($requestWithHeader->reveal(), $result); + self::assertSame($requestWithHeader->reveal(), $result); } public function testCreateRequestWithNoClientSecret(): void @@ -71,7 +71,7 @@ public function testCreateRequestWithNoClientSecret(): void $auth->createRequest( $request->reveal(), $client->reveal(), - [] + [], ); } } diff --git a/tests/AuthMethod/ClientSecretJwtTest.php b/tests/AuthMethod/ClientSecretJwtTest.php index 1a787d9..f56b69a 100644 --- a/tests/AuthMethod/ClientSecretJwtTest.php +++ b/tests/AuthMethod/ClientSecretJwtTest.php @@ -30,7 +30,7 @@ class ClientSecretJwtTest extends TestCase public function testGetSupportedMethod(): void { $auth = new ClientSecretJwt(); - static::assertSame('client_secret_jwt', $auth->getSupportedMethod()); + self::assertSame('client_secret_jwt', $auth->getSupportedMethod()); } public function testCreateRequest(): void @@ -40,7 +40,7 @@ public function testCreateRequest(): void $auth = new ClientSecretJwt( $jwsBuilder->reveal(), - $serializer->reveal() + $serializer->reveal(), ); $issuerMetadata = IssuerMetadata::fromArray([ @@ -70,25 +70,25 @@ public function testCreateRequest(): void $jws = $this->prophesize(JWS::class); $jwsBuilder->create()->shouldBeCalled()->willReturn($jwsBuilder2->reveal()); - $jwsBuilder2->withPayload(Argument::that(function (string $payload) { + $jwsBuilder2->withPayload(Argument::that(function (string $payload): true { $decoded = json_decode($payload, true); - static::assertIsArray($decoded); + self::assertIsArray($decoded); - static::assertArrayHasKey('iss', $decoded); - static::assertArrayHasKey('sub', $decoded); - static::assertArrayHasKey('aud', $decoded); - static::assertArrayHasKey('iat', $decoded); - static::assertArrayHasKey('exp', $decoded); - static::assertArrayHasKey('jti', $decoded); + self::assertArrayHasKey('iss', $decoded); + self::assertArrayHasKey('sub', $decoded); + self::assertArrayHasKey('aud', $decoded); + self::assertArrayHasKey('iat', $decoded); + self::assertArrayHasKey('exp', $decoded); + self::assertArrayHasKey('jti', $decoded); - static::assertSame('bar', $decoded['foo'] ?? null); - static::assertSame('foo', $decoded['iss'] ?? null); - static::assertSame('foo', $decoded['sub'] ?? null); - static::assertSame('https://issuer.com/token', $decoded['aud'] ?? null); - static::assertLessThanOrEqual(time(), $decoded['iat']); - static::assertLessThanOrEqual(time() + 60, $decoded['exp']); - static::assertGreaterThan(time(), $decoded['exp']); + self::assertSame('bar', $decoded['foo'] ?? null); + self::assertSame('foo', $decoded['iss'] ?? null); + self::assertSame('foo', $decoded['sub'] ?? null); + self::assertSame('https://issuer.com/token', $decoded['aud'] ?? null); + self::assertLessThanOrEqual(time(), $decoded['iat']); + self::assertLessThanOrEqual(time() + 60, $decoded['exp']); + self::assertGreaterThan(time(), $decoded['exp']); return true; })) @@ -97,16 +97,16 @@ public function testCreateRequest(): void $jwsBuilder3->addSignature(Argument::allOf( Argument::type(JWK::class), - Argument::that(function (JWK $jwk) { - static::assertSame('oct', $jwk->get('kty')); - static::assertSame(base64url_encode('bar'), $jwk->get('k')); + Argument::that(function (JWK $jwk): true { + self::assertSame('oct', $jwk->get('kty')); + self::assertSame(base64url_encode('bar'), $jwk->get('k')); return true; - }) + }), ), Argument::allOf( Argument::type('array'), Argument::withEntry('alg', 'HS256'), - Argument::withKey('jti') + Argument::withKey('jti'), )) ->shouldBeCalled() ->willReturn($jwsBuilder4); @@ -130,10 +130,10 @@ public function testCreateRequest(): void $result = $auth->createRequest( $request->reveal(), $client->reveal(), - ['foo' => 'bar'] + ['foo' => 'bar'], ); - static::assertSame($request->reveal(), $result); + self::assertSame($request->reveal(), $result); } public function testCreateRequestWithNoClientSecret(): void @@ -145,7 +145,7 @@ public function testCreateRequestWithNoClientSecret(): void $auth = new ClientSecretJwt( $jwsBuilder->reveal(), - $serializer->reveal() + $serializer->reveal(), ); $request = $this->prophesize(RequestInterface::class); @@ -159,7 +159,7 @@ public function testCreateRequestWithNoClientSecret(): void $auth->createRequest( $request->reveal(), $client->reveal(), - [] + [], ); } } diff --git a/tests/AuthMethod/ClientSecretPostTest.php b/tests/AuthMethod/ClientSecretPostTest.php index 7bd3817..ee0f217 100644 --- a/tests/AuthMethod/ClientSecretPostTest.php +++ b/tests/AuthMethod/ClientSecretPostTest.php @@ -17,7 +17,7 @@ class ClientSecretPostTest extends TestCase public function testGetSupportedMethod(): void { $auth = new ClientSecretPost(); - static::assertSame('client_secret_post', $auth->getSupportedMethod()); + self::assertSame('client_secret_post', $auth->getSupportedMethod()); } public function testCreateRequest(): void @@ -41,10 +41,10 @@ public function testCreateRequest(): void $result = $auth->createRequest( $request->reveal(), $client->reveal(), - ['foo' => 'bar'] + ['foo' => 'bar'], ); - static::assertSame($request->reveal(), $result); + self::assertSame($request->reveal(), $result); } public function testCreateRequestWithNoClientSecret(): void @@ -63,7 +63,7 @@ public function testCreateRequestWithNoClientSecret(): void $auth->createRequest( $request->reveal(), $client->reveal(), - [] + [], ); } } diff --git a/tests/AuthMethod/NoneTest.php b/tests/AuthMethod/NoneTest.php index 7bd11c6..1ee7772 100644 --- a/tests/AuthMethod/NoneTest.php +++ b/tests/AuthMethod/NoneTest.php @@ -16,7 +16,7 @@ class NoneTest extends TestCase public function testGetSupportedMethod(): void { $auth = new None(); - static::assertSame('none', $auth->getSupportedMethod()); + self::assertSame('none', $auth->getSupportedMethod()); } public function testCreateRequest(): void @@ -37,9 +37,9 @@ public function testCreateRequest(): void $result = $auth->createRequest( $request->reveal(), $client->reveal(), - ['foo' => 'bar'] + ['foo' => 'bar'], ); - static::assertSame($request->reveal(), $result); + self::assertSame($request->reveal(), $result); } } diff --git a/tests/AuthMethod/PrivateKeyJwtTest.php b/tests/AuthMethod/PrivateKeyJwtTest.php index be0a9df..28a0c59 100644 --- a/tests/AuthMethod/PrivateKeyJwtTest.php +++ b/tests/AuthMethod/PrivateKeyJwtTest.php @@ -36,9 +36,9 @@ public function testGetSupportedMethod(): void $jwsBuilder->reveal(), $serializer->reveal(), null, - 60 + 60, ); - static::assertSame('private_key_jwt', $auth->getSupportedMethod()); + self::assertSame('private_key_jwt', $auth->getSupportedMethod()); } public static function createRequestProvider(): array @@ -64,7 +64,7 @@ public function testCreateRequest(bool $jwkAsDependency = false): void $jwsBuilder->reveal(), $serializer->reveal(), $jwkAsDependency ? $jwk : null, - 60 + 60, ); $jwksProvider = $this->prophesize(JwksProviderInterface::class); @@ -105,25 +105,25 @@ public function testCreateRequest(bool $jwkAsDependency = false): void $jws = $this->prophesize(JWS::class); $jwsBuilder->create()->shouldBeCalled()->willReturn($jwsBuilder2->reveal()); - $jwsBuilder2->withPayload(Argument::that(function (string $payload) { + $jwsBuilder2->withPayload(Argument::that(function (string $payload): true { $decoded = json_decode($payload, true); - static::assertIsArray($decoded); + self::assertIsArray($decoded); - static::assertArrayHasKey('iss', $decoded); - static::assertArrayHasKey('sub', $decoded); - static::assertArrayHasKey('aud', $decoded); - static::assertArrayHasKey('iat', $decoded); - static::assertArrayHasKey('exp', $decoded); - static::assertArrayHasKey('jti', $decoded); + self::assertArrayHasKey('iss', $decoded); + self::assertArrayHasKey('sub', $decoded); + self::assertArrayHasKey('aud', $decoded); + self::assertArrayHasKey('iat', $decoded); + self::assertArrayHasKey('exp', $decoded); + self::assertArrayHasKey('jti', $decoded); - static::assertSame('bar', $decoded['foo'] ?? null); - static::assertSame('foo', $decoded['iss'] ?? null); - static::assertSame('foo', $decoded['sub'] ?? null); - static::assertSame('https://issuer.com/token', $decoded['aud'] ?? null); - static::assertLessThanOrEqual(time(), $decoded['iat']); - static::assertLessThanOrEqual(time() + 60, $decoded['exp']); - static::assertGreaterThan(time(), $decoded['exp']); + self::assertSame('bar', $decoded['foo'] ?? null); + self::assertSame('foo', $decoded['iss'] ?? null); + self::assertSame('foo', $decoded['sub'] ?? null); + self::assertSame('https://issuer.com/token', $decoded['aud'] ?? null); + self::assertLessThanOrEqual(time(), $decoded['iat']); + self::assertLessThanOrEqual(time() + 60, $decoded['exp']); + self::assertGreaterThan(time(), $decoded['exp']); return true; })) @@ -133,13 +133,13 @@ public function testCreateRequest(bool $jwkAsDependency = false): void $jwsBuilder3->addSignature( Argument::allOf( Argument::type(JWK::class), - Argument::that(fn(JWK $key) => 'foo' === $key->get('kid')) + Argument::that(fn(JWK $key): bool => 'foo' === $key->get('kid')), ), Argument::allOf( Argument::type('array'), Argument::withEntry('alg', 'ALG'), - Argument::withKey('jti') - ) + Argument::withKey('jti'), + ), ) ->shouldBeCalled() ->willReturn($jwsBuilder4); @@ -162,9 +162,9 @@ public function testCreateRequest(bool $jwkAsDependency = false): void $result = $auth->createRequest( $request->reveal(), $client->reveal(), - ['foo' => 'bar'] + ['foo' => 'bar'], ); - static::assertSame($request->reveal(), $result); + self::assertSame($request->reveal(), $result); } } diff --git a/tests/AuthMethod/SelfSignedTLSClientAuthTest.php b/tests/AuthMethod/SelfSignedTLSClientAuthTest.php index 2687a23..77d6a64 100644 --- a/tests/AuthMethod/SelfSignedTLSClientAuthTest.php +++ b/tests/AuthMethod/SelfSignedTLSClientAuthTest.php @@ -16,7 +16,7 @@ class SelfSignedTLSClientAuthTest extends TestCase public function testGetSupportedMethod(): void { $auth = new SelfSignedTLSClientAuth(); - static::assertSame('self_signed_tls_client_auth', $auth->getSupportedMethod()); + self::assertSame('self_signed_tls_client_auth', $auth->getSupportedMethod()); } public function testCreateRequest(): void @@ -39,9 +39,9 @@ public function testCreateRequest(): void $result = $auth->createRequest( $request->reveal(), $client->reveal(), - ['foo' => 'bar'] + ['foo' => 'bar'], ); - static::assertSame($request->reveal(), $result); + self::assertSame($request->reveal(), $result); } } diff --git a/tests/AuthMethod/TLSClientAuthTest.php b/tests/AuthMethod/TLSClientAuthTest.php index c033b5f..47f99d6 100644 --- a/tests/AuthMethod/TLSClientAuthTest.php +++ b/tests/AuthMethod/TLSClientAuthTest.php @@ -16,7 +16,7 @@ class TLSClientAuthTest extends TestCase public function testGetSupportedMethod(): void { $auth = new TLSClientAuth(); - static::assertSame('tls_client_auth', $auth->getSupportedMethod()); + self::assertSame('tls_client_auth', $auth->getSupportedMethod()); } public function testCreateRequest(): void @@ -39,9 +39,9 @@ public function testCreateRequest(): void $result = $auth->createRequest( $request->reveal(), $client->reveal(), - ['foo' => 'bar'] + ['foo' => 'bar'], ); - static::assertSame($request->reveal(), $result); + self::assertSame($request->reveal(), $result); } } diff --git a/tests/Authorization/AuthRequestTest.php b/tests/Authorization/AuthRequestTest.php index f2bd5cc..28bbe3c 100644 --- a/tests/Authorization/AuthRequestTest.php +++ b/tests/Authorization/AuthRequestTest.php @@ -20,9 +20,9 @@ public function testFromParams(): void 'redirect_uri' => 'bar', ]); - static::assertSame('foo', $authRequest->getClientId()); - static::assertSame('bar', $authRequest->getRedirectUri()); - static::assertSame('fooscope', $authRequest->getScope()); + self::assertSame('foo', $authRequest->getClientId()); + self::assertSame('bar', $authRequest->getRedirectUri()); + self::assertSame('fooscope', $authRequest->getScope()); } public function testJsonSerialize(): void @@ -34,11 +34,11 @@ public function testJsonSerialize(): void $array = json_decode(json_encode($authRequest), true); - static::assertSame('foo', $array['client_id']); - static::assertSame('bar', $array['redirect_uri']); - static::assertSame('openid', $array['scope']); - static::assertSame('code', $array['response_type']); - static::assertSame('query', $array['response_mode']); + self::assertSame('foo', $array['client_id']); + self::assertSame('bar', $array['redirect_uri']); + self::assertSame('openid', $array['scope']); + self::assertSame('code', $array['response_type']); + self::assertSame('query', $array['response_mode']); } public function testCreateParams(): void @@ -50,38 +50,38 @@ public function testCreateParams(): void $array = $authRequest->createParams(); - static::assertSame('foo', $array['client_id']); - static::assertSame('bar', $array['redirect_uri']); - static::assertSame('openid', $array['scope']); - static::assertSame('code', $array['response_type']); - static::assertSame('query', $array['response_mode']); + self::assertSame('foo', $array['client_id']); + self::assertSame('bar', $array['redirect_uri']); + self::assertSame('openid', $array['scope']); + self::assertSame('code', $array['response_type']); + self::assertSame('query', $array['response_mode']); } public function testGetClientId(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertSame('foo', $authRequest->getClientId()); + self::assertSame('foo', $authRequest->getClientId()); } public function testGetUiLocales(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertNull($authRequest->getUiLocales()); + self::assertNull($authRequest->getUiLocales()); $authRequest = new AuthRequest('foo', 'bar', ['ui_locales' => 'it_IT']); - static::assertSame('it_IT', $authRequest->getUiLocales()); + self::assertSame('it_IT', $authRequest->getUiLocales()); } public function testGetRequest(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertNull($authRequest->getRequest()); + self::assertNull($authRequest->getRequest()); $authRequest = new AuthRequest('foo', 'bar', ['request' => 'foo']); - static::assertSame('foo', $authRequest->getRequest()); + self::assertSame('foo', $authRequest->getRequest()); } public function testWithParams(): void @@ -90,145 +90,145 @@ public function testWithParams(): void $authRequest2 = $authRequest->withParams(['request' => 'foo']); - static::assertNotSame($authRequest2, $authRequest); - static::assertNull($authRequest->getRequest()); - static::assertSame('foo', $authRequest2->getRequest()); + self::assertNotSame($authRequest2, $authRequest); + self::assertNull($authRequest->getRequest()); + self::assertSame('foo', $authRequest2->getRequest()); } public function testGetCodeChallengeMethod(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertNull($authRequest->getCodeChallengeMethod()); + self::assertNull($authRequest->getCodeChallengeMethod()); $authRequest = new AuthRequest('foo', 'bar', ['code_challenge_method' => 'foo']); - static::assertSame('foo', $authRequest->getCodeChallengeMethod()); + self::assertSame('foo', $authRequest->getCodeChallengeMethod()); } public function testGetState(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertNull($authRequest->getState()); + self::assertNull($authRequest->getState()); $authRequest = new AuthRequest('foo', 'bar', ['state' => 'foo']); - static::assertSame('foo', $authRequest->getState()); + self::assertSame('foo', $authRequest->getState()); } public function testGetLoginHint(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertNull($authRequest->getLoginHint()); + self::assertNull($authRequest->getLoginHint()); $authRequest = new AuthRequest('foo', 'bar', ['login_hint' => 'foo']); - static::assertSame('foo', $authRequest->getLoginHint()); + self::assertSame('foo', $authRequest->getLoginHint()); } public function testGetDisplay(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertNull($authRequest->getDisplay()); + self::assertNull($authRequest->getDisplay()); $authRequest = new AuthRequest('foo', 'bar', ['display' => 'foo']); - static::assertSame('foo', $authRequest->getDisplay()); + self::assertSame('foo', $authRequest->getDisplay()); } public function testGetMaxAge(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertNull($authRequest->getMaxAge()); + self::assertNull($authRequest->getMaxAge()); $authRequest = new AuthRequest('foo', 'bar', ['max_age' => 3]); - static::assertSame(3, $authRequest->getMaxAge()); + self::assertSame(3, $authRequest->getMaxAge()); } public function testGetRedirectUri(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertSame('bar', $authRequest->getRedirectUri()); + self::assertSame('bar', $authRequest->getRedirectUri()); } public function testGetNonce(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertNull($authRequest->getNonce()); + self::assertNull($authRequest->getNonce()); $authRequest = new AuthRequest('foo', 'bar', ['nonce' => 'foo']); - static::assertSame('foo', $authRequest->getNonce()); + self::assertSame('foo', $authRequest->getNonce()); } public function testGetCodeChallenge(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertNull($authRequest->getCodeChallenge()); + self::assertNull($authRequest->getCodeChallenge()); $authRequest = new AuthRequest('foo', 'bar', ['code_challenge' => 'foo']); - static::assertSame('foo', $authRequest->getCodeChallenge()); + self::assertSame('foo', $authRequest->getCodeChallenge()); } public function testGetAcrValues(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertNull($authRequest->getAcrValues()); + self::assertNull($authRequest->getAcrValues()); $authRequest = new AuthRequest('foo', 'bar', ['acr_values' => 'foo']); - static::assertSame('foo', $authRequest->getAcrValues()); + self::assertSame('foo', $authRequest->getAcrValues()); } public function testGetScope(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertSame('openid', $authRequest->getScope()); + self::assertSame('openid', $authRequest->getScope()); $authRequest = new AuthRequest('foo', 'bar', ['scope' => 'foo']); - static::assertSame('foo', $authRequest->getScope()); + self::assertSame('foo', $authRequest->getScope()); } public function testGetResponseMode(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertSame('query', $authRequest->getResponseMode()); + self::assertSame('query', $authRequest->getResponseMode()); $authRequest = new AuthRequest('foo', 'bar', ['response_mode' => 'foo']); - static::assertSame('foo', $authRequest->getResponseMode()); + self::assertSame('foo', $authRequest->getResponseMode()); } public function testGetPrompt(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertNull($authRequest->getPrompt()); + self::assertNull($authRequest->getPrompt()); $authRequest = new AuthRequest('foo', 'bar', ['prompt' => 'foo']); - static::assertSame('foo', $authRequest->getPrompt()); + self::assertSame('foo', $authRequest->getPrompt()); } public function testGetIdTokenHint(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertNull($authRequest->getIdTokenHint()); + self::assertNull($authRequest->getIdTokenHint()); $authRequest = new AuthRequest('foo', 'bar', ['id_token_hint' => 'foo']); - static::assertSame('foo', $authRequest->getIdTokenHint()); + self::assertSame('foo', $authRequest->getIdTokenHint()); } public function testGetResponseType(): void { $authRequest = new AuthRequest('foo', 'bar'); - static::assertSame('code', $authRequest->getResponseType()); + self::assertSame('code', $authRequest->getResponseType()); $authRequest = new AuthRequest('foo', 'bar', ['response_type' => 'foo']); - static::assertSame('foo', $authRequest->getResponseType()); + self::assertSame('foo', $authRequest->getResponseType()); } } diff --git a/tests/Claims/AggregatedClaimsTest.php b/tests/Claims/AggregatedClaimsTest.php index ee81600..d8663c5 100644 --- a/tests/Claims/AggregatedClaimsTest.php +++ b/tests/Claims/AggregatedClaimsTest.php @@ -28,7 +28,6 @@ class AggregatedClaimsTest extends TestCase { public function testUnpackAggregatedClaimsWithNoClaimSources(): void { - $algorithmManager = $this->prophesize(AlgorithmManager::class); $JWSVerifier = $this->prophesize(JWSVerifier::class); $JWSSerializer = $this->prophesize(JWSSerializer::class); $client = $this->prophesize(ClientInterface::class); @@ -36,9 +35,9 @@ public function testUnpackAggregatedClaimsWithNoClaimSources(): void $service = new AggregateParser( $issuerBuilder->reveal(), - $algorithmManager->reveal(), + new AlgorithmManager([]), $JWSVerifier->reveal(), - $JWSSerializer->reveal() + $JWSSerializer->reveal(), ); $claims = [ @@ -51,20 +50,19 @@ public function testUnpackAggregatedClaimsWithNoClaimSources(): void $unpacked = $service->unpack($client->reveal(), $claims); - static::assertSame($claims, $unpacked); + self::assertSame($claims, $unpacked); } public function testUnpackAggregatedClaimsWithNoClaimNames(): void { - $algorithmManager = $this->prophesize(AlgorithmManager::class); $JWSVerifier = $this->prophesize(JWSVerifier::class); $issuerBuilder = $this->prophesize(IssuerBuilderInterface::class); $client = $this->prophesize(ClientInterface::class); $service = new AggregateParser( $issuerBuilder->reveal(), - $algorithmManager->reveal(), - $JWSVerifier->reveal() + new AlgorithmManager([]), + $JWSVerifier->reveal(), ); $claims = [ @@ -78,14 +76,13 @@ public function testUnpackAggregatedClaimsWithNoClaimNames(): void $unpacked = $service->unpack($client->reveal(), $claims); - static::assertSame($claims, $unpacked); + self::assertSame($claims, $unpacked); } public function testUnpackAggregatedClaims(): void { $jwt = 'eyJhbGciOiJub25lIn0.eyJleWVfY29sb3IiOiAiYmx1ZSIsICJzaG9lX3NpemUiOiA4fQ.'; - $algorithmManager = $this->prophesize(AlgorithmManager::class); $JWSVerifier = $this->prophesize(JWSVerifier::class); $issuerBuilder = $this->prophesize(IssuerBuilderInterface::class); $client = $this->prophesize(ClientInterface::class); @@ -95,8 +92,8 @@ public function testUnpackAggregatedClaims(): void $service = new AggregateParser( $issuerBuilder->reveal(), - $algorithmManager->reveal(), - $JWSVerifier->reveal() + new AlgorithmManager([]), + $JWSVerifier->reveal(), ); $claims = [ @@ -114,10 +111,10 @@ public function testUnpackAggregatedClaims(): void $unpacked = $service->unpack($client->reveal(), $claims); - static::assertSame('blue', $unpacked['eye_color'] ?? null); - static::assertSame(8, $unpacked['shoe_size'] ?? null); - static::assertArrayNotHasKey('_claim_names', $unpacked); - static::assertArrayNotHasKey('_claim_sources', $unpacked); + self::assertSame('blue', $unpacked['eye_color'] ?? null); + self::assertSame(8, $unpacked['shoe_size'] ?? null); + self::assertArrayNotHasKey('_claim_names', $unpacked); + self::assertArrayNotHasKey('_claim_sources', $unpacked); } public function testUnpackAggregatedClaimsWithSignedJWT(): void @@ -136,7 +133,6 @@ public function testUnpackAggregatedClaimsWithSignedJWT(): void $jwt = $serializer->serialize($jws, 0); - $algorithmManager = $this->prophesize(AlgorithmManager::class); $JWSVerifier = $this->prophesize(JWSVerifier::class); $client = $this->prophesize(ClientInterface::class); $issuer = $this->prophesize(IssuerInterface::class); @@ -144,10 +140,13 @@ public function testUnpackAggregatedClaimsWithSignedJWT(): void $issuerBuilder = $this->prophesize(IssuerBuilderInterface::class); $issuerJwksProvider = $this->prophesize(JwksProviderInterface::class); - $algorithm = new RS256(); - $algorithmManager->get('RS256')->willReturn($algorithm); + new AlgorithmManager([new RS256()]); - $JWSVerifier->verifyWithKey(Argument::type(JWS::class), Argument::that(fn(JWK $key) => $jwkPublic->all() === $key->all()), 0) + $JWSVerifier->verifyWithKey( + Argument::type(JWS::class), + Argument::that(fn(JWK $key): bool => $jwkPublic->all() === $key->all()), + 0, + ) ->willReturn(true); $client->getIssuer()->willReturn($issuer->reveal()); @@ -162,8 +161,8 @@ public function testUnpackAggregatedClaimsWithSignedJWT(): void $service = new AggregateParser( $issuerBuilder->reveal(), - $algorithmManager->reveal(), - $JWSVerifier->reveal() + new AlgorithmManager([new RS256()]), + $JWSVerifier->reveal(), ); $claims = [ @@ -180,8 +179,8 @@ public function testUnpackAggregatedClaimsWithSignedJWT(): void $unpacked = $service->unpack($client->reveal(), $claims); - static::assertSame('blue', $unpacked['eye_color'] ?? null); - static::assertArrayNotHasKey('_claim_names', $unpacked); - static::assertArrayNotHasKey('_claim_sources', $unpacked); + self::assertSame('blue', $unpacked['eye_color'] ?? null); + self::assertArrayNotHasKey('_claim_names', $unpacked); + self::assertArrayNotHasKey('_claim_sources', $unpacked); } } diff --git a/tests/Claims/DistributedClaimsTest.php b/tests/Claims/DistributedClaimsTest.php index 06e655f..fd7d2e0 100644 --- a/tests/Claims/DistributedClaimsTest.php +++ b/tests/Claims/DistributedClaimsTest.php @@ -26,7 +26,6 @@ class DistributedClaimsTest extends TestCase { public function testUnpackAggregatedClaimsWithNoClaimSources(): void { - $algorithmManager = $this->prophesize(AlgorithmManager::class); $JWSVerifier = $this->prophesize(JWSVerifier::class); $issuerBuilder = $this->prophesize(IssuerBuilderInterface::class); $httpClient = $this->prophesize(HttpClient::class); @@ -37,8 +36,8 @@ public function testUnpackAggregatedClaimsWithNoClaimSources(): void $issuerBuilder->reveal(), $httpClient->reveal(), $requestFactory->reveal(), - $algorithmManager->reveal(), - $JWSVerifier->reveal() + new AlgorithmManager([]), + $JWSVerifier->reveal(), ); $claims = [ @@ -50,12 +49,11 @@ public function testUnpackAggregatedClaimsWithNoClaimSources(): void $distributed = $service->fetch($client->reveal(), $claims); - static::assertSame($claims, $distributed); + self::assertSame($claims, $distributed); } public function testUnpackAggregatedClaimsWithNoClaimNames(): void { - $algorithmManager = $this->prophesize(AlgorithmManager::class); $JWSVerifier = $this->prophesize(JWSVerifier::class); $issuerBuilder = $this->prophesize(IssuerBuilderInterface::class); $httpClient = $this->prophesize(HttpClient::class); @@ -66,8 +64,8 @@ public function testUnpackAggregatedClaimsWithNoClaimNames(): void $issuerBuilder->reveal(), $httpClient->reveal(), $requestFactory->reveal(), - $algorithmManager->reveal(), - $JWSVerifier->reveal() + new AlgorithmManager([]), + $JWSVerifier->reveal(), ); $claims = [ @@ -82,7 +80,7 @@ public function testUnpackAggregatedClaimsWithNoClaimNames(): void $distributed = $service->fetch($client->reveal(), $claims); - static::assertSame($claims, $distributed); + self::assertSame($claims, $distributed); } public function testUnpackAggregatedClaims(): void @@ -93,7 +91,6 @@ public function testUnpackAggregatedClaims(): void '.', ]); - $algorithmManager = $this->prophesize(AlgorithmManager::class); $JWSVerifier = $this->prophesize(JWSVerifier::class); $issuerBuilder = $this->prophesize(IssuerBuilderInterface::class); $httpClient = $this->prophesize(HttpClient::class); @@ -125,8 +122,8 @@ public function testUnpackAggregatedClaims(): void $issuerBuilder->reveal(), $httpClient->reveal(), $requestFactory->reveal(), - $algorithmManager->reveal(), - $JWSVerifier->reveal() + new AlgorithmManager([]), + $JWSVerifier->reveal(), ); $claims = [ @@ -144,9 +141,9 @@ public function testUnpackAggregatedClaims(): void $unpacked = $service->fetch($client->reveal(), $claims); - static::assertSame(30, $unpacked['age'] ?? null); - static::assertArrayNotHasKey('_claim_names', $unpacked); - static::assertArrayNotHasKey('_claim_sources', $unpacked); + self::assertSame(30, $unpacked['age'] ?? null); + self::assertArrayNotHasKey('_claim_names', $unpacked); + self::assertArrayNotHasKey('_claim_sources', $unpacked); } public function testUnpackAggregatedClaimsWithResourceError(): void @@ -160,7 +157,6 @@ public function testUnpackAggregatedClaimsWithResourceError(): void '.', ]); - $algorithmManager = $this->prophesize(AlgorithmManager::class); $JWSVerifier = $this->prophesize(JWSVerifier::class); $issuerBuilder = $this->prophesize(IssuerBuilderInterface::class); $httpClient = $this->prophesize(HttpClient::class); @@ -193,8 +189,8 @@ public function testUnpackAggregatedClaimsWithResourceError(): void $issuerBuilder->reveal(), $httpClient->reveal(), $requestFactory->reveal(), - $algorithmManager->reveal(), - $JWSVerifier->reveal() + new AlgorithmManager([]), + $JWSVerifier->reveal(), ); $claims = [ @@ -212,6 +208,6 @@ public function testUnpackAggregatedClaimsWithResourceError(): void $unpacked = $service->fetch($client->reveal(), $claims); - static::assertSame($claims, $unpacked); + self::assertSame($claims, $unpacked); } } diff --git a/tests/Client/ClientBuilderTest.php b/tests/Client/ClientBuilderTest.php index b40d22f..61f403e 100644 --- a/tests/Client/ClientBuilderTest.php +++ b/tests/Client/ClientBuilderTest.php @@ -21,12 +21,12 @@ public function testWithoutClientJwks(): void ->setClientMetadata($metadata->reveal()) ->setIssuer($issuer->reveal()); $client = $builder->build(); - $provider = $client->getJwksProvider(); + $client->getJwksProvider(); - static::assertSame($issuer->reveal(), $client->getIssuer()); - static::assertSame($metadata->reveal(), $client->getMetadata()); - static::assertInstanceOf(MemoryJwksProvider::class, $client->getJwksProvider()); - static::assertSame(['keys' => []], $client->getJwksProvider()->getJwks()); + self::assertSame($issuer->reveal(), $client->getIssuer()); + self::assertSame($metadata->reveal(), $client->getMetadata()); + self::assertInstanceOf(MemoryJwksProvider::class, $client->getJwksProvider()); + self::assertSame(['keys' => []], $client->getJwksProvider()->getJwks()); } public function testBuildWithClientJwks(): void @@ -43,11 +43,11 @@ public function testBuildWithClientJwks(): void ->setClientMetadata($metadata->reveal()) ->setIssuer($issuer->reveal()); $client = $builder->build(); - $provider = $client->getJwksProvider(); + $client->getJwksProvider(); - static::assertSame($issuer->reveal(), $client->getIssuer()); - static::assertSame($metadata->reveal(), $client->getMetadata()); - static::assertInstanceOf(MemoryJwksProvider::class, $client->getJwksProvider()); - static::assertSame($jwks, $client->getJwksProvider()->getJwks()); + self::assertSame($issuer->reveal(), $client->getIssuer()); + self::assertSame($metadata->reveal(), $client->getMetadata()); + self::assertInstanceOf(MemoryJwksProvider::class, $client->getJwksProvider()); + self::assertSame($jwks, $client->getJwksProvider()->getJwks()); } } diff --git a/tests/Client/ClientTest.php b/tests/Client/ClientTest.php index 33da62a..bfdb65e 100644 --- a/tests/Client/ClientTest.php +++ b/tests/Client/ClientTest.php @@ -20,13 +20,13 @@ public function testMinimalConstructor(): void $client = new Client( $issuer->reveal(), - $metadata->reveal() + $metadata->reveal(), ); - static::assertSame($issuer->reveal(), $client->getIssuer()); - static::assertSame($metadata->reveal(), $client->getMetadata()); - static::assertInstanceOf(JwksProviderInterface::class, $client->getJwksProvider()); - static::assertInstanceOf(AuthMethodFactoryInterface::class, $client->getAuthMethodFactory()); + self::assertSame($issuer->reveal(), $client->getIssuer()); + self::assertSame($metadata->reveal(), $client->getMetadata()); + self::assertInstanceOf(JwksProviderInterface::class, $client->getJwksProvider()); + self::assertInstanceOf(AuthMethodFactoryInterface::class, $client->getAuthMethodFactory()); } public function testWithFullConstructor(): void @@ -40,12 +40,12 @@ public function testWithFullConstructor(): void $issuer->reveal(), $metadata->reveal(), $jwksProvider->reveal(), - $authMethodFactory->reveal() + $authMethodFactory->reveal(), ); - static::assertSame($issuer->reveal(), $client->getIssuer()); - static::assertSame($metadata->reveal(), $client->getMetadata()); - static::assertSame($jwksProvider->reveal(), $client->getJwksProvider()); - static::assertSame($authMethodFactory->reveal(), $client->getAuthMethodFactory()); + self::assertSame($issuer->reveal(), $client->getIssuer()); + self::assertSame($metadata->reveal(), $client->getMetadata()); + self::assertSame($jwksProvider->reveal(), $client->getJwksProvider()); + self::assertSame($authMethodFactory->reveal(), $client->getAuthMethodFactory()); } } diff --git a/tests/Client/Metadata/ClientMetadataTest.php b/tests/Client/Metadata/ClientMetadataTest.php index b87925e..58fbfb0 100644 --- a/tests/Client/Metadata/ClientMetadataTest.php +++ b/tests/Client/Metadata/ClientMetadataTest.php @@ -20,8 +20,8 @@ public function testFromClaims(): void 'redirect_uris' => ['bar'], ]); - static::assertSame('foo', $metadata->getClientId()); - static::assertSame(['bar'], $metadata->getRedirectUris()); + self::assertSame('foo', $metadata->getClientId()); + self::assertSame(['bar'], $metadata->getRedirectUris()); } public function testFromClaimsWithNoClientId(): void @@ -37,270 +37,270 @@ public function testGetClientId(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertSame('foo', $metadata->getClientId()); + self::assertSame('foo', $metadata->getClientId()); } public function testGetRedirectUris(): void { $metadata = new ClientMetadata('foo'); - static::assertSame([], $metadata->getRedirectUris()); + self::assertSame([], $metadata->getRedirectUris()); $metadata = new ClientMetadata('foo', [ 'redirect_uris' => ['https://example.com/callback'], ]); - static::assertSame(['https://example.com/callback'], $metadata->getRedirectUris()); + self::assertSame(['https://example.com/callback'], $metadata->getRedirectUris()); } public function testGetResponseTypes(): void { $metadata = new ClientMetadata('foo'); - static::assertSame(['code'], $metadata->getResponseTypes()); + self::assertSame(['code'], $metadata->getResponseTypes()); $metadata = new ClientMetadata('foo', [ 'response_types' => ['code', 'id_token'], ]); - static::assertSame(['code', 'id_token'], $metadata->getResponseTypes()); + self::assertSame(['code', 'id_token'], $metadata->getResponseTypes()); } public function testGetIdTokenSignedResponseAlg(): void { $metadata = new ClientMetadata('foo'); - static::assertSame('RS256', $metadata->getIdTokenSignedResponseAlg()); + self::assertSame('RS256', $metadata->getIdTokenSignedResponseAlg()); $metadata = new ClientMetadata('foo', [ 'id_token_signed_response_alg' => 'HS256', ]); - static::assertSame('HS256', $metadata->getIdTokenSignedResponseAlg()); + self::assertSame('HS256', $metadata->getIdTokenSignedResponseAlg()); } public function testGetIdTokenEncryptedResponseAlg(): void { $metadata = new ClientMetadata('foo'); - static::assertNull($metadata->getIdTokenEncryptedResponseAlg()); + self::assertNull($metadata->getIdTokenEncryptedResponseAlg()); $metadata = new ClientMetadata('foo', [ 'id_token_encrypted_response_alg' => 'RSA-OEAP', ]); - static::assertSame('RSA-OEAP', $metadata->getIdTokenEncryptedResponseAlg()); + self::assertSame('RSA-OEAP', $metadata->getIdTokenEncryptedResponseAlg()); } public function testGetIdTokenEncryptedResponseEnc(): void { $metadata = new ClientMetadata('foo'); - static::assertNull($metadata->getIdTokenEncryptedResponseEnc()); + self::assertNull($metadata->getIdTokenEncryptedResponseEnc()); $metadata = new ClientMetadata('foo', [ 'id_token_encrypted_response_enc' => 'ALG', ]); - static::assertSame('ALG', $metadata->getIdTokenEncryptedResponseEnc()); + self::assertSame('ALG', $metadata->getIdTokenEncryptedResponseEnc()); } public function testGetUserinfoEncryptedResponseAlg(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertNull($metadata->getUserinfoEncryptedResponseAlg()); + self::assertNull($metadata->getUserinfoEncryptedResponseAlg()); $metadata = new ClientMetadata('foo', [ 'userinfo_encrypted_response_alg' => 'foo', ]); - static::assertSame('foo', $metadata->getUserinfoEncryptedResponseAlg()); + self::assertSame('foo', $metadata->getUserinfoEncryptedResponseAlg()); } public function testGetRevocationEndpointAuthMethod(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertSame($metadata->getTokenEndpointAuthMethod(), $metadata->getRevocationEndpointAuthMethod()); + self::assertSame($metadata->getTokenEndpointAuthMethod(), $metadata->getRevocationEndpointAuthMethod()); $metadata = new ClientMetadata('foo', [ 'revocation_endpoint_auth_method' => 'foo', ]); - static::assertSame('foo', $metadata->getRevocationEndpointAuthMethod()); + self::assertSame('foo', $metadata->getRevocationEndpointAuthMethod()); } public function testGetClientSecret(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertNull($metadata->getClientSecret()); + self::assertNull($metadata->getClientSecret()); $metadata = new ClientMetadata('foo', [ 'client_secret' => 'foo', ]); - static::assertSame('foo', $metadata->getClientSecret()); + self::assertSame('foo', $metadata->getClientSecret()); } public function testGetAuthorizationEncryptedResponseAlg(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertNull($metadata->getAuthorizationEncryptedResponseAlg()); + self::assertNull($metadata->getAuthorizationEncryptedResponseAlg()); $metadata = new ClientMetadata('foo', [ 'authorization_encrypted_response_alg' => 'foo', ]); - static::assertSame('foo', $metadata->getAuthorizationEncryptedResponseAlg()); + self::assertSame('foo', $metadata->getAuthorizationEncryptedResponseAlg()); } public function testGetUserinfoSignedResponseAlg(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertNull($metadata->getUserinfoSignedResponseAlg()); + self::assertNull($metadata->getUserinfoSignedResponseAlg()); $metadata = new ClientMetadata('foo', [ 'userinfo_signed_response_alg' => 'foo', ]); - static::assertSame('foo', $metadata->getUserinfoSignedResponseAlg()); + self::assertSame('foo', $metadata->getUserinfoSignedResponseAlg()); } public function testGetIntrospectionEndpointAuthMethod(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertSame($metadata->getTokenEndpointAuthMethod(), $metadata->getIntrospectionEndpointAuthMethod()); + self::assertSame($metadata->getTokenEndpointAuthMethod(), $metadata->getIntrospectionEndpointAuthMethod()); $metadata = new ClientMetadata('foo', [ 'introspection_endpoint_auth_method' => 'foo', ]); - static::assertSame('foo', $metadata->getIntrospectionEndpointAuthMethod()); + self::assertSame('foo', $metadata->getIntrospectionEndpointAuthMethod()); } public function testGetUserinfoEncryptedResponseEnc(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertNull($metadata->getUserinfoEncryptedResponseEnc()); + self::assertNull($metadata->getUserinfoEncryptedResponseEnc()); $metadata = new ClientMetadata('foo', [ 'userinfo_encrypted_response_enc' => 'foo', ]); - static::assertSame('foo', $metadata->getUserinfoEncryptedResponseEnc()); + self::assertSame('foo', $metadata->getUserinfoEncryptedResponseEnc()); } public function testGetAuthorizationEncryptedResponseEnc(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertNull($metadata->getAuthorizationEncryptedResponseEnc()); + self::assertNull($metadata->getAuthorizationEncryptedResponseEnc()); $metadata = new ClientMetadata('foo', [ 'authorization_encrypted_response_enc' => 'foo', ]); - static::assertSame('foo', $metadata->getAuthorizationEncryptedResponseEnc()); + self::assertSame('foo', $metadata->getAuthorizationEncryptedResponseEnc()); } public function testGetRequestObjectSigningAlg(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertNull($metadata->getRequestObjectSigningAlg()); + self::assertNull($metadata->getRequestObjectSigningAlg()); $metadata = new ClientMetadata('foo', [ 'request_object_signing_alg' => 'foo', ]); - static::assertSame('foo', $metadata->getRequestObjectSigningAlg()); + self::assertSame('foo', $metadata->getRequestObjectSigningAlg()); } public function testGetRequestObjectEncryptionAlg(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertNull($metadata->getRequestObjectEncryptionAlg()); + self::assertNull($metadata->getRequestObjectEncryptionAlg()); $metadata = new ClientMetadata('foo', [ 'request_object_encryption_alg' => 'foo', ]); - static::assertSame('foo', $metadata->getRequestObjectEncryptionAlg()); + self::assertSame('foo', $metadata->getRequestObjectEncryptionAlg()); } public function testGetRequestObjectEncryptionEnc(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertNull($metadata->getRequestObjectEncryptionEnc()); + self::assertNull($metadata->getRequestObjectEncryptionEnc()); $metadata = new ClientMetadata('foo', [ 'request_object_encryption_enc' => 'foo', ]); - static::assertSame('foo', $metadata->getRequestObjectEncryptionEnc()); + self::assertSame('foo', $metadata->getRequestObjectEncryptionEnc()); } public function testGetAuthorizationSignedResponseAlg(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertNull($metadata->getAuthorizationSignedResponseAlg()); + self::assertNull($metadata->getAuthorizationSignedResponseAlg()); $metadata = new ClientMetadata('foo', [ 'authorization_signed_response_alg' => 'foo', ]); - static::assertSame('foo', $metadata->getAuthorizationSignedResponseAlg()); + self::assertSame('foo', $metadata->getAuthorizationSignedResponseAlg()); } public function testGetTokenEndpointAuthMethod(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertSame('client_secret_basic', $metadata->getTokenEndpointAuthMethod()); + self::assertSame('client_secret_basic', $metadata->getTokenEndpointAuthMethod()); $metadata = new ClientMetadata('foo', [ 'token_endpoint_auth_method' => 'foo', ]); - static::assertSame('foo', $metadata->getTokenEndpointAuthMethod()); + self::assertSame('foo', $metadata->getTokenEndpointAuthMethod()); } public function testDefaults(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertNull($metadata->get('require_auth_time')); - static::assertNull($metadata->get('tls_client_certificate_bound_access_tokens')); - static::assertNull($metadata->get('response_types')); - static::assertSame(['code'], $metadata->getResponseTypes()); - static::assertNull($metadata->get('post_logout_redirect_uris')); - static::assertNull($metadata->get('id_token_signed_response_alg')); - static::assertSame('RS256', $metadata->getIdTokenSignedResponseAlg()); - static::assertSame('client_secret_basic', $metadata->getTokenEndpointAuthMethod()); + self::assertNull($metadata->get('require_auth_time')); + self::assertNull($metadata->get('tls_client_certificate_bound_access_tokens')); + self::assertNull($metadata->get('response_types')); + self::assertSame(['code'], $metadata->getResponseTypes()); + self::assertNull($metadata->get('post_logout_redirect_uris')); + self::assertNull($metadata->get('id_token_signed_response_alg')); + self::assertSame('RS256', $metadata->getIdTokenSignedResponseAlg()); + self::assertSame('client_secret_basic', $metadata->getTokenEndpointAuthMethod()); } public function testGet(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertSame('foo', $metadata->get('client_id')); + self::assertSame('foo', $metadata->get('client_id')); } public function testHas(): void { $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertTrue($metadata->has('client_id')); - static::assertFalse($metadata->has('foo')); + self::assertTrue($metadata->has('client_id')); + self::assertFalse($metadata->has('foo')); } public function testJsonSerialize(): void @@ -311,6 +311,6 @@ public function testJsonSerialize(): void ]; $metadata = new ClientMetadata('foo', ['redirect_uris' => ['bar']]); - static::assertSame($expected, json_decode(json_encode($metadata), true)); + self::assertSame($expected, json_decode(json_encode($metadata), true)); } } diff --git a/tests/Exception/InvalidArgumentExceptionTest.php b/tests/Exception/InvalidArgumentExceptionTest.php index 74aa1f4..194ca6a 100644 --- a/tests/Exception/InvalidArgumentExceptionTest.php +++ b/tests/Exception/InvalidArgumentExceptionTest.php @@ -13,6 +13,6 @@ class InvalidArgumentExceptionTest extends TestCase public function testException(): void { $exception = new InvalidArgumentException(); - static::assertInstanceOf(ExceptionInterface::class, $exception); + self::assertInstanceOf(ExceptionInterface::class, $exception); } } diff --git a/tests/Exception/LogicExceptionTest.php b/tests/Exception/LogicExceptionTest.php index 7c35eed..1833e18 100644 --- a/tests/Exception/LogicExceptionTest.php +++ b/tests/Exception/LogicExceptionTest.php @@ -13,6 +13,6 @@ class LogicExceptionTest extends TestCase public function testException(): void { $exception = new LogicException(); - static::assertInstanceOf(ExceptionInterface::class, $exception); + self::assertInstanceOf(ExceptionInterface::class, $exception); } } diff --git a/tests/Exception/OAuth2ExceptionTest.php b/tests/Exception/OAuth2ExceptionTest.php index dd55f8d..a323712 100644 --- a/tests/Exception/OAuth2ExceptionTest.php +++ b/tests/Exception/OAuth2ExceptionTest.php @@ -30,11 +30,11 @@ public function testFromResponse(): void $exception = OAuth2Exception::fromResponse($response->reveal()); - static::assertInstanceOf(ExceptionInterface::class, $exception); - static::assertSame('error_code', $exception->getMessage()); - static::assertSame('error_code', $exception->getError()); - static::assertNull($exception->getDescription()); - static::assertNull($exception->getErrorUri()); + self::assertInstanceOf(ExceptionInterface::class, $exception); + self::assertSame('error_code', $exception->getMessage()); + self::assertSame('error_code', $exception->getError()); + self::assertNull($exception->getDescription()); + self::assertNull($exception->getErrorUri()); } public function testFromResponseComplete(): void @@ -50,11 +50,11 @@ public function testFromResponseComplete(): void $exception = OAuth2Exception::fromResponse($response->reveal()); - static::assertInstanceOf(ExceptionInterface::class, $exception); - static::assertSame('Error message (error_code)', $exception->getMessage()); - static::assertSame('error_code', $exception->getError()); - static::assertSame('Error message', $exception->getDescription()); - static::assertSame('uri', $exception->getErrorUri()); + self::assertInstanceOf(ExceptionInterface::class, $exception); + self::assertSame('Error message (error_code)', $exception->getMessage()); + self::assertSame('error_code', $exception->getError()); + self::assertSame('Error message', $exception->getDescription()); + self::assertSame('uri', $exception->getErrorUri()); } public function testFromResponseNoOAuthError(): void @@ -81,11 +81,11 @@ public function testFromParameters(): void 'error_uri' => 'uri', ]); - static::assertInstanceOf(ExceptionInterface::class, $exception); - static::assertSame('Error message (error_code)', $exception->getMessage()); - static::assertSame('error_code', $exception->getError()); - static::assertSame('Error message', $exception->getDescription()); - static::assertSame('uri', $exception->getErrorUri()); + self::assertInstanceOf(ExceptionInterface::class, $exception); + self::assertSame('Error message (error_code)', $exception->getMessage()); + self::assertSame('error_code', $exception->getError()); + self::assertSame('Error message', $exception->getDescription()); + self::assertSame('uri', $exception->getErrorUri()); } public function testFromInvalidParameters(): void @@ -107,7 +107,7 @@ public function testJsonSerializer(): void ]; $exception = OAuth2Exception::fromParameters($params); - static::assertInstanceOf(ExceptionInterface::class, $exception); - static::assertSame($params, json_decode(json_encode($exception), true)); + self::assertInstanceOf(ExceptionInterface::class, $exception); + self::assertSame($params, json_decode(json_encode($exception), true)); } } diff --git a/tests/Exception/RemoteExceptionTest.php b/tests/Exception/RemoteExceptionTest.php index c05ce56..b46de86 100644 --- a/tests/Exception/RemoteExceptionTest.php +++ b/tests/Exception/RemoteExceptionTest.php @@ -19,10 +19,10 @@ public function testException(): void $exception = new RemoteException($response->reveal()); - static::assertInstanceOf(ExceptionInterface::class, $exception); - static::assertSame('Error message', $exception->getMessage()); - static::assertSame(400, $exception->getCode()); - static::assertSame($response->reveal(), $exception->getResponse()); + self::assertInstanceOf(ExceptionInterface::class, $exception); + self::assertSame('Error message', $exception->getMessage()); + self::assertSame(400, $exception->getCode()); + self::assertSame($response->reveal(), $exception->getResponse()); } public function testExceptionWithCustomMessage(): void @@ -33,9 +33,9 @@ public function testExceptionWithCustomMessage(): void $exception = new RemoteException($response->reveal(), 'foo'); - static::assertInstanceOf(ExceptionInterface::class, $exception); - static::assertSame('foo', $exception->getMessage()); - static::assertSame(400, $exception->getCode()); - static::assertSame($response->reveal(), $exception->getResponse()); + self::assertInstanceOf(ExceptionInterface::class, $exception); + self::assertSame('foo', $exception->getMessage()); + self::assertSame(400, $exception->getCode()); + self::assertSame($response->reveal(), $exception->getResponse()); } } diff --git a/tests/Exception/RuntimeExceptionTest.php b/tests/Exception/RuntimeExceptionTest.php index a65e0c2..79925fc 100644 --- a/tests/Exception/RuntimeExceptionTest.php +++ b/tests/Exception/RuntimeExceptionTest.php @@ -13,6 +13,6 @@ class RuntimeExceptionTest extends TestCase public function testException(): void { $exception = new RuntimeException(); - static::assertInstanceOf(ExceptionInterface::class, $exception); + self::assertInstanceOf(ExceptionInterface::class, $exception); } } diff --git a/tests/Issuer/IssuerTest.php b/tests/Issuer/IssuerTest.php index f476857..d50c635 100644 --- a/tests/Issuer/IssuerTest.php +++ b/tests/Issuer/IssuerTest.php @@ -18,10 +18,10 @@ public function testMinimalConstructor(): void $issuer = new Issuer( $metadata->reveal(), - $jwksProvider->reveal() + $jwksProvider->reveal(), ); - static::assertSame($metadata->reveal(), $issuer->getMetadata()); - static::assertSame($jwksProvider->reveal(), $issuer->getJwksProvider()); + self::assertSame($metadata->reveal(), $issuer->getMetadata()); + self::assertSame($jwksProvider->reveal(), $issuer->getJwksProvider()); } } diff --git a/tests/Issuer/Metadata/IssuerMetadataTest.php b/tests/Issuer/Metadata/IssuerMetadataTest.php index 3b291a3..6a4d07d 100644 --- a/tests/Issuer/Metadata/IssuerMetadataTest.php +++ b/tests/Issuer/Metadata/IssuerMetadataTest.php @@ -18,7 +18,7 @@ public function testJsonSerialize(): void $metadata = new IssuerMetadata( 'foo-issuer', 'foo-endpoint', - 'foo-jwks' + 'foo-jwks', ); $expected = [ @@ -27,7 +27,7 @@ public function testJsonSerialize(): void 'jwks_uri' => 'foo-jwks', ]; - static::assertSame($expected, json_decode(json_encode($metadata), true)); + self::assertSame($expected, json_decode(json_encode($metadata), true)); } public function testFromArray(): void @@ -38,10 +38,10 @@ public function testFromArray(): void 'jwks_uri' => 'foo-jwks', ]); - static::assertInstanceOf(IssuerMetadata::class, $metadata); - static::assertSame('foo', $metadata->getIssuer()); - static::assertSame('foo-endpoint', $metadata->getAuthorizationEndpoint()); - static::assertSame('foo-jwks', $metadata->getJwksUri()); + self::assertInstanceOf(IssuerMetadata::class, $metadata); + self::assertSame('foo', $metadata->getIssuer()); + self::assertSame('foo-endpoint', $metadata->getAuthorizationEndpoint()); + self::assertSame('foo-jwks', $metadata->getJwksUri()); } public function testGet(): void @@ -52,12 +52,12 @@ public function testGet(): void 'foo-jwks', [ 'foo' => 'bar', - ] + ], ); - static::assertSame('foo-issuer', $metadata->get('issuer')); - static::assertSame('bar', $metadata->get('foo')); - static::assertNull($metadata->get('foo2')); + self::assertSame('foo-issuer', $metadata->get('issuer')); + self::assertSame('bar', $metadata->get('foo')); + self::assertNull($metadata->get('foo2')); } public function testHas(): void @@ -68,19 +68,16 @@ public function testHas(): void 'foo-jwks', [ 'foo' => 'bar', - ] + ], ); - static::assertTrue($metadata->has('issuer')); - static::assertTrue($metadata->has('foo')); - static::assertFalse($metadata->has('foo2')); + self::assertTrue($metadata->has('issuer')); + self::assertTrue($metadata->has('foo')); + self::assertFalse($metadata->has('foo2')); } - /** - * @param mixed $value - */ #[DataProvider('getClaimGetterProvider')] - public static function testGetters(string $claim, string $methodName, $value): void + public static function testGetters(string $claim, string $methodName, string|bool|array $value): void { $metadata = new IssuerMetadata( 'foo', @@ -88,12 +85,12 @@ public static function testGetters(string $claim, string $methodName, $value): v 'foo', [ $claim => $value, - ] + ], ); /** @var callable $callable */ $callable = [$metadata, $methodName]; - static::assertSame($value, $callable()); + self::assertSame($value, $callable()); } public static function getClaimGetterProvider(): array diff --git a/tests/Issuer/Metadata/Provider/CachedProviderDecoratorTest.php b/tests/Issuer/Metadata/Provider/CachedProviderDecoratorTest.php index f9013e1..61e78ad 100644 --- a/tests/Issuer/Metadata/Provider/CachedProviderDecoratorTest.php +++ b/tests/Issuer/Metadata/Provider/CachedProviderDecoratorTest.php @@ -27,7 +27,7 @@ public function testShouldPersistCachedData(): void $provider = new CachedProviderDecorator( $provider1->reveal(), - $cache->reveal() + $cache->reveal(), ); $cache->get(Argument::type('string')) @@ -53,7 +53,7 @@ public function testShouldReuseCachedData(): void $provider = new CachedProviderDecorator( $provider1->reveal(), - $cache->reveal() + $cache->reveal(), ); $cache->get(Argument::type('string')) diff --git a/tests/Issuer/Metadata/Provider/DiscoveryProviderTest.php b/tests/Issuer/Metadata/Provider/DiscoveryProviderTest.php index e0dc12d..cad5760 100644 --- a/tests/Issuer/Metadata/Provider/DiscoveryProviderTest.php +++ b/tests/Issuer/Metadata/Provider/DiscoveryProviderTest.php @@ -18,13 +18,13 @@ class DiscoveryProviderTest extends TestCase { /** @var ClientInterface|ObjectProphecy */ - private $client; + private ObjectProphecy $client; /** @var RequestFactoryInterface|ObjectProphecy */ - private $requestFactory; + private ObjectProphecy $requestFactory; /** @var UriFactoryInterface|ObjectProphecy */ - private $uriFactory; + private ObjectProphecy $uriFactory; protected function setUp(): void { @@ -79,7 +79,7 @@ public function testDiscovery(): void $provider = new DiscoveryProvider( $client->reveal(), $requestFactory->reveal(), - $uriFactory->reveal() + $uriFactory->reveal(), ); $uri2 = $this->prophesize(UriInterface::class); @@ -101,7 +101,7 @@ public function testDiscovery(): void $this->prepareForDiscovery('https://example.com/.well-known/openid-configuration'); - static::assertSame(['issuer' => 'https://openid-uri'], $provider->discovery($uri)); + self::assertSame(['issuer' => 'https://openid-uri'], $provider->discovery($uri)); } public function testDiscoveryWithBaseUri(): void @@ -115,7 +115,7 @@ public function testDiscoveryWithBaseUri(): void $provider = new DiscoveryProvider( $client->reveal(), $requestFactory->reveal(), - $uriFactory->reveal() + $uriFactory->reveal(), ); $uri2 = $this->prophesize(UriInterface::class); @@ -137,7 +137,7 @@ public function testDiscoveryWithBaseUri(): void $this->prepareForDiscovery('https://example.com' . $baseUri . '/.well-known/openid-configuration', $baseUri); - static::assertSame(['issuer' => 'https://openid-uri' . $baseUri], $provider->discovery($uri)); + self::assertSame(['issuer' => 'https://openid-uri' . $baseUri], $provider->discovery($uri)); } public function testDiscoveryWithWellKnown(): void @@ -150,11 +150,11 @@ public function testDiscoveryWithWellKnown(): void $provider = new DiscoveryProvider( $client->reveal(), $requestFactory->reveal(), - $uriFactory->reveal() + $uriFactory->reveal(), ); $this->prepareForDiscovery('https://example.com/.well-known/openid-configuration'); - static::assertSame(['issuer' => 'https://openid-uri'], $provider->discovery($uri)); + self::assertSame(['issuer' => 'https://openid-uri'], $provider->discovery($uri)); } } diff --git a/tests/Issuer/Metadata/Provider/RemoteProviderTest.php b/tests/Issuer/Metadata/Provider/RemoteProviderTest.php index 6683ff8..c1658e7 100644 --- a/tests/Issuer/Metadata/Provider/RemoteProviderTest.php +++ b/tests/Issuer/Metadata/Provider/RemoteProviderTest.php @@ -42,7 +42,7 @@ public function testShouldFallbackOnNextProvider(): void $provider1->isAllowedUri($uri)->willReturn(true); $provider2->isAllowedUri($uri)->willReturn(true); - $provider1->fetch($uri)->shouldBeCalled()->willThrow(new RuntimeException('Error')); + $provider1->fetch($uri)->shouldBeCalled()->willThrow(new RuntimeException(\Error::class)); $provider2->fetch($uri)->shouldBeCalled()->willReturn([ 'foo1' => 'bar1', ]); diff --git a/tests/Issuer/Metadata/Provider/WebFingerProviderTest.php b/tests/Issuer/Metadata/Provider/WebFingerProviderTest.php index 6cd6de8..f7189d7 100644 --- a/tests/Issuer/Metadata/Provider/WebFingerProviderTest.php +++ b/tests/Issuer/Metadata/Provider/WebFingerProviderTest.php @@ -32,7 +32,7 @@ public function testFetch(): void $client->reveal(), $requestFactory->reveal(), $uriFactory->reveal(), - $discoveryProvider->reveal() + $discoveryProvider->reveal(), ); $webFingerUrl = $this->prophesize(UriInterface::class); @@ -85,6 +85,6 @@ public function testFetch(): void 'issuer' => 'https://openid-uri', ]); - static::assertSame(['issuer' => 'https://openid-uri'], $provider->fetch($resource)); + self::assertSame(['issuer' => 'https://openid-uri'], $provider->fetch($resource)); } } diff --git a/tests/RequestObject/RequestObjectFactoryTest.php b/tests/RequestObject/RequestObjectFactoryTest.php index 934c3ba..977acb8 100644 --- a/tests/RequestObject/RequestObjectFactoryTest.php +++ b/tests/RequestObject/RequestObjectFactoryTest.php @@ -31,41 +31,34 @@ class RequestObjectFactoryTest extends TestCase { - /** @var ObjectProphecy|AlgorithmManager */ - private $algorithmManager; + private ?AlgorithmManager $algorithmManager = null; /** @var ObjectProphecy|JWSBuilder */ - private $jwsBuilder; + private ObjectProphecy $jwsBuilder; /** @var ObjectProphecy|JWEBuilder */ - private $jweBuilder; + private ObjectProphecy $jweBuilder; /** @var ObjectProphecy|JWSSerializer */ - private $jwsSerializer; + private ObjectProphecy $jwsSerializer; /** @var ObjectProphecy|JWESerializer */ - private $jweSerializer; + private ObjectProphecy $jweSerializer; /** @var ObjectProphecy|ClientInterface */ - private $client; + private ObjectProphecy $client; /** @var ObjectProphecy|ClientMetadataInterface */ - private $clientMetadata; + private ObjectProphecy $clientMetadata; /** @var ObjectProphecy|IssuerInterface */ - private $issuer; - - /** @var ObjectProphecy|IssuerMetadataInterface */ - private $issuerMetadata; - - /** @var RequestObjectFactory */ - private $factory; + private ObjectProphecy $issuer; protected function setUp(): void { parent::setUp(); - $this->algorithmManager = $this->prophesize(AlgorithmManager::class); + $this->algorithmManager = null; $this->jwsBuilder = $this->prophesize(JWSBuilder::class); $this->jweBuilder = $this->prophesize(JWEBuilder::class); $this->jwsSerializer = $this->prophesize(JWSSerializer::class); @@ -86,14 +79,16 @@ protected function setUp(): void $this->client = $client; $this->clientMetadata = $clientMetadata; $this->issuer = $issuer; - $this->issuerMetadata = $issuerMetadata; + } - $this->factory = new RequestObjectFactory( - $this->algorithmManager->reveal(), + private function getSUT(): RequestObjectFactory + { + return new RequestObjectFactory( + $this->algorithmManager ?? new AlgorithmManager([]), $this->jwsBuilder->reveal(), $this->jweBuilder->reveal(), $this->jwsSerializer->reveal(), - $this->jweSerializer->reveal() + $this->jweSerializer->reveal(), ); } @@ -109,7 +104,7 @@ public function testCreateWithNoSignAndNoEnc(): void $this->clientMetadata->get('request_object_encryption_alg')->willReturn(null); $this->clientMetadata->get('request_object_encryption_enc')->willReturn(null); - $token = $this->factory->create($this->client->reveal(), ['foo' => 'bar']); + $token = $this->getSUT()->create($this->client->reveal(), ['foo' => 'bar']); [$header, $payload] = explode('.', $token); $header = json_decode(base64url_decode($header), true); @@ -137,8 +132,8 @@ public function testCreateWithSymSignAndNoEnc(): void $this->jwsBuilder->withPayload(Argument::type('string'))->willReturn($this->jwsBuilder->reveal()); $this->jwsBuilder->addSignature(Argument::allOf( Argument::type(JWK::class), - Argument::that(fn(JWK $jwk) => $jwk->get('k') === base64url_encode('client-secret')), - Argument::that(fn(JWK $jwk) => $jwk->get('kty') === 'oct') + Argument::that(fn(JWK $jwk): bool => $jwk->get('k') === base64url_encode('client-secret')), + Argument::that(fn(JWK $jwk): bool => $jwk->get('kty') === 'oct'), ), [ 'alg' => 'HS256', 'typ' => 'JWT', @@ -149,7 +144,7 @@ public function testCreateWithSymSignAndNoEnc(): void $this->jwsSerializer->serialize($jws->reveal(), 0) ->willReturn('token'); - $token = $this->factory->create($this->client->reveal(), ['foo' => 'bar']); + $token = $this->getSUT()->create($this->client->reveal(), ['foo' => 'bar']); self::assertSame('token', $token); } @@ -160,8 +155,7 @@ public function testCreateWithAsymSignAndNoEnc(): void $this->clientMetadata->get('request_object_encryption_alg')->willReturn(null); $this->clientMetadata->get('request_object_encryption_enc')->willReturn(null); - $alg = new RS256(); - $this->algorithmManager->get('RS256')->willReturn($alg); + $this->algorithmManager = new AlgorithmManager([new RS256()]); $jwksProvider = $this->prophesize(JwksProviderInterface::class); $jwksProvider->getJwks()->willReturn([ @@ -176,7 +170,7 @@ public function testCreateWithAsymSignAndNoEnc(): void $this->jwsBuilder->create()->willReturn($this->jwsBuilder->reveal()); $this->jwsBuilder->withPayload(Argument::type('string'))->willReturn($this->jwsBuilder->reveal()); - $this->jwsBuilder->addSignature(Argument::that(fn(JWK $key) => 'some-key-id' === $key->get('kid')), [ + $this->jwsBuilder->addSignature(Argument::that(fn(JWK $key): bool => 'some-key-id' === $key->get('kid')), [ 'alg' => 'RS256', 'typ' => 'JWT', 'kid' => 'some-key-id', @@ -187,7 +181,7 @@ public function testCreateWithAsymSignAndNoEnc(): void $this->jwsSerializer->serialize($jws->reveal(), 0) ->willReturn('token'); - $token = $this->factory->create($this->client->reveal(), ['foo' => 'bar']); + $token = $this->getSUT()->create($this->client->reveal(), ['foo' => 'bar']); self::assertSame('token', $token); } @@ -209,8 +203,8 @@ public function testCreateWithNoSignAndSymEnc(): void ])->willReturn($this->jweBuilder->reveal()); $this->jweBuilder->addRecipient(Argument::allOf( Argument::type(JWK::class), - Argument::that(fn(JWK $jwk) => $jwk->get('k') === base64url_encode('client-secret')), - Argument::that(fn(JWK $jwk) => $jwk->get('kty') === 'oct') + Argument::that(fn(JWK $jwk): bool => $jwk->get('k') === base64url_encode('client-secret')), + Argument::that(fn(JWK $jwk): bool => $jwk->get('kty') === 'oct'), )) ->willReturn($this->jweBuilder->reveal()); $this->jweBuilder->build()->willReturn($jwe->reveal()); @@ -218,7 +212,7 @@ public function testCreateWithNoSignAndSymEnc(): void $this->jweSerializer->serialize($jwe->reveal(), 0) ->willReturn('token'); - $token = $this->factory->create($this->client->reveal(), ['foo' => 'bar']); + $token = $this->getSUT()->create($this->client->reveal(), ['foo' => 'bar']); self::assertSame('token', $token); } @@ -229,8 +223,7 @@ public function testCreateWithNoSignAndAsymEnc(): void $this->clientMetadata->get('request_object_encryption_alg')->willReturn('RSA-OAEP'); $this->clientMetadata->get('request_object_encryption_enc')->willReturn('ASY2'); - $alg = new RSAOAEP(); - $this->algorithmManager->get('RSA-OAEP')->willReturn($alg); + $this->algorithmManager = new AlgorithmManager([new RSAOAEP()]); $jwksProvider = $this->prophesize(JwksProviderInterface::class); $jwksProvider->getJwks()->willReturn([ @@ -250,14 +243,14 @@ public function testCreateWithNoSignAndAsymEnc(): void 'cty' => 'JWT', 'kid' => 'some-key-id', ])->willReturn($this->jweBuilder->reveal()); - $this->jweBuilder->addRecipient(Argument::that(fn(JWK $key) => 'some-key-id' === $key->get('kid'))) + $this->jweBuilder->addRecipient(Argument::that(fn(JWK $key): bool => 'some-key-id' === $key->get('kid'))) ->willReturn($this->jweBuilder->reveal()); $this->jweBuilder->build()->willReturn($jwe->reveal()); $this->jweSerializer->serialize($jwe->reveal(), 0) ->willReturn('token'); - $token = $this->factory->create($this->client->reveal(), ['foo' => 'bar']); + $token = $this->getSUT()->create($this->client->reveal(), ['foo' => 'bar']); self::assertSame('token', $token); } diff --git a/tests/Service/AuthorizationServiceTest.php b/tests/Service/AuthorizationServiceTest.php index cbde2fe..91cde81 100644 --- a/tests/Service/AuthorizationServiceTest.php +++ b/tests/Service/AuthorizationServiceTest.php @@ -39,7 +39,7 @@ public function testGetAuthorizationUri(): void $client->reveal(), $requestFactory->reveal(), $idTokenVerifierBuilder->reveal(), - $tokenVerifierBuilder->reveal() + $tokenVerifierBuilder->reveal(), ); $openIdClient = $this->prophesize(OpenIDClient::class); @@ -56,9 +56,9 @@ public function testGetAuthorizationUri(): void $issuer->getMetadata()->willReturn($issuerMetadata); $issuerMetadata->getAuthorizationEndpoint()->willReturn('https://foo-endpoint'); - static::assertSame( + self::assertSame( 'https://foo-endpoint?client_id=clientId&scope=openid&response_type=code&redirect_uri=redirect_uri_1', - $service->getAuthorizationUri($openIdClient->reveal()) + $service->getAuthorizationUri($openIdClient->reveal()), ); } @@ -75,7 +75,7 @@ public function testGetAuthorizationUriWithParameters(): void $client->reveal(), $requestFactory->reveal(), $idTokenVerifierBuilder->reveal(), - $tokenVerifierBuilder->reveal() + $tokenVerifierBuilder->reveal(), ); $openIdClient = $this->prophesize(OpenIDClient::class); @@ -92,9 +92,9 @@ public function testGetAuthorizationUriWithParameters(): void $issuer->getMetadata()->willReturn($issuerMetadata); $issuerMetadata->getAuthorizationEndpoint()->willReturn('https://foo-endpoint?param=value'); - static::assertSame( + self::assertSame( 'https://foo-endpoint?param=value&client_id=clientId&scope=openid&response_type=code&redirect_uri=redirect_uri_1', - $service->getAuthorizationUri($openIdClient->reveal()) + $service->getAuthorizationUri($openIdClient->reveal()), ); } @@ -111,7 +111,7 @@ public function testFetchTokenFromCode(): void $client->reveal(), $requestFactory->reveal(), $idTokenVerifierBuilder->reveal(), - $tokenVerifierBuilder->reveal() + $tokenVerifierBuilder->reveal(), ); $openIdClient = $this->prophesize(OpenIDClient::class); @@ -149,7 +149,7 @@ public function testFetchTokenFromCode(): void $authMethod->createRequest( $tokenRequest1->reveal(), $openIdClient->reveal(), - $claims + $claims, ) ->willReturn($tokenRequest2->reveal()); @@ -162,7 +162,7 @@ public function testFetchTokenFromCode(): void $tokenSet = $this->prophesize(TokenSetInterface::class); $tokenSetFactory->fromArray(['foo' => 'bar'])->willReturn($tokenSet->reveal()); - static::assertSame($tokenSet->reveal(), $service->grant($openIdClient->reveal(), $claims)); + self::assertSame($tokenSet->reveal(), $service->grant($openIdClient->reveal(), $claims)); } public function testCallbackShouldNotProcessUnknownParams(): void @@ -178,7 +178,7 @@ public function testCallbackShouldNotProcessUnknownParams(): void $client->reveal(), $requestFactory->reveal(), $idTokenVerifierBuilder->reveal(), - $tokenVerifierBuilder->reveal() + $tokenVerifierBuilder->reveal(), ); $issuer = $this->prophesize(IssuerInterface::class); @@ -191,7 +191,7 @@ public function testCallbackShouldNotProcessUnknownParams(): void ]); $client = new Client( $issuer->reveal(), - $clientMetadata + $clientMetadata, ); $tokenSet = $this->prophesize(TokenSetInterface::class); diff --git a/tests/Session/AuthSessionTest.php b/tests/Session/AuthSessionTest.php index f512ef5..9955bba 100644 --- a/tests/Session/AuthSessionTest.php +++ b/tests/Session/AuthSessionTest.php @@ -16,44 +16,44 @@ public function testSetState(): void { $session = new AuthSession(); - static::assertNull($session->getState()); + self::assertNull($session->getState()); $session->setState('foo'); - static::assertSame('foo', $session->getState()); + self::assertSame('foo', $session->getState()); } public function testSetNonce(): void { $session = new AuthSession(); - static::assertNull($session->getNonce()); + self::assertNull($session->getNonce()); $session->setNonce('foo'); - static::assertSame('foo', $session->getNonce()); + self::assertSame('foo', $session->getNonce()); } public function testSetCodeVerifier(): void { $session = new AuthSession(); - static::assertNull($session->getCodeVerifier()); + self::assertNull($session->getCodeVerifier()); $session->setCodeVerifier('foo'); - static::assertSame('foo', $session->getCodeVerifier()); + self::assertSame('foo', $session->getCodeVerifier()); } public function testSetCustoms(): void { $session = new AuthSession(); - static::assertSame([], $session->getCustoms()); + self::assertSame([], $session->getCustoms()); $session->setCustoms(['foo' => 'bar']); - static::assertSame(['foo' => 'bar'], $session->getCustoms()); + self::assertSame(['foo' => 'bar'], $session->getCustoms()); } public function testFromArray(): void @@ -63,8 +63,8 @@ public function testFromArray(): void 'nonce' => 'bar', ]); - static::assertSame('foo', $session->getState()); - static::assertSame('bar', $session->getNonce()); + self::assertSame('foo', $session->getState()); + self::assertSame('bar', $session->getNonce()); } public function testJsonSerializer(): void @@ -74,7 +74,7 @@ public function testJsonSerializer(): void 'nonce' => 'bar', ]); - static::assertSame([ + self::assertSame([ 'state' => 'foo', 'nonce' => 'bar', ], json_decode(json_encode($session), true)); diff --git a/tests/Token/TokenSetTest.php b/tests/Token/TokenSetTest.php index e1ff29e..ce1ef9c 100644 --- a/tests/Token/TokenSetTest.php +++ b/tests/Token/TokenSetTest.php @@ -12,72 +12,72 @@ class TokenSetTest extends TestCase public function testGetTokenType(): void { $authResponse = TokenSet::fromParams([]); - static::assertNull($authResponse->getTokenType()); + self::assertNull($authResponse->getTokenType()); $authResponse = TokenSet::fromParams(['token_type' => 'foo']); - static::assertSame('foo', $authResponse->getTokenType()); + self::assertSame('foo', $authResponse->getTokenType()); } public function testGetCode(): void { $authResponse = TokenSet::fromParams([]); - static::assertNull($authResponse->getCode()); + self::assertNull($authResponse->getCode()); $authResponse = TokenSet::fromParams(['code' => 'foo']); - static::assertSame('foo', $authResponse->getCode()); + self::assertSame('foo', $authResponse->getCode()); } public function testGetExpiresIn(): void { $authResponse = TokenSet::fromParams([]); - static::assertNull($authResponse->getExpiresIn()); + self::assertNull($authResponse->getExpiresIn()); $authResponse = TokenSet::fromParams(['expires_in' => '3']); - static::assertSame(3, $authResponse->getExpiresIn()); + self::assertSame(3, $authResponse->getExpiresIn()); } public function testGetIdToken(): void { $authResponse = TokenSet::fromParams([]); - static::assertNull($authResponse->getIdToken()); + self::assertNull($authResponse->getIdToken()); $authResponse = TokenSet::fromParams(['id_token' => 'foo']); - static::assertSame('foo', $authResponse->getIdToken()); + self::assertSame('foo', $authResponse->getIdToken()); } public function testGetRefreshToken(): void { $authResponse = TokenSet::fromParams([]); - static::assertNull($authResponse->getRefreshToken()); + self::assertNull($authResponse->getRefreshToken()); $authResponse = TokenSet::fromParams(['refresh_token' => 'foo']); - static::assertSame('foo', $authResponse->getRefreshToken()); + self::assertSame('foo', $authResponse->getRefreshToken()); } public function testGetCodeVerifier(): void { $authResponse = TokenSet::fromParams([]); - static::assertNull($authResponse->getCodeVerifier()); + self::assertNull($authResponse->getCodeVerifier()); $authResponse = TokenSet::fromParams(['code_verifier' => 'foo']); - static::assertSame('foo', $authResponse->getCodeVerifier()); + self::assertSame('foo', $authResponse->getCodeVerifier()); } public function testGetState(): void { $authResponse = TokenSet::fromParams([]); - static::assertNull($authResponse->getState()); + self::assertNull($authResponse->getState()); $authResponse = TokenSet::fromParams(['state' => 'foo']); - static::assertSame('foo', $authResponse->getState()); + self::assertSame('foo', $authResponse->getState()); } public function testGetAccessToken(): void { $authResponse = TokenSet::fromParams([]); - static::assertNull($authResponse->getAccessToken()); + self::assertNull($authResponse->getAccessToken()); $authResponse = TokenSet::fromParams(['access_token' => 'foo']); - static::assertSame('foo', $authResponse->getAccessToken()); + self::assertSame('foo', $authResponse->getAccessToken()); } } diff --git a/tests/functions/Base64UrlDecodeTest.php b/tests/functions/Base64UrlDecodeTest.php index 25ca4b3..db44365 100644 --- a/tests/functions/Base64UrlDecodeTest.php +++ b/tests/functions/Base64UrlDecodeTest.php @@ -12,7 +12,7 @@ class Base64UrlDecodeTest extends TestCase { public function testBase64UrlEncode(): void { - static::assertSame('foo', base64url_decode('Zm9v')); - static::assertSame('aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789', base64url_decode('YUJjRGVGZ0hpSmtMbU5vUHFSc1R1VndYeVowMTIzNDU2Nzg5')); + self::assertSame('foo', base64url_decode('Zm9v')); + self::assertSame('aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789', base64url_decode('YUJjRGVGZ0hpSmtMbU5vUHFSc1R1VndYeVowMTIzNDU2Nzg5')); } } diff --git a/tests/functions/Base64UrlEncodeTest.php b/tests/functions/Base64UrlEncodeTest.php index c05de83..084085d 100644 --- a/tests/functions/Base64UrlEncodeTest.php +++ b/tests/functions/Base64UrlEncodeTest.php @@ -12,7 +12,7 @@ class Base64UrlEncodeTest extends TestCase { public function testBase64UrlEncode(): void { - static::assertSame('Zm9v', base64url_encode('foo')); - static::assertSame('YUJjRGVGZ0hpSmtMbU5vUHFSc1R1VndYeVowMTIzNDU2Nzg5', base64url_encode('aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789')); + self::assertSame('Zm9v', base64url_encode('foo')); + self::assertSame('YUJjRGVGZ0hpSmtMbU5vUHFSc1R1VndYeVowMTIzNDU2Nzg5', base64url_encode('aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789')); } } diff --git a/tests/functions/CheckServerResponseTest.php b/tests/functions/CheckServerResponseTest.php index 6975c5f..5b7f865 100644 --- a/tests/functions/CheckServerResponseTest.php +++ b/tests/functions/CheckServerResponseTest.php @@ -18,7 +18,7 @@ public function testErrorStatusCode(): void { $this->expectException(RemoteException::class); $this->expectExceptionCode(400); - $this->expectExceptionMessage('Error'); + $this->expectExceptionMessage(\Error::class); $response = $this->prophesize(ResponseInterface::class); $stream = $this->prophesize(StreamInterface::class); @@ -26,7 +26,7 @@ public function testErrorStatusCode(): void $stream->__toString()->willReturn(''); $response->getBody()->willReturn($stream->reveal()); $response->getStatusCode()->willReturn(400); - $response->getReasonPhrase()->willReturn('Error'); + $response->getReasonPhrase()->willReturn(\Error::class); check_server_response($response->reveal()); } diff --git a/tests/functions/DerivedKeyTest.php b/tests/functions/DerivedKeyTest.php index e3c10b6..6150dce 100644 --- a/tests/functions/DerivedKeyTest.php +++ b/tests/functions/DerivedKeyTest.php @@ -15,8 +15,8 @@ class DerivedKeyTest extends TestCase public function testDerivedKey(string $secret, int $length, string $expected): void { $jwk = derived_key($secret, $length); - static::assertSame('oct', $jwk->get('kty')); - static::assertSame($expected, $jwk->get('k')); + self::assertSame('oct', $jwk->get('kty')); + self::assertSame($expected, $jwk->get('k')); } public static function valuesProvider(): array diff --git a/tests/functions/JoseSecretKeyTest.php b/tests/functions/JoseSecretKeyTest.php index 02f4899..00fb238 100644 --- a/tests/functions/JoseSecretKeyTest.php +++ b/tests/functions/JoseSecretKeyTest.php @@ -15,8 +15,8 @@ class JoseSecretKeyTest extends TestCase public function testJoseSecretKey(string $secret, string $alg, string $expected): void { $jwk = jose_secret_key($secret, $alg); - static::assertSame('oct', $jwk->get('kty')); - static::assertSame($expected, $jwk->get('k')); + self::assertSame('oct', $jwk->get('kty')); + self::assertSame($expected, $jwk->get('k')); } public static function valuesProvider(): array diff --git a/tests/functions/ParseCallbackParamsTest.php b/tests/functions/ParseCallbackParamsTest.php index 1b32555..5768ab2 100644 --- a/tests/functions/ParseCallbackParamsTest.php +++ b/tests/functions/ParseCallbackParamsTest.php @@ -28,7 +28,7 @@ public function testWithPost(): void $params = parse_callback_params($serverRequest->reveal()); - static::assertSame($expected, $params); + self::assertSame($expected, $params); } public function testWithGetFragment(): void @@ -45,7 +45,7 @@ public function testWithGetFragment(): void $params = parse_callback_params($serverRequest->reveal()); - static::assertSame($expected, $params); + self::assertSame($expected, $params); } public function testWithGetQuery(): void @@ -63,7 +63,7 @@ public function testWithGetQuery(): void $params = parse_callback_params($serverRequest->reveal()); - static::assertSame($expected, $params); + self::assertSame($expected, $params); } public function testWithInvalidMethod(): void diff --git a/tests/functions/ParseMetadataResponseTest.php b/tests/functions/ParseMetadataResponseTest.php index 5d0a3fd..1d0aedb 100644 --- a/tests/functions/ParseMetadataResponseTest.php +++ b/tests/functions/ParseMetadataResponseTest.php @@ -26,7 +26,7 @@ public function testHappyPath(): void $data = parse_metadata_response($response->reveal()); - static::assertSame(['foo' => 'bar'], $data); + self::assertSame(['foo' => 'bar'], $data); } public function testWithInvalidContent(): void @@ -48,7 +48,7 @@ public function testErrorStatusCode(): void { $this->expectException(RemoteException::class); $this->expectExceptionCode(400); - $this->expectExceptionMessage('Error'); + $this->expectExceptionMessage(\Error::class); $response = $this->prophesize(ResponseInterface::class); $stream = $this->prophesize(StreamInterface::class); @@ -56,7 +56,7 @@ public function testErrorStatusCode(): void $stream->__toString()->willReturn(''); $response->getBody()->willReturn($stream->reveal()); $response->getStatusCode()->willReturn(400); - $response->getReasonPhrase()->willReturn('Error'); + $response->getReasonPhrase()->willReturn(\Error::class); parse_metadata_response($response->reveal()); }