diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 4c17357a..b1797cde 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -21,12 +21,12 @@ jobs: steps: - name: Cancel previous runs of this workflow (pull requests only) if: ${{ github.event_name == 'pull_request' }} - uses: styfle/cancel-workflow-action@0.5.0 + uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 diff --git a/.github/workflows/tests-wordpress.yml b/.github/workflows/tests-wordpress.yml index 148ebeef..c8c72cff 100644 --- a/.github/workflows/tests-wordpress.yml +++ b/.github/workflows/tests-wordpress.yml @@ -31,7 +31,7 @@ jobs: wordpress: '6.2' steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Build container image env: @@ -51,10 +51,10 @@ jobs: - name: Get Composer Cache Directory id: composercache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - name: Cache dependencies - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: ${{ steps.composercache.outputs.dir }} key: php-${{ matrix.php }}-${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} diff --git a/.github/workflows/update-wordpress-assets.yml b/.github/workflows/update-wordpress-assets.yml index 4f78cb74..fa069a4e 100644 --- a/.github/workflows/update-wordpress-assets.yml +++ b/.github/workflows/update-wordpress-assets.yml @@ -11,7 +11,7 @@ jobs: - name: Install Subversion run: sudo apt-get update && sudo apt-get install -y subversion - - uses: actions/checkout@master + - uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 diff --git a/.github/workflows/upload-plugin-zip.yml b/.github/workflows/upload-plugin-zip.yml index db685051..f229f38c 100644 --- a/.github/workflows/upload-plugin-zip.yml +++ b/.github/workflows/upload-plugin-zip.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 with: diff --git a/.github/workflows/wordpress-coding-standards.yml b/.github/workflows/wordpress-coding-standards.yml index 880a788f..a8f5d04b 100644 --- a/.github/workflows/wordpress-coding-standards.yml +++ b/.github/workflows/wordpress-coding-standards.yml @@ -19,7 +19,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -30,10 +30,10 @@ jobs: - name: Get Composer Cache Directory id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - name: Cache dependencies - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: ${{ steps.composer-cache.outputs.dir }} key: php-${{ matrix.php }}-${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} diff --git a/codeception.dist.yml b/codeception.dist.yml index 7ed957e2..158f5950 100644 --- a/codeception.dist.yml +++ b/codeception.dist.yml @@ -5,6 +5,7 @@ paths: support: tests/_support envs: tests/_envs actor_suffix: Tester +gherkin: [] extensions: enabled: - Codeception\Extension\RunFailed diff --git a/composer.json b/composer.json index eef184a0..04366fde 100644 --- a/composer.json +++ b/composer.json @@ -17,6 +17,7 @@ } }, "require-dev": { + "behat/gherkin": "<4.9", "wp-graphql/wp-graphql-testcase": "*", "squizlabs/php_codesniffer": "^3.6", "phpcompatibility/phpcompatibility-wp": "*", diff --git a/composer.lock b/composer.lock index 690a6e8e..7270ab17 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e4509b5e06fcb4c745a6a025e60de93a", + "content-hash": "bda963e63dc7a9859951e905c5e45612", "packages": [ { "name": "appsero/client", @@ -64,16 +64,16 @@ "packages-dev": [ { "name": "antecedent/patchwork", - "version": "2.2.1", + "version": "2.2.3", "source": { "type": "git", "url": "https://github.com/antecedent/patchwork.git", - "reference": "1bf183a3e1bd094f231a2128b9ecc5363c269245" + "reference": "8b6b235f405af175259c8f56aea5fc23ab9f03ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/antecedent/patchwork/zipball/1bf183a3e1bd094f231a2128b9ecc5363c269245", - "reference": "1bf183a3e1bd094f231a2128b9ecc5363c269245", + "url": "https://api.github.com/repos/antecedent/patchwork/zipball/8b6b235f405af175259c8f56aea5fc23ab9f03ce", + "reference": "8b6b235f405af175259c8f56aea5fc23ab9f03ce", "shasum": "" }, "require": { @@ -106,9 +106,9 @@ ], "support": { "issues": "https://github.com/antecedent/patchwork/issues", - "source": "https://github.com/antecedent/patchwork/tree/2.2.1" + "source": "https://github.com/antecedent/patchwork/tree/2.2.3" }, - "time": "2024-12-11T10:19:54+00:00" + "time": "2025-09-17T09:00:56+00:00" }, { "name": "automattic/vipwpcs", @@ -217,25 +217,26 @@ }, { "name": "behat/gherkin", - "version": "v4.11.0", + "version": "v4.8.0", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "32821a17b12620951e755b5d49328a6421a5b5b5" + "reference": "2391482cd003dfdc36b679b27e9f5326bd656acd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/32821a17b12620951e755b5d49328a6421a5b5b5", - "reference": "32821a17b12620951e755b5d49328a6421a5b5b5", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/2391482cd003dfdc36b679b27e9f5326bd656acd", + "reference": "2391482cd003dfdc36b679b27e9f5326bd656acd", "shasum": "" }, "require": { - "php": "8.1.* || 8.2.* || 8.3.* || 8.4.*" + "php": "~7.2|~8.0" }, "require-dev": { - "cucumber/cucumber": "dev-gherkin-24.1.0", - "phpunit/phpunit": "^9.6", - "symfony/yaml": "^5.4 || ^6.4 || ^7.0" + "cucumber/cucumber": "dev-gherkin-16.0.0", + "phpunit/phpunit": "~8|~9", + "symfony/phpunit-bridge": "~3|~4|~5", + "symfony/yaml": "~3|~4|~5" }, "suggest": { "symfony/yaml": "If you want to parse features, represented in YAML files" @@ -243,7 +244,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -274,9 +275,9 @@ ], "support": { "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/v4.11.0" + "source": "https://github.com/Behat/Gherkin/tree/v4.8.0" }, - "time": "2024-12-06T10:07:25+00:00" + "time": "2021-02-04T12:44:21+00:00" }, { "name": "bordoni/phpass", @@ -1040,6 +1041,7 @@ "issues": "https://github.com/Codeception/phpunit-wrapper/issues", "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.9" }, + "abandoned": true, "time": "2022-05-23T06:24:11+00:00" }, { @@ -1119,16 +1121,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.5", + "version": "1.5.10", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6" + "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/08c50d5ec4c6ced7d0271d2862dec8c1033283e6", - "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/961a5e4056dd2e4a2eedcac7576075947c28bf63", + "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63", "shasum": "" }, "require": { @@ -1175,7 +1177,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.5" + "source": "https://github.com/composer/ca-bundle/tree/1.5.10" }, "funding": [ { @@ -1185,32 +1187,28 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2025-01-08T16:17:16+00:00" + "time": "2025-12-08T15:06:51+00:00" }, { "name": "composer/class-map-generator", - "version": "1.6.0", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9" + "reference": "2373419b7709815ed323ebf18c3c72d03ff4a8a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/ffe442c5974c44a9343e37a0abcb1cc37319f5b9", - "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/2373419b7709815ed323ebf18c3c72d03ff4a8a6", + "reference": "2373419b7709815ed323ebf18c3c72d03ff4a8a6", "shasum": "" }, "require": { "composer/pcre": "^2.1 || ^3.1", "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7 || ^8" }, "require-dev": { "phpstan/phpstan": "^1.12 || ^2", @@ -1218,7 +1216,7 @@ "phpstan/phpstan-phpunit": "^1 || ^2", "phpstan/phpstan-strict-rules": "^1.1 || ^2", "phpunit/phpunit": "^8", - "symfony/filesystem": "^5.4 || ^6" + "symfony/filesystem": "^5.4 || ^6 || ^7 || ^8" }, "type": "library", "extra": { @@ -1248,7 +1246,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.6.0" + "source": "https://github.com/composer/class-map-generator/tree/1.7.0" }, "funding": [ { @@ -1258,13 +1256,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2025-02-05T10:05:34+00:00" + "time": "2025-11-19T10:41:15+00:00" }, { "name": "composer/composer", @@ -1530,16 +1524,16 @@ }, { "name": "composer/semver", - "version": "3.4.3", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", "shasum": "" }, "require": { @@ -1591,7 +1585,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.3" + "source": "https://github.com/composer/semver/tree/3.4.4" }, "funding": [ { @@ -1601,34 +1595,30 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2024-09-19T14:15:21+00:00" + "time": "2025-08-20T19:15:30+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.8", + "version": "1.5.9", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a" + "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", - "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/edf364cefe8c43501e21e88110aac10b284c3c9f", + "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -1671,7 +1661,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.8" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.9" }, "funding": [ { @@ -1687,7 +1677,7 @@ "type": "tidelift" } ], - "time": "2023-11-20T07:44:33+00:00" + "time": "2025-05-12T21:07:07+00:00" }, { "name": "composer/xdebug-handler", @@ -1757,29 +1747,29 @@ }, { "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v1.0.0", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/composer-installer.git", - "reference": "4be43904336affa5c2f70744a348312336afd0da" + "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", - "reference": "4be43904336affa5c2f70744a348312336afd0da", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/845eb62303d2ca9b289ef216356568ccc075ffd1", + "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0 || ^2.0", + "composer-plugin-api": "^2.2", "php": ">=5.4", - "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + "squizlabs/php_codesniffer": "^3.1.0 || ^4.0" }, "require-dev": { - "composer/composer": "*", + "composer/composer": "^2.2", "ext-json": "*", "ext-zip": "*", - "php-parallel-lint/php-parallel-lint": "^1.3.1", - "phpcompatibility/php-compatibility": "^9.0", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev", "yoast/phpunit-polyfills": "^1.0" }, "type": "composer-plugin", @@ -1798,9 +1788,9 @@ "authors": [ { "name": "Franck Nijhof", - "email": "franck.nijhof@dealerdirect.com", - "homepage": "http://www.frenck.nl", - "role": "Developer / IT Manager" + "email": "opensource@frenck.dev", + "homepage": "https://frenck.dev", + "role": "Open source developer" }, { "name": "Contributors", @@ -1808,7 +1798,6 @@ } ], "description": "PHP_CodeSniffer Standards Composer Installer Plugin", - "homepage": "http://www.dealerdirect.com", "keywords": [ "PHPCodeSniffer", "PHP_CodeSniffer", @@ -1829,9 +1818,28 @@ ], "support": { "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "security": "https://github.com/PHPCSStandards/composer-installer/security/policy", "source": "https://github.com/PHPCSStandards/composer-installer" }, - "time": "2023-01-05T11:28:13+00:00" + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-11-11T04:32:07+00:00" }, { "name": "dg/mysql-dump", @@ -1878,33 +1886,32 @@ }, { "name": "doctrine/inflector", - "version": "2.0.10", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^11.0", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^8.5 || ^9.5", - "vimeo/psalm": "^4.25 || ^5.4" + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + "Doctrine\\Inflector\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1949,7 +1956,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.10" + "source": "https://github.com/doctrine/inflector/tree/2.1.0" }, "funding": [ { @@ -1965,7 +1972,7 @@ "type": "tidelift" } ], - "time": "2024-02-18T20:23:39+00:00" + "time": "2025-08-10T19:31:58+00:00" }, { "name": "doctrine/instantiator", @@ -2178,16 +2185,16 @@ }, { "name": "gettext/languages", - "version": "2.10.0", + "version": "2.12.1", "source": { "type": "git", "url": "https://github.com/php-gettext/Languages.git", - "reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab" + "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Languages/zipball/4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab", - "reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab", + "url": "https://api.github.com/repos/php-gettext/Languages/zipball/0b0b0851c55168e1dfb14305735c64019732b5f1", + "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1", "shasum": "" }, "require": { @@ -2197,7 +2204,8 @@ "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4" }, "bin": [ - "bin/export-plural-rules" + "bin/export-plural-rules", + "bin/import-cldr-data" ], "type": "library", "autoload": { @@ -2236,7 +2244,7 @@ ], "support": { "issues": "https://github.com/php-gettext/Languages/issues", - "source": "https://github.com/php-gettext/Languages/tree/2.10.0" + "source": "https://github.com/php-gettext/Languages/tree/2.12.1" }, "funding": [ { @@ -2248,26 +2256,26 @@ "type": "github" } ], - "time": "2022-10-18T15:00:10+00:00" + "time": "2025-03-19T11:14:02+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.9.2", + "version": "7.10.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.3", - "guzzlehttp/psr7": "^2.7.0", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -2358,7 +2366,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" }, "funding": [ { @@ -2374,20 +2382,20 @@ "type": "tidelift" } ], - "time": "2024-07-24T11:22:20+00:00" + "time": "2025-08-23T22:36:01+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.4", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" + "reference": "481557b130ef3790cf82b713667b43030dc9c957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", "shasum": "" }, "require": { @@ -2395,7 +2403,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "type": "library", "extra": { @@ -2441,7 +2449,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.4" + "source": "https://github.com/guzzle/promises/tree/2.3.0" }, "funding": [ { @@ -2457,20 +2465,20 @@ "type": "tidelift" } ], - "time": "2024-10-17T10:06:22+00:00" + "time": "2025-08-22T14:34:08+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.7.0", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + "reference": "21dc724a0583619cd1652f673303492272778051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", "shasum": "" }, "require": { @@ -2486,7 +2494,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -2557,7 +2565,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.0" + "source": "https://github.com/guzzle/psr7/tree/2.8.0" }, "funding": [ { @@ -2573,35 +2581,38 @@ "type": "tidelift" } ], - "time": "2024-07-18T11:15:46+00:00" + "time": "2025-08-23T21:21:41+00:00" }, { "name": "illuminate/collections", - "version": "v11.42.1", + "version": "v12.42.0", "source": { "type": "git", "url": "https://github.com/illuminate/collections.git", - "reference": "6fd628d32a0989211c4f2829bf0a6a6175b2f3fd" + "reference": "16657effa6a5a4e728f9aeb3e38fb4fa9ba70e7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/6fd628d32a0989211c4f2829bf0a6a6175b2f3fd", - "reference": "6fd628d32a0989211c4f2829bf0a6a6175b2f3fd", + "url": "https://api.github.com/repos/illuminate/collections/zipball/16657effa6a5a4e728f9aeb3e38fb4fa9ba70e7d", + "reference": "16657effa6a5a4e728f9aeb3e38fb4fa9ba70e7d", "shasum": "" }, "require": { - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "php": "^8.2" + "illuminate/conditionable": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "php": "^8.2", + "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-php85": "^1.33" }, "suggest": { - "symfony/var-dumper": "Required to use the dump method (^7.0)." + "illuminate/http": "Required to convert collections to API resources (^12.0).", + "symfony/var-dumper": "Required to use the dump method (^7.2)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "12.x-dev" } }, "autoload": { @@ -2629,29 +2640,29 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-02-05T10:23:21+00:00" + "time": "2025-12-06T18:08:25+00:00" }, { "name": "illuminate/conditionable", - "version": "v11.42.1", + "version": "v12.42.0", "source": { "type": "git", "url": "https://github.com/illuminate/conditionable.git", - "reference": "911df1bda950a3b799cf80671764e34eede131c6" + "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/conditionable/zipball/911df1bda950a3b799cf80671764e34eede131c6", - "reference": "911df1bda950a3b799cf80671764e34eede131c6", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/ec677967c1f2faf90b8428919124d2184a4c9b49", + "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49", "shasum": "" }, "require": { - "php": "^8.0.2" + "php": "^8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "12.x-dev" } }, "autoload": { @@ -2675,20 +2686,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-11-21T16:28:56+00:00" + "time": "2025-05-13T15:08:45+00:00" }, { "name": "illuminate/contracts", - "version": "v11.42.1", + "version": "v12.42.0", "source": { "type": "git", "url": "https://github.com/illuminate/contracts.git", - "reference": "b350a3cd8450846325cb49e1cbc1293598b18898" + "reference": "19e8938edb73047017cfbd443b96844b86da4a59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/b350a3cd8450846325cb49e1cbc1293598b18898", - "reference": "b350a3cd8450846325cb49e1cbc1293598b18898", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/19e8938edb73047017cfbd443b96844b86da4a59", + "reference": "19e8938edb73047017cfbd443b96844b86da4a59", "shasum": "" }, "require": { @@ -2699,7 +2710,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "12.x-dev" } }, "autoload": { @@ -2723,20 +2734,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-02-10T14:20:57+00:00" + "time": "2025-11-26T21:36:01+00:00" }, { "name": "illuminate/macroable", - "version": "v11.42.1", + "version": "v12.42.0", "source": { "type": "git", "url": "https://github.com/illuminate/macroable.git", - "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed" + "reference": "e862e5648ee34004fa56046b746f490dfa86c613" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/macroable/zipball/e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", - "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/e862e5648ee34004fa56046b746f490dfa86c613", + "reference": "e862e5648ee34004fa56046b746f490dfa86c613", "shasum": "" }, "require": { @@ -2745,7 +2756,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "12.x-dev" } }, "autoload": { @@ -2769,20 +2780,71 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-06-28T20:10:30+00:00" + "time": "2024-07-23T16:31:01+00:00" + }, + { + "name": "illuminate/reflection", + "version": "v12.42.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/reflection.git", + "reference": "7b86bc570d5b75e4a3ad79f8cca1491ba24b7c75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/reflection/zipball/7b86bc570d5b75e4a3ad79f8cca1491ba24b7c75", + "reference": "7b86bc570d5b75e4a3ad79f8cca1491ba24b7c75", + "shasum": "" + }, + "require": { + "illuminate/collections": "^12.0", + "illuminate/contracts": "^12.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Reflection package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-12-09T15:11:22+00:00" }, { "name": "illuminate/support", - "version": "v11.42.1", + "version": "v12.42.0", "source": { "type": "git", "url": "https://github.com/illuminate/support.git", - "reference": "047a52ac6464f7861ff05e00464fe41ed2117e9a" + "reference": "d35411be5657e0b5560a5885f3c9140e4cbe0be5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/047a52ac6464f7861ff05e00464fe41ed2117e9a", - "reference": "047a52ac6464f7861ff05e00464fe41ed2117e9a", + "url": "https://api.github.com/repos/illuminate/support/zipball/d35411be5657e0b5560a5885f3c9140e4cbe0be5", + "reference": "d35411be5657e0b5560a5885f3c9140e4cbe0be5", "shasum": "" }, "require": { @@ -2790,12 +2852,15 @@ "ext-ctype": "*", "ext-filter": "*", "ext-mbstring": "*", - "illuminate/collections": "^11.0", - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "nesbot/carbon": "^2.72.6|^3.8.4", + "illuminate/collections": "^12.0", + "illuminate/conditionable": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/reflection": "^12.0", + "nesbot/carbon": "^3.8.4", "php": "^8.2", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php85": "^1.33", "voku/portable-ascii": "^2.0.2" }, "conflict": { @@ -2805,20 +2870,20 @@ "spatie/once": "*" }, "suggest": { - "illuminate/filesystem": "Required to use the Composer class (^11.0).", + "illuminate/filesystem": "Required to use the Composer class (^12.0).", "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", - "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.6).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).", "league/uri": "Required to use the Uri class (^7.5.1).", "ramsey/uuid": "Required to use Str::uuid() (^4.7).", - "symfony/process": "Required to use the Composer class (^7.0).", - "symfony/uid": "Required to use Str::ulid() (^7.0).", - "symfony/var-dumper": "Required to use the dd function (^7.0).", + "symfony/process": "Required to use the Composer class (^7.2).", + "symfony/uid": "Required to use Str::ulid() (^7.2).", + "symfony/var-dumper": "Required to use the dd function (^7.2).", "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "12.x-dev" } }, "autoload": { @@ -2846,7 +2911,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-02-11T21:36:04+00:00" + "time": "2025-12-09T15:26:52+00:00" }, { "name": "ivome/graphql-relay-php", @@ -3076,16 +3141,16 @@ }, { "name": "mck89/peast", - "version": "v1.16.3", + "version": "v1.17.4", "source": { "type": "git", "url": "https://github.com/mck89/peast.git", - "reference": "645ec21b650bc2aced18285c85f220d22afc1430" + "reference": "c6a63f32410d2e4ee2cd20fe94b35af147fb852d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mck89/peast/zipball/645ec21b650bc2aced18285c85f220d22afc1430", - "reference": "645ec21b650bc2aced18285c85f220d22afc1430", + "url": "https://api.github.com/repos/mck89/peast/zipball/c6a63f32410d2e4ee2cd20fe94b35af147fb852d", + "reference": "c6a63f32410d2e4ee2cd20fe94b35af147fb852d", "shasum": "" }, "require": { @@ -3098,7 +3163,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.16.3-dev" + "dev-master": "1.17.4-dev" } }, "autoload": { @@ -3119,9 +3184,9 @@ "description": "Peast is PHP library that generates AST for JavaScript code", "support": { "issues": "https://github.com/mck89/peast/issues", - "source": "https://github.com/mck89/peast/tree/v1.16.3" + "source": "https://github.com/mck89/peast/tree/v1.17.4" }, - "time": "2024-07-23T14:00:32+00:00" + "time": "2025-10-10T12:53:17+00:00" }, { "name": "mikehaertl/php-shellcommand", @@ -3234,68 +3299,18 @@ }, "time": "2021-09-30T13:48:57+00:00" }, - { - "name": "mustache/mustache", - "version": "v2.14.2", - "source": { - "type": "git", - "url": "https://github.com/bobthecow/mustache.php.git", - "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e62b7c3849d22ec55f3ec425507bf7968193a6cb", - "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb", - "shasum": "" - }, - "require": { - "php": ">=5.2.4" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~1.11", - "phpunit/phpunit": "~3.7|~4.0|~5.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "Mustache": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" - } - ], - "description": "A Mustache implementation in PHP.", - "homepage": "https://github.com/bobthecow/mustache.php", - "keywords": [ - "mustache", - "templating" - ], - "support": { - "issues": "https://github.com/bobthecow/mustache.php/issues", - "source": "https://github.com/bobthecow/mustache.php/tree/v2.14.2" - }, - "time": "2022-08-23T13:07:01+00:00" - }, { "name": "myclabs/deep-copy", - "version": "1.13.0", + "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414" + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { @@ -3334,7 +3349,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { @@ -3342,7 +3357,7 @@ "type": "tidelift" } ], - "time": "2025-02-12T12:17:51+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { "name": "nb/oxymel", @@ -3391,16 +3406,16 @@ }, { "name": "nesbot/carbon", - "version": "3.8.5", + "version": "3.11.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "b1a53a27898639579a67de42e8ced5d5386aa9a4" + "reference": "bdb375400dcd162624531666db4799b36b64e4a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/b1a53a27898639579a67de42e8ced5d5386aa9a4", - "reference": "b1a53a27898639579a67de42e8ced5d5386aa9a4", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/bdb375400dcd162624531666db4799b36b64e4a1", + "reference": "bdb375400dcd162624531666db4799b36b64e4a1", "shasum": "" }, "require": { @@ -3408,9 +3423,9 @@ "ext-json": "*", "php": "^8.1", "psr/clock": "^1.0", - "symfony/clock": "^6.3 || ^7.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" }, "provide": { "psr/clock-implementation": "1.0" @@ -3418,14 +3433,13 @@ "require-dev": { "doctrine/dbal": "^3.6.3 || ^4.0", "doctrine/orm": "^2.15.2 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.57.2", + "friendsofphp/php-cs-fixer": "^v3.87.1", "kylekatarnls/multi-tester": "^2.5.3", - "ondrejmirtes/better-reflection": "^6.25.0.4", "phpmd/phpmd": "^2.15.0", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.11.2", - "phpunit/phpunit": "^10.5.20", - "squizlabs/php_codesniffer": "^3.9.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4" }, "bin": [ "bin/carbon" @@ -3493,20 +3507,20 @@ "type": "tidelift" } ], - "time": "2025-02-11T16:28:45+00:00" + "time": "2025-12-02T21:04:28+00:00" }, { "name": "nikic/php-parser", - "version": "v5.4.0", + "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { @@ -3525,7 +3539,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -3549,9 +3563,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, - "time": "2024-12-30T11:07:19+00:00" + "time": "2025-12-06T11:56:16+00:00" }, { "name": "phar-io/manifest", @@ -3731,25 +3745,28 @@ }, { "name": "php-stubs/wordpress-stubs", - "version": "v6.7.2", + "version": "v6.9.0", "source": { "type": "git", "url": "https://github.com/php-stubs/wordpress-stubs.git", - "reference": "c04f96cb232fab12a3cbcccf5a47767f0665c3f4" + "reference": "5171cb6650e6c583a96943fd6ea0dfa3e1089a8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/c04f96cb232fab12a3cbcccf5a47767f0665c3f4", - "reference": "c04f96cb232fab12a3cbcccf5a47767f0665c3f4", + "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/5171cb6650e6c583a96943fd6ea0dfa3e1089a8a", + "reference": "5171cb6650e6c583a96943fd6ea0dfa3e1089a8a", "shasum": "" }, + "conflict": { + "phpdocumentor/reflection-docblock": "5.6.1" + }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "nikic/php-parser": "^4.13", + "nikic/php-parser": "^5.5", "php": "^7.4 || ^8.0", "php-stubs/generator": "^0.8.3", "phpdocumentor/reflection-docblock": "^5.4.1", - "phpstan/phpstan": "^1.11", + "phpstan/phpstan": "^2.1", "phpunit/phpunit": "^9.5", "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^1.1.1", "wp-coding-standards/wpcs": "3.1.0 as 2.3.0" @@ -3773,9 +3790,9 @@ ], "support": { "issues": "https://github.com/php-stubs/wordpress-stubs/issues", - "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.7.2" + "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.9.0" }, - "time": "2025-02-12T04:51:58+00:00" + "time": "2025-12-03T23:06:24+00:00" }, { "name": "php-webdriver/webdriver", @@ -3907,16 +3924,16 @@ }, { "name": "phpcompatibility/phpcompatibility-paragonie", - "version": "1.3.3", + "version": "1.3.4", "source": { "type": "git", "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", - "reference": "293975b465e0e709b571cbf0c957c6c0a7b9a2ac" + "reference": "244d7b04fc4bc2117c15f5abe23eb933b5f02bbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/293975b465e0e709b571cbf0c957c6c0a7b9a2ac", - "reference": "293975b465e0e709b571cbf0c957c6c0a7b9a2ac", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/244d7b04fc4bc2117c15f5abe23eb933b5f02bbf", + "reference": "244d7b04fc4bc2117c15f5abe23eb933b5f02bbf", "shasum": "" }, "require": { @@ -3973,27 +3990,32 @@ { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcompatibility", + "type": "thanks_dev" } ], - "time": "2024-04-24T21:30:46+00:00" + "time": "2025-09-19T17:43:28+00:00" }, { "name": "phpcompatibility/phpcompatibility-wp", - "version": "2.1.6", + "version": "2.1.8", "source": { "type": "git", "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", - "reference": "80ccb1a7640995edf1b87a4409fa584cd5869469" + "reference": "7c8d18b4d90dac9e86b0869a608fa09158e168fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/80ccb1a7640995edf1b87a4409fa584cd5869469", - "reference": "80ccb1a7640995edf1b87a4409fa584cd5869469", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/7c8d18b4d90dac9e86b0869a608fa09158e168fa", + "reference": "7c8d18b4d90dac9e86b0869a608fa09158e168fa", "shasum": "" }, "require": { "phpcompatibility/php-compatibility": "^9.0", - "phpcompatibility/phpcompatibility-paragonie": "^1.0" + "phpcompatibility/phpcompatibility-paragonie": "^1.0", + "squizlabs/php_codesniffer": "^3.3" }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "^1.0" @@ -4043,9 +4065,13 @@ { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcompatibility", + "type": "thanks_dev" } ], - "time": "2025-01-16T22:34:19+00:00" + "time": "2025-10-18T00:05:59+00:00" }, { "name": "phpstan/extension-installer", @@ -4097,16 +4123,11 @@ }, { "name": "phpstan/phpstan", - "version": "1.12.18", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "fef9f07814a573399229304bb0046affdf558812" - }, + "version": "1.12.32", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/fef9f07814a573399229304bb0046affdf558812", - "reference": "fef9f07814a573399229304bb0046affdf558812", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/2770dcdf5078d0b0d53f94317e06affe88419aa8", + "reference": "2770dcdf5078d0b0d53f94317e06affe88419aa8", "shasum": "" }, "require": { @@ -4151,7 +4172,7 @@ "type": "github" } ], - "time": "2025-02-13T12:44:44+00:00" + "time": "2025-09-30T10:16:31+00:00" }, { "name": "phpunit/php-code-coverage", @@ -4474,16 +4495,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.22", + "version": "9.6.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c" + "reference": "945d0b7f346a084ce5549e95289962972c4272e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f80235cb4d3caa59ae09be3adf1ded27521d1a9c", - "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/945d0b7f346a084ce5549e95289962972c4272e5", + "reference": "945d0b7f346a084ce5549e95289962972c4272e5", "shasum": "" }, "require": { @@ -4494,7 +4515,7 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.1", + "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=7.3", @@ -4505,11 +4526,11 @@ "phpunit/php-timer": "^5.0.3", "sebastian/cli-parser": "^1.0.2", "sebastian/code-unit": "^1.0.8", - "sebastian/comparator": "^4.0.8", + "sebastian/comparator": "^4.0.9", "sebastian/diff": "^4.0.6", "sebastian/environment": "^5.1.5", - "sebastian/exporter": "^4.0.6", - "sebastian/global-state": "^5.0.7", + "sebastian/exporter": "^4.0.8", + "sebastian/global-state": "^5.0.8", "sebastian/object-enumerator": "^4.0.4", "sebastian/resource-operations": "^3.0.4", "sebastian/type": "^3.2.1", @@ -4557,7 +4578,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.22" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.31" }, "funding": [ { @@ -4568,12 +4589,20 @@ "url": "https://github.com/sebastianbergmann", "type": "github" }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, { "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", "type": "tidelift" } ], - "time": "2024-12-05T13:48:26+00:00" + "time": "2025-12-06T07:45:52+00:00" }, { "name": "psr/clock", @@ -5033,23 +5062,23 @@ }, { "name": "react/promise", - "version": "v3.2.0", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", - "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", "shasum": "" }, "require": { "php": ">=7.1.0" }, "require-dev": { - "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpstan/phpstan": "1.12.28 || 1.4.10", "phpunit/phpunit": "^9.6 || ^7.5" }, "type": "library", @@ -5094,7 +5123,7 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.2.0" + "source": "https://github.com/reactphp/promise/tree/v3.3.0" }, "funding": [ { @@ -5102,7 +5131,7 @@ "type": "open_collective" } ], - "time": "2024-05-24T10:39:05+00:00" + "time": "2025-08-19T18:57:03+00:00" }, { "name": "sebastian/cli-parser", @@ -5273,16 +5302,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.8", + "version": "4.0.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/67a2df3a62639eab2cc5906065e9805d4fd5dfc5", + "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5", "shasum": "" }, "require": { @@ -5335,15 +5364,27 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.9" }, "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": "2022-09-14T12:41:17+00:00" + "time": "2025-08-10T06:51:50+00:00" }, { "name": "sebastian/complexity", @@ -5533,16 +5574,16 @@ }, { "name": "sebastian/exporter", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/14c6ba52f95a36c3d27c835d65efc7123c446e8c", + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c", "shasum": "" }, "require": { @@ -5598,28 +5639,40 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.8" }, "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": "2024-03-02T06:33:00+00:00" + "time": "2025-09-24T06:03:27+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.7", + "version": "5.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6", "shasum": "" }, "require": { @@ -5662,15 +5715,27 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.8" }, "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/global-state", + "type": "tidelift" } ], - "time": "2024-03-02T06:35:11+00:00" + "time": "2025-08-10T07:10:35+00:00" }, { "name": "sebastian/lines-of-code", @@ -5843,16 +5908,16 @@ }, { "name": "sebastian/recursion-context", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/539c6691e0623af6dc6f9c20384c120f963465a0", + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0", "shasum": "" }, "require": { @@ -5894,15 +5959,27 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.6" }, "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/recursion-context", + "type": "tidelift" } ], - "time": "2023-02-03T06:07:39+00:00" + "time": "2025-08-10T06:57:39+00:00" }, { "name": "sebastian/resource-operations", @@ -6242,28 +6319,27 @@ }, { "name": "sirbrillig/phpcs-variable-analysis", - "version": "v2.11.22", + "version": "v2.13.0", "source": { "type": "git", "url": "https://github.com/sirbrillig/phpcs-variable-analysis.git", - "reference": "ffb6f16c6033ec61ed84446b479a31d6529f0eb7" + "reference": "a15e970b8a0bf64cfa5e86d941f5e6b08855f369" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sirbrillig/phpcs-variable-analysis/zipball/ffb6f16c6033ec61ed84446b479a31d6529f0eb7", - "reference": "ffb6f16c6033ec61ed84446b479a31d6529f0eb7", + "url": "https://api.github.com/repos/sirbrillig/phpcs-variable-analysis/zipball/a15e970b8a0bf64cfa5e86d941f5e6b08855f369", + "reference": "a15e970b8a0bf64cfa5e86d941f5e6b08855f369", "shasum": "" }, "require": { "php": ">=5.4.0", - "squizlabs/php_codesniffer": "^3.5.6" + "squizlabs/php_codesniffer": "^3.5.7 || ^4.0.0" }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.0", - "phpcsstandards/phpcsdevcs": "^1.1", - "phpstan/phpstan": "^1.7", + "phpstan/phpstan": "^1.7 || ^2.0", "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.5 || ^7.0 || ^8.0 || ^9.0 || ^10.5.32 || ^11.3.3", - "vimeo/psalm": "^0.2 || ^0.3 || ^1.1 || ^4.24 || ^5.0" + "vimeo/psalm": "^0.2 || ^0.3 || ^1.1 || ^4.24 || ^5.0 || ^6.0 || ^7.0" }, "type": "phpcodesniffer-standard", "autoload": { @@ -6295,7 +6371,7 @@ "source": "https://github.com/sirbrillig/phpcs-variable-analysis", "wiki": "https://github.com/sirbrillig/phpcs-variable-analysis/wiki" }, - "time": "2025-01-06T17:54:24+00:00" + "time": "2025-09-30T22:22:48+00:00" }, { "name": "softcreatr/jsonpath", @@ -6364,16 +6440,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.11.3", + "version": "3.13.5", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10" + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10", - "reference": "ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", "shasum": "" }, "require": { @@ -6390,11 +6466,6 @@ "bin/phpcs" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" @@ -6440,11 +6511,11 @@ "type": "open_collective" }, { - "url": "https://thanks.dev/phpcsstandards", + "url": "https://thanks.dev/u/gh/phpcsstandards", "type": "thanks_dev" } ], - "time": "2025-01-23T17:04:15+00:00" + "time": "2025-11-04T16:30:35+00:00" }, { "name": "symfony/browser-kit", @@ -6520,16 +6591,16 @@ }, { "name": "symfony/clock", - "version": "v7.2.0", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "url": "https://api.github.com/repos/symfony/clock/zipball/9169f24776edde469914c1e7a1442a50f7a4e110", + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110", "shasum": "" }, "require": { @@ -6574,7 +6645,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.2.0" + "source": "https://github.com/symfony/clock/tree/v7.4.0" }, "funding": [ { @@ -6585,12 +6656,16 @@ "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": "2025-11-12T15:39:26+00:00" }, { "name": "symfony/console", @@ -6759,16 +6834,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { @@ -6781,7 +6856,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -6806,7 +6881,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -6822,7 +6897,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/dom-crawler", @@ -6986,16 +7061,16 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", "shasum": "" }, "require": { @@ -7009,7 +7084,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -7042,7 +7117,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" }, "funding": [ { @@ -7058,20 +7133,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/filesystem", - "version": "v7.2.0", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + "reference": "d551b38811096d0be9c4691d406991b47c0c630a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a", + "reference": "d551b38811096d0be9c4691d406991b47c0c630a", "shasum": "" }, "require": { @@ -7080,7 +7155,7 @@ "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^6.4|^7.0" + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -7108,7 +7183,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.2.0" + "source": "https://github.com/symfony/filesystem/tree/v7.4.0" }, "funding": [ { @@ -7119,12 +7194,16 @@ "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-10-25T15:15:23+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/finder", @@ -7191,7 +7270,7 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -7250,7 +7329,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" }, "funding": [ { @@ -7261,6 +7340,10 @@ "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" @@ -7270,16 +7353,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", "shasum": "" }, "require": { @@ -7328,7 +7411,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -7339,16 +7422,20 @@ "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-09T11:45:10+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -7409,7 +7496,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -7420,6 +7507,10 @@ "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" @@ -7429,19 +7520,20 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, "provide": { @@ -7489,7 +7581,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -7500,16 +7592,20 @@ "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-09T11:45:10+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", @@ -7565,7 +7661,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" }, "funding": [ { @@ -7576,6 +7672,10 @@ "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" @@ -7585,16 +7685,16 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { @@ -7645,7 +7745,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -7656,16 +7756,20 @@ "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-09T11:45:10+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", @@ -7721,7 +7825,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" }, "funding": [ { @@ -7732,6 +7836,10 @@ "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" @@ -7741,16 +7849,16 @@ }, { "name": "symfony/polyfill-php83", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", "shasum": "" }, "require": { @@ -7797,7 +7905,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" }, "funding": [ { @@ -7808,25 +7916,189 @@ "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-09T11:45:10+00:00" + "time": "2025-07-08T02:45:35+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-24T13:30:11+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-23T16:12:55+00:00" }, { "name": "symfony/process", - "version": "v7.2.0", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e" + "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", - "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", + "url": "https://api.github.com/repos/symfony/process/zipball/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8", + "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8", "shasum": "" }, "require": { @@ -7858,7 +8130,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.2.0" + "source": "https://github.com/symfony/process/tree/v7.4.0" }, "funding": [ { @@ -7869,25 +8141,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-06T14:24:19+00:00" + "time": "2025-10-16T11:21:06+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.5.1", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", "shasum": "" }, "require": { @@ -7905,7 +8181,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -7941,7 +8217,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" }, "funding": [ { @@ -7952,25 +8228,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-07-15T11:30:57+00:00" }, { "name": "symfony/string", - "version": "v6.4.15", + "version": "v6.4.30", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f" + "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", - "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", + "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb", + "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb", "shasum": "" }, "require": { @@ -7984,7 +8264,6 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0|^7.0", "symfony/http-client": "^5.4|^6.0|^7.0", "symfony/intl": "^6.2|^7.0", "symfony/translation-contracts": "^2.5|^3.0", @@ -8027,7 +8306,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.15" + "source": "https://github.com/symfony/string/tree/v6.4.30" }, "funding": [ { @@ -8038,25 +8317,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-13T13:31:12+00:00" + "time": "2025-11-21T18:03:05+00:00" }, { "name": "symfony/translation", - "version": "v6.4.13", + "version": "v6.4.30", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66" + "reference": "d1fdeefd0707d15eb150c04e8837bf0b15ebea39" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/bee9bfabfa8b4045a66bf82520e492cddbaffa66", - "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66", + "url": "https://api.github.com/repos/symfony/translation/zipball/d1fdeefd0707d15eb150c04e8837bf0b15ebea39", + "reference": "d1fdeefd0707d15eb150c04e8837bf0b15ebea39", "shasum": "" }, "require": { @@ -8122,7 +8405,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.13" + "source": "https://github.com/symfony/translation/tree/v6.4.30" }, "funding": [ { @@ -8133,25 +8416,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-27T18:14:25+00:00" + "time": "2025-11-24T13:57:00+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.5.1", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", "shasum": "" }, "require": { @@ -8164,7 +8451,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -8200,7 +8487,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" }, "funding": [ { @@ -8211,12 +8498,16 @@ "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:20:29+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/yaml", @@ -8358,16 +8649,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.3", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { @@ -8396,7 +8687,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, "funding": [ { @@ -8404,7 +8695,7 @@ "type": "github" } ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2025-11-17T20:03:58+00:00" }, { "name": "voku/portable-ascii", @@ -8535,16 +8826,16 @@ }, { "name": "webonyx/graphql-php", - "version": "v15.19.1", + "version": "v15.24.0", "source": { "type": "git", "url": "https://github.com/webonyx/graphql-php.git", - "reference": "fa01712b1a170ddc1d92047011b2f4c2bdfa8234" + "reference": "030a04d22d52d7fc07049d0e3b683d2b40f90457" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/fa01712b1a170ddc1d92047011b2f4c2bdfa8234", - "reference": "fa01712b1a170ddc1d92047011b2f4c2bdfa8234", + "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/030a04d22d52d7fc07049d0e3b683d2b40f90457", + "reference": "030a04d22d52d7fc07049d0e3b683d2b40f90457", "shasum": "" }, "require": { @@ -8557,22 +8848,22 @@ "amphp/http-server": "^2.1", "dms/phpunit-arraysubset-asserts": "dev-master", "ergebnis/composer-normalize": "^2.28", - "friendsofphp/php-cs-fixer": "3.65.0", - "mll-lab/php-cs-fixer-config": "^5.9.2", + "friendsofphp/php-cs-fixer": "3.86.0", + "mll-lab/php-cs-fixer-config": "5.11.0", "nyholm/psr7": "^1.5", "phpbench/phpbench": "^1.2", "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "1.12.12", - "phpstan/phpstan-phpunit": "1.4.1", - "phpstan/phpstan-strict-rules": "1.6.1", + "phpstan/phpstan": "2.1.22", + "phpstan/phpstan-phpunit": "2.0.7", + "phpstan/phpstan-strict-rules": "2.0.6", "phpunit/phpunit": "^9.5 || ^10.5.21 || ^11", "psr/http-message": "^1 || ^2", "react/http": "^1.6", "react/promise": "^2.0 || ^3.0", - "rector/rector": "^1.0", + "rector/rector": "^2.0", "symfony/polyfill-php81": "^1.23", "symfony/var-exporter": "^5 || ^6 || ^7", - "thecodingmachine/safe": "^1.3 || ^2" + "thecodingmachine/safe": "^1.3 || ^2 || ^3" }, "suggest": { "amphp/http-server": "To leverage async resolving with webserver on AMPHP platform", @@ -8597,7 +8888,7 @@ ], "support": { "issues": "https://github.com/webonyx/graphql-php/issues", - "source": "https://github.com/webonyx/graphql-php/tree/v15.19.1" + "source": "https://github.com/webonyx/graphql-php/tree/v15.24.0" }, "funding": [ { @@ -8605,28 +8896,28 @@ "type": "open_collective" } ], - "time": "2024-12-19T10:52:18+00:00" + "time": "2025-08-20T10:09:37+00:00" }, { "name": "wp-cli/cache-command", - "version": "v2.1.3", + "version": "v2.2.1", "source": { "type": "git", "url": "https://github.com/wp-cli/cache-command.git", - "reference": "1dbb59e5ed126b9a2fa9d521d29910f3f4eb0f97" + "reference": "408bde47b7c19d5701d9cb3c3b1ec90fb70295cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/cache-command/zipball/1dbb59e5ed126b9a2fa9d521d29910f3f4eb0f97", - "reference": "1dbb59e5ed126b9a2fa9d521d29910f3f4eb0f97", + "url": "https://api.github.com/repos/wp-cli/cache-command/zipball/408bde47b7c19d5701d9cb3c3b1ec90fb70295cd", + "reference": "408bde47b7c19d5701d9cb3c3b1ec90fb70295cd", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -8640,6 +8931,8 @@ "cache flush-group", "cache get", "cache incr", + "cache patch", + "cache pluck", "cache replace", "cache set", "cache supports", @@ -8647,9 +8940,11 @@ "transient", "transient delete", "transient get", + "transient list", + "transient patch", + "transient pluck", "transient set", - "transient type", - "transient list" + "transient type" ], "branch-alias": { "dev-main": "2.x-dev" @@ -8678,30 +8973,30 @@ "homepage": "https://github.com/wp-cli/cache-command", "support": { "issues": "https://github.com/wp-cli/cache-command/issues", - "source": "https://github.com/wp-cli/cache-command/tree/v2.1.3" + "source": "https://github.com/wp-cli/cache-command/tree/v2.2.1" }, - "time": "2024-04-26T14:54:22+00:00" + "time": "2025-11-11T13:30:39+00:00" }, { "name": "wp-cli/checksum-command", - "version": "v2.3.0", + "version": "v2.3.2", "source": { "type": "git", "url": "https://github.com/wp-cli/checksum-command.git", - "reference": "bc82cfb0b1e24eec99cd1bfa515a62c63bd46936" + "reference": "c1b245fde354a05d8f329ce30d580f8d91ab83ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/checksum-command/zipball/bc82cfb0b1e24eec99cd1bfa515a62c63bd46936", - "reference": "bc82cfb0b1e24eec99cd1bfa515a62c63bd46936", + "url": "https://api.github.com/repos/wp-cli/checksum-command/zipball/c1b245fde354a05d8f329ce30d580f8d91ab83ef", + "reference": "c1b245fde354a05d8f329ce30d580f8d91ab83ef", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/extension-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -8737,31 +9032,31 @@ "homepage": "https://github.com/wp-cli/checksum-command", "support": { "issues": "https://github.com/wp-cli/checksum-command/issues", - "source": "https://github.com/wp-cli/checksum-command/tree/v2.3.0" + "source": "https://github.com/wp-cli/checksum-command/tree/v2.3.2" }, - "time": "2024-10-01T21:53:46+00:00" + "time": "2025-11-11T13:30:40+00:00" }, { "name": "wp-cli/config-command", - "version": "v2.3.7", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/wp-cli/config-command.git", - "reference": "effb7898bc6ffdaf8a0666432f3c8e35b715858e" + "reference": "a17b0459c3564903ee2b7cd05df2ee372a13ae82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/config-command/zipball/effb7898bc6ffdaf8a0666432f3c8e35b715858e", - "reference": "effb7898bc6ffdaf8a0666432f3c8e35b715858e", + "url": "https://api.github.com/repos/wp-cli/config-command/zipball/a17b0459c3564903ee2b7cd05df2ee372a13ae82", + "reference": "a17b0459c3564903ee2b7cd05df2ee372a13ae82", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5", + "wp-cli/wp-cli": "^2.12", "wp-cli/wp-config-transformer": "^1.4.0" }, "require-dev": { "wp-cli/db-command": "^1.3 || ^2", - "wp-cli/wp-cli-tests": "^4.2.8" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -8811,34 +9106,34 @@ "homepage": "https://github.com/wp-cli/config-command", "support": { "issues": "https://github.com/wp-cli/config-command/issues", - "source": "https://github.com/wp-cli/config-command/tree/v2.3.7" + "source": "https://github.com/wp-cli/config-command/tree/v2.4.0" }, - "time": "2024-10-01T10:19:18+00:00" + "time": "2025-11-11T13:30:41+00:00" }, { "name": "wp-cli/core-command", - "version": "v2.1.18", + "version": "v2.1.22", "source": { "type": "git", "url": "https://github.com/wp-cli/core-command.git", - "reference": "f7580f93fe66a5584fa7b7c42bd2c0c1435c9d2e" + "reference": "ac6f8d742808e11e349ce099c7de2fc3c7009b84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/core-command/zipball/f7580f93fe66a5584fa7b7c42bd2c0c1435c9d2e", - "reference": "f7580f93fe66a5584fa7b7c42bd2c0c1435c9d2e", + "url": "https://api.github.com/repos/wp-cli/core-command/zipball/ac6f8d742808e11e349ce099c7de2fc3c7009b84", + "reference": "ac6f8d742808e11e349ce099c7de2fc3c7009b84", "shasum": "" }, "require": { "composer/semver": "^1.4 || ^2 || ^3", - "wp-cli/wp-cli": "^2.5.1" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/checksum-command": "^1 || ^2", "wp-cli/db-command": "^1.3 || ^2", "wp-cli/entity-command": "^1.3 || ^2", "wp-cli/extension-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -8882,26 +9177,26 @@ "homepage": "https://github.com/wp-cli/core-command", "support": { "issues": "https://github.com/wp-cli/core-command/issues", - "source": "https://github.com/wp-cli/core-command/tree/v2.1.18" + "source": "https://github.com/wp-cli/core-command/tree/v2.1.22" }, - "time": "2024-04-12T09:36:36+00:00" + "time": "2025-09-04T08:14:53+00:00" }, { "name": "wp-cli/cron-command", - "version": "v2.3.1", + "version": "v2.3.2", "source": { "type": "git", "url": "https://github.com/wp-cli/cron-command.git", - "reference": "46f849f2f0ba859c6acd356eefc76769c8381ae5" + "reference": "6f450028a75ebd275f12cad62959a0709bf3e7c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/cron-command/zipball/46f849f2f0ba859c6acd356eefc76769c8381ae5", - "reference": "46f849f2f0ba859c6acd356eefc76769c8381ae5", + "url": "https://api.github.com/repos/wp-cli/cron-command/zipball/6f450028a75ebd275f12cad62959a0709bf3e7c1", + "reference": "6f450028a75ebd275f12cad62959a0709bf3e7c1", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", @@ -8951,26 +9246,26 @@ "homepage": "https://github.com/wp-cli/cron-command", "support": { "issues": "https://github.com/wp-cli/cron-command/issues", - "source": "https://github.com/wp-cli/cron-command/tree/v2.3.1" + "source": "https://github.com/wp-cli/cron-command/tree/v2.3.2" }, - "time": "2024-10-01T10:30:28+00:00" + "time": "2025-04-02T11:55:20+00:00" }, { "name": "wp-cli/db-command", - "version": "v2.1.2", + "version": "v2.1.3", "source": { "type": "git", "url": "https://github.com/wp-cli/db-command.git", - "reference": "d4c0dd25ec8b3d0118a2400cf6b87e8d08b77c43" + "reference": "f857c91454d7092fa672bc388512a51752d9264a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/db-command/zipball/d4c0dd25ec8b3d0118a2400cf6b87e8d08b77c43", - "reference": "d4c0dd25ec8b3d0118a2400cf6b87e8d08b77c43", + "url": "https://api.github.com/repos/wp-cli/db-command/zipball/f857c91454d7092fa672bc388512a51752d9264a", + "reference": "f857c91454d7092fa672bc388512a51752d9264a", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", @@ -9025,30 +9320,30 @@ "homepage": "https://github.com/wp-cli/db-command", "support": { "issues": "https://github.com/wp-cli/db-command/issues", - "source": "https://github.com/wp-cli/db-command/tree/v2.1.2" + "source": "https://github.com/wp-cli/db-command/tree/v2.1.3" }, - "time": "2024-10-01T10:48:48+00:00" + "time": "2025-04-10T11:02:04+00:00" }, { "name": "wp-cli/embed-command", - "version": "v2.0.17", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/wp-cli/embed-command.git", - "reference": "ece56cafcb8ef0a05dac9e41b5ab852ecd57b02c" + "reference": "c95faa486bda28883fd9f0b4702ded2b064061b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/embed-command/zipball/ece56cafcb8ef0a05dac9e41b5ab852ecd57b02c", - "reference": "ece56cafcb8ef0a05dac9e41b5ab852ecd57b02c", + "url": "https://api.github.com/repos/wp-cli/embed-command/zipball/c95faa486bda28883fd9f0b4702ded2b064061b6", + "reference": "c95faa486bda28883fd9f0b4702ded2b064061b6", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -9092,26 +9387,26 @@ "homepage": "https://github.com/wp-cli/embed-command", "support": { "issues": "https://github.com/wp-cli/embed-command/issues", - "source": "https://github.com/wp-cli/embed-command/tree/v2.0.17" + "source": "https://github.com/wp-cli/embed-command/tree/v2.1.0" }, - "time": "2024-10-01T10:30:42+00:00" + "time": "2025-11-11T13:30:46+00:00" }, { "name": "wp-cli/entity-command", - "version": "v2.8.2", + "version": "v2.8.4", "source": { "type": "git", "url": "https://github.com/wp-cli/entity-command.git", - "reference": "9dad0753ecba347d5fbdb6b80d01e38768bca4ea" + "reference": "213611f8ab619ca137d983e9b987f7fbf1ac21d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/entity-command/zipball/9dad0753ecba347d5fbdb6b80d01e38768bca4ea", - "reference": "9dad0753ecba347d5fbdb6b80d01e38768bca4ea", + "url": "https://api.github.com/repos/wp-cli/entity-command/zipball/213611f8ab619ca137d983e9b987f7fbf1ac21d4", + "reference": "213611f8ab619ca137d983e9b987f7fbf1ac21d4", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.11" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/cache-command": "^1 || ^2", @@ -9329,29 +9624,29 @@ "homepage": "https://github.com/wp-cli/entity-command", "support": { "issues": "https://github.com/wp-cli/entity-command/issues", - "source": "https://github.com/wp-cli/entity-command/tree/v2.8.2" + "source": "https://github.com/wp-cli/entity-command/tree/v2.8.4" }, - "time": "2024-10-01T10:44:33+00:00" + "time": "2025-05-06T16:12:49+00:00" }, { "name": "wp-cli/eval-command", - "version": "v2.2.5", + "version": "v2.2.7", "source": { "type": "git", "url": "https://github.com/wp-cli/eval-command.git", - "reference": "1fd2dc9ae74f5fcde7a9b861a1073d6f19952b74" + "reference": "2fb2a9d40861741eafaa1df86ed0dbd62de6e5ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/eval-command/zipball/1fd2dc9ae74f5fcde7a9b861a1073d6f19952b74", - "reference": "1fd2dc9ae74f5fcde7a9b861a1073d6f19952b74", + "url": "https://api.github.com/repos/wp-cli/eval-command/zipball/2fb2a9d40861741eafaa1df86ed0dbd62de6e5ca", + "reference": "2fb2a9d40861741eafaa1df86ed0dbd62de6e5ca", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -9387,27 +9682,27 @@ "homepage": "https://github.com/wp-cli/eval-command", "support": { "issues": "https://github.com/wp-cli/eval-command/issues", - "source": "https://github.com/wp-cli/eval-command/tree/v2.2.5" + "source": "https://github.com/wp-cli/eval-command/tree/v2.2.7" }, - "time": "2024-10-01T10:30:51+00:00" + "time": "2025-12-02T18:17:50+00:00" }, { "name": "wp-cli/export-command", - "version": "v2.1.13", + "version": "v2.1.14", "source": { "type": "git", "url": "https://github.com/wp-cli/export-command.git", - "reference": "eeafa03095b80d2648d1a67b00c688be9d418aff" + "reference": "2af32bf12c1bccd6561a215dbbafc2f272647ee8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/export-command/zipball/eeafa03095b80d2648d1a67b00c688be9d418aff", - "reference": "eeafa03095b80d2648d1a67b00c688be9d418aff", + "url": "https://api.github.com/repos/wp-cli/export-command/zipball/2af32bf12c1bccd6561a215dbbafc2f272647ee8", + "reference": "2af32bf12c1bccd6561a215dbbafc2f272647ee8", "shasum": "" }, "require": { "nb/oxymel": "~0.1.0", - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/db-command": "^1.3 || ^2", @@ -9450,34 +9745,34 @@ "homepage": "https://github.com/wp-cli/export-command", "support": { "issues": "https://github.com/wp-cli/export-command/issues", - "source": "https://github.com/wp-cli/export-command/tree/v2.1.13" + "source": "https://github.com/wp-cli/export-command/tree/v2.1.14" }, - "time": "2024-10-01T10:31:03+00:00" + "time": "2025-04-02T15:29:08+00:00" }, { "name": "wp-cli/extension-command", - "version": "v2.1.23", + "version": "v2.1.24", "source": { "type": "git", "url": "https://github.com/wp-cli/extension-command.git", - "reference": "c307a11e7ea078cfd52177eefeef9906aa69edcd" + "reference": "d21a2f504ac43a86b6b08697669b5b0844748133" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/extension-command/zipball/c307a11e7ea078cfd52177eefeef9906aa69edcd", - "reference": "c307a11e7ea078cfd52177eefeef9906aa69edcd", + "url": "https://api.github.com/repos/wp-cli/extension-command/zipball/d21a2f504ac43a86b6b08697669b5b0844748133", + "reference": "d21a2f504ac43a86b6b08697669b5b0844748133", "shasum": "" }, "require": { "composer/semver": "^1.4 || ^2 || ^3", - "wp-cli/wp-cli": "^2.10" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/cache-command": "^2.0", "wp-cli/entity-command": "^1.3 || ^2", "wp-cli/language-command": "^2.0", "wp-cli/scaffold-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^4.3.7" }, "type": "wp-cli-package", "extra": { @@ -9548,33 +9843,33 @@ "homepage": "https://github.com/wp-cli/extension-command", "support": { "issues": "https://github.com/wp-cli/extension-command/issues", - "source": "https://github.com/wp-cli/extension-command/tree/v2.1.23" + "source": "https://github.com/wp-cli/extension-command/tree/v2.1.24" }, - "time": "2024-10-01T10:44:18+00:00" + "time": "2025-05-06T19:17:53+00:00" }, { "name": "wp-cli/i18n-command", - "version": "v2.6.3", + "version": "v2.6.6", "source": { "type": "git", "url": "https://github.com/wp-cli/i18n-command.git", - "reference": "065bb3758fcbff922f1b7a01ab702aab0da79803" + "reference": "94f72ddc4be8919f2cea181ba39cd140dd480d64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/i18n-command/zipball/065bb3758fcbff922f1b7a01ab702aab0da79803", - "reference": "065bb3758fcbff922f1b7a01ab702aab0da79803", + "url": "https://api.github.com/repos/wp-cli/i18n-command/zipball/94f72ddc4be8919f2cea181ba39cd140dd480d64", + "reference": "94f72ddc4be8919f2cea181ba39cd140dd480d64", "shasum": "" }, "require": { "eftec/bladeone": "3.52", "gettext/gettext": "^4.8", "mck89/peast": "^1.13.11", - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/scaffold-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5.0.0" }, "suggest": { "ext-json": "Used for reading and generating JSON translation files", @@ -9617,32 +9912,33 @@ "homepage": "https://github.com/wp-cli/i18n-command", "support": { "issues": "https://github.com/wp-cli/i18n-command/issues", - "source": "https://github.com/wp-cli/i18n-command/tree/v2.6.3" + "source": "https://github.com/wp-cli/i18n-command/tree/v2.6.6" }, - "time": "2024-10-01T11:16:25+00:00" + "time": "2025-11-21T04:23:34+00:00" }, { "name": "wp-cli/import-command", - "version": "v2.0.13", + "version": "v2.0.15", "source": { "type": "git", "url": "https://github.com/wp-cli/import-command.git", - "reference": "22f32451046c1d8e7963ff96d95942af14fbb4e9" + "reference": "277de5a245cbf846ec822e23067703c7e3b9cb48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/import-command/zipball/22f32451046c1d8e7963ff96d95942af14fbb4e9", - "reference": "22f32451046c1d8e7963ff96d95942af14fbb4e9", + "url": "https://api.github.com/repos/wp-cli/import-command/zipball/277de5a245cbf846ec822e23067703c7e3b9cb48", + "reference": "277de5a245cbf846ec822e23067703c7e3b9cb48", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { + "wordpress/wordpress-importer": "^0.9", "wp-cli/entity-command": "^1.3 || ^2", "wp-cli/export-command": "^1 || ^2", "wp-cli/extension-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -9677,32 +9973,32 @@ "homepage": "https://github.com/wp-cli/import-command", "support": { "issues": "https://github.com/wp-cli/import-command/issues", - "source": "https://github.com/wp-cli/import-command/tree/v2.0.13" + "source": "https://github.com/wp-cli/import-command/tree/v2.0.15" }, - "time": "2024-10-01T10:44:58+00:00" + "time": "2025-12-09T15:41:55+00:00" }, { "name": "wp-cli/language-command", - "version": "v2.0.22", + "version": "v2.0.25", "source": { "type": "git", "url": "https://github.com/wp-cli/language-command.git", - "reference": "27db28eca5f7627c7fbd8da82c6c51eb05e7858e" + "reference": "ad1bbfbf2699eff415436a00bb4195900fa1cfe5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/language-command/zipball/27db28eca5f7627c7fbd8da82c6c51eb05e7858e", - "reference": "27db28eca5f7627c7fbd8da82c6c51eb05e7858e", + "url": "https://api.github.com/repos/wp-cli/language-command/zipball/ad1bbfbf2699eff415436a00bb4195900fa1cfe5", + "reference": "ad1bbfbf2699eff415436a00bb4195900fa1cfe5", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/db-command": "^1.3 || ^2", "wp-cli/entity-command": "^1.3 || ^2", "wp-cli/extension-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -9757,26 +10053,26 @@ "homepage": "https://github.com/wp-cli/language-command", "support": { "issues": "https://github.com/wp-cli/language-command/issues", - "source": "https://github.com/wp-cli/language-command/tree/v2.0.22" + "source": "https://github.com/wp-cli/language-command/tree/v2.0.25" }, - "time": "2024-10-01T10:45:06+00:00" + "time": "2025-09-04T10:30:12+00:00" }, { "name": "wp-cli/maintenance-mode-command", - "version": "v2.1.2", + "version": "v2.1.3", "source": { "type": "git", "url": "https://github.com/wp-cli/maintenance-mode-command.git", - "reference": "d560d7f42fb21e1fc182d69e0cdf06c69891791d" + "reference": "b947e094e00b7b68c6376ec9bd03303515864062" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/maintenance-mode-command/zipball/d560d7f42fb21e1fc182d69e0cdf06c69891791d", - "reference": "d560d7f42fb21e1fc182d69e0cdf06c69891791d", + "url": "https://api.github.com/repos/wp-cli/maintenance-mode-command/zipball/b947e094e00b7b68c6376ec9bd03303515864062", + "reference": "b947e094e00b7b68c6376ec9bd03303515864062", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/wp-cli-tests": "^4" @@ -9818,26 +10114,26 @@ "homepage": "https://github.com/wp-cli/maintenance-mode-command", "support": { "issues": "https://github.com/wp-cli/maintenance-mode-command/issues", - "source": "https://github.com/wp-cli/maintenance-mode-command/tree/v2.1.2" + "source": "https://github.com/wp-cli/maintenance-mode-command/tree/v2.1.3" }, - "time": "2024-10-01T10:45:18+00:00" + "time": "2024-11-24T17:26:30+00:00" }, { "name": "wp-cli/media-command", - "version": "v2.2.1", + "version": "v2.2.2", "source": { "type": "git", "url": "https://github.com/wp-cli/media-command.git", - "reference": "5e2d34d7d01c87d1f50b4838512b3501f5ca6f9a" + "reference": "a810ea0e68473fce6a234e67c6c5f19bb820a753" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/media-command/zipball/5e2d34d7d01c87d1f50b4838512b3501f5ca6f9a", - "reference": "5e2d34d7d01c87d1f50b4838512b3501f5ca6f9a", + "url": "https://api.github.com/repos/wp-cli/media-command/zipball/a810ea0e68473fce6a234e67c6c5f19bb820a753", + "reference": "a810ea0e68473fce6a234e67c6c5f19bb820a753", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", @@ -9880,9 +10176,61 @@ "homepage": "https://github.com/wp-cli/media-command", "support": { "issues": "https://github.com/wp-cli/media-command/issues", - "source": "https://github.com/wp-cli/media-command/tree/v2.2.1" + "source": "https://github.com/wp-cli/media-command/tree/v2.2.2" }, - "time": "2024-10-01T10:45:30+00:00" + "time": "2025-04-11T09:28:29+00:00" + }, + { + "name": "wp-cli/mustache", + "version": "v2.14.99", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/mustache.php.git", + "reference": "ca23b97ac35fbe01c160549eb634396183d04a59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/mustache.php/zipball/ca23b97ac35fbe01c160549eb634396183d04a59", + "reference": "ca23b97ac35fbe01c160549eb634396183d04a59", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "replace": { + "mustache/mustache": "^2.14.2" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.19.3", + "yoast/phpunit-polyfills": "^2.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Mustache": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "A Mustache implementation in PHP.", + "homepage": "https://github.com/bobthecow/mustache.php", + "keywords": [ + "mustache", + "templating" + ], + "support": { + "source": "https://github.com/wp-cli/mustache.php/tree/v2.14.99" + }, + "time": "2025-05-06T16:15:37+00:00" }, { "name": "wp-cli/mustangostang-spyc", @@ -9937,26 +10285,26 @@ }, { "name": "wp-cli/package-command", - "version": "v2.5.3", + "version": "v2.6.1", "source": { "type": "git", "url": "https://github.com/wp-cli/package-command.git", - "reference": "9dc4084c66547049ab863e293f427f8c0d099b18" + "reference": "17ede348446844c20da199683e96f7a3e70c5559" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/package-command/zipball/9dc4084c66547049ab863e293f427f8c0d099b18", - "reference": "9dc4084c66547049ab863e293f427f8c0d099b18", + "url": "https://api.github.com/repos/wp-cli/package-command/zipball/17ede348446844c20da199683e96f7a3e70c5559", + "reference": "17ede348446844c20da199683e96f7a3e70c5559", "shasum": "" }, "require": { - "composer/composer": "^1.10.23 || ^2.2.17", + "composer/composer": "^2.2.25", "ext-json": "*", - "wp-cli/wp-cli": "^2.8" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/scaffold-command": "^1 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -9996,35 +10344,35 @@ "homepage": "https://github.com/wp-cli/package-command", "support": { "issues": "https://github.com/wp-cli/package-command/issues", - "source": "https://github.com/wp-cli/package-command/tree/v2.5.3" + "source": "https://github.com/wp-cli/package-command/tree/v2.6.1" }, - "time": "2024-10-01T11:13:44+00:00" + "time": "2025-08-25T13:32:31+00:00" }, { "name": "wp-cli/php-cli-tools", - "version": "v0.11.22", + "version": "v0.12.6", "source": { "type": "git", "url": "https://github.com/wp-cli/php-cli-tools.git", - "reference": "a6bb94664ca36d0962f9c2ff25591c315a550c51" + "reference": "f12b650d3738e471baed6dd47982d53c5c0ab1c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/a6bb94664ca36d0962f9c2ff25591c315a550c51", - "reference": "a6bb94664ca36d0962f9c2ff25591c315a550c51", + "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/f12b650d3738e471baed6dd47982d53c5c0ab1c3", + "reference": "f12b650d3738e471baed6dd47982d53c5c0ab1c3", "shasum": "" }, "require": { - "php": ">= 5.3.0" + "php": ">= 7.2.24" }, "require-dev": { "roave/security-advisories": "dev-latest", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "0.11.x-dev" + "dev-master": "0.12.x-dev" } }, "autoload": { @@ -10059,30 +10407,30 @@ ], "support": { "issues": "https://github.com/wp-cli/php-cli-tools/issues", - "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.11.22" + "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.12.6" }, - "time": "2023-12-03T19:25:05+00:00" + "time": "2025-09-11T12:43:04+00:00" }, { "name": "wp-cli/rewrite-command", - "version": "v2.0.14", + "version": "v2.0.16", "source": { "type": "git", "url": "https://github.com/wp-cli/rewrite-command.git", - "reference": "0dd0d11918eaaf2fcad5bc13646ecf266ffa83e9" + "reference": "84004ff4d14038d06c6fe489807eb09739e62b94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/rewrite-command/zipball/0dd0d11918eaaf2fcad5bc13646ecf266ffa83e9", - "reference": "0dd0d11918eaaf2fcad5bc13646ecf266ffa83e9", + "url": "https://api.github.com/repos/wp-cli/rewrite-command/zipball/84004ff4d14038d06c6fe489807eb09739e62b94", + "reference": "84004ff4d14038d06c6fe489807eb09739e62b94", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -10120,26 +10468,26 @@ "homepage": "https://github.com/wp-cli/rewrite-command", "support": { "issues": "https://github.com/wp-cli/rewrite-command/issues", - "source": "https://github.com/wp-cli/rewrite-command/tree/v2.0.14" + "source": "https://github.com/wp-cli/rewrite-command/tree/v2.0.16" }, - "time": "2024-10-01T10:45:45+00:00" + "time": "2025-11-11T13:30:58+00:00" }, { "name": "wp-cli/role-command", - "version": "v2.0.15", + "version": "v2.0.16", "source": { "type": "git", "url": "https://github.com/wp-cli/role-command.git", - "reference": "f92efbf92a0bb4b34e1de9523d9cbd393d406ba2" + "reference": "ed57fb5436b4d47954b07e56c734d19deb4fc491" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/role-command/zipball/f92efbf92a0bb4b34e1de9523d9cbd393d406ba2", - "reference": "f92efbf92a0bb4b34e1de9523d9cbd393d406ba2", + "url": "https://api.github.com/repos/wp-cli/role-command/zipball/ed57fb5436b4d47954b07e56c734d19deb4fc491", + "reference": "ed57fb5436b4d47954b07e56c734d19deb4fc491", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/wp-cli-tests": "^4" @@ -10186,30 +10534,30 @@ "homepage": "https://github.com/wp-cli/role-command", "support": { "issues": "https://github.com/wp-cli/role-command/issues", - "source": "https://github.com/wp-cli/role-command/tree/v2.0.15" + "source": "https://github.com/wp-cli/role-command/tree/v2.0.16" }, - "time": "2024-10-01T10:46:02+00:00" + "time": "2025-04-02T12:24:15+00:00" }, { "name": "wp-cli/scaffold-command", - "version": "v2.4.0", + "version": "v2.5.1", "source": { "type": "git", "url": "https://github.com/wp-cli/scaffold-command.git", - "reference": "d67d8348f653d00438535ec4389ab9259ef6fb8f" + "reference": "cd1e49a393b1af4eee4f5ccc3ac562862c65ccdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/scaffold-command/zipball/d67d8348f653d00438535ec4389ab9259ef6fb8f", - "reference": "d67d8348f653d00438535ec4389ab9259ef6fb8f", + "url": "https://api.github.com/repos/wp-cli/scaffold-command/zipball/cd1e49a393b1af4eee4f5ccc3ac562862c65ccdf", + "reference": "cd1e49a393b1af4eee4f5ccc3ac562862c65ccdf", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/extension-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -10252,32 +10600,32 @@ "homepage": "https://github.com/wp-cli/scaffold-command", "support": { "issues": "https://github.com/wp-cli/scaffold-command/issues", - "source": "https://github.com/wp-cli/scaffold-command/tree/v2.4.0" + "source": "https://github.com/wp-cli/scaffold-command/tree/v2.5.1" }, - "time": "2024-10-01T11:13:37+00:00" + "time": "2025-09-05T04:13:09+00:00" }, { "name": "wp-cli/search-replace-command", - "version": "v2.1.7", + "version": "v2.1.9", "source": { "type": "git", "url": "https://github.com/wp-cli/search-replace-command.git", - "reference": "89e1653c9b888179a121a8354c75fc5e8ca7931d" + "reference": "14aea81eca68effbc651d5fca4891a89c0667b2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/search-replace-command/zipball/89e1653c9b888179a121a8354c75fc5e8ca7931d", - "reference": "89e1653c9b888179a121a8354c75fc5e8ca7931d", + "url": "https://api.github.com/repos/wp-cli/search-replace-command/zipball/14aea81eca68effbc651d5fca4891a89c0667b2e", + "reference": "14aea81eca68effbc651d5fca4891a89c0667b2e", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/db-command": "^1.3 || ^2", "wp-cli/entity-command": "^1.3 || ^2", "wp-cli/extension-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -10312,26 +10660,26 @@ "homepage": "https://github.com/wp-cli/search-replace-command", "support": { "issues": "https://github.com/wp-cli/search-replace-command/issues", - "source": "https://github.com/wp-cli/search-replace-command/tree/v2.1.7" + "source": "https://github.com/wp-cli/search-replace-command/tree/v2.1.9" }, - "time": "2024-06-28T09:30:38+00:00" + "time": "2025-11-11T13:31:01+00:00" }, { "name": "wp-cli/server-command", - "version": "v2.0.14", + "version": "v2.0.15", "source": { "type": "git", "url": "https://github.com/wp-cli/server-command.git", - "reference": "012e10d3281866235cbf626f38a27169d6c6e13b" + "reference": "80a9243f94e0ac073f9bfdb516d2ac7e1fa01a71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/server-command/zipball/012e10d3281866235cbf626f38a27169d6c6e13b", - "reference": "012e10d3281866235cbf626f38a27169d6c6e13b", + "url": "https://api.github.com/repos/wp-cli/server-command/zipball/80a9243f94e0ac073f9bfdb516d2ac7e1fa01a71", + "reference": "80a9243f94e0ac073f9bfdb516d2ac7e1fa01a71", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^2", @@ -10370,26 +10718,26 @@ "homepage": "https://github.com/wp-cli/server-command", "support": { "issues": "https://github.com/wp-cli/server-command/issues", - "source": "https://github.com/wp-cli/server-command/tree/v2.0.14" + "source": "https://github.com/wp-cli/server-command/tree/v2.0.15" }, - "time": "2024-10-01T10:46:38+00:00" + "time": "2025-04-10T11:03:13+00:00" }, { "name": "wp-cli/shell-command", - "version": "v2.0.15", + "version": "v2.0.16", "source": { "type": "git", "url": "https://github.com/wp-cli/shell-command.git", - "reference": "2c38ef12a912b23224c7f2abd5bc716a889340fb" + "reference": "3af53a9f4b240e03e77e815b2ee10f229f1aa591" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/shell-command/zipball/2c38ef12a912b23224c7f2abd5bc716a889340fb", - "reference": "2c38ef12a912b23224c7f2abd5bc716a889340fb", + "url": "https://api.github.com/repos/wp-cli/shell-command/zipball/3af53a9f4b240e03e77e815b2ee10f229f1aa591", + "reference": "3af53a9f4b240e03e77e815b2ee10f229f1aa591", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/wp-cli-tests": "^4" @@ -10427,26 +10775,26 @@ "homepage": "https://github.com/wp-cli/shell-command", "support": { "issues": "https://github.com/wp-cli/shell-command/issues", - "source": "https://github.com/wp-cli/shell-command/tree/v2.0.15" + "source": "https://github.com/wp-cli/shell-command/tree/v2.0.16" }, - "time": "2024-10-01T10:46:50+00:00" + "time": "2025-04-11T09:39:33+00:00" }, { "name": "wp-cli/super-admin-command", - "version": "v2.0.15", + "version": "v2.0.16", "source": { "type": "git", "url": "https://github.com/wp-cli/super-admin-command.git", - "reference": "ecd9cee09918eb34f60c05944cc188f4916cb026" + "reference": "54ac063c384743ee414806d42cb8c61c6aa1fa8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/super-admin-command/zipball/ecd9cee09918eb34f60c05944cc188f4916cb026", - "reference": "ecd9cee09918eb34f60c05944cc188f4916cb026", + "url": "https://api.github.com/repos/wp-cli/super-admin-command/zipball/54ac063c384743ee414806d42cb8c61c6aa1fa8e", + "reference": "54ac063c384743ee414806d42cb8c61c6aa1fa8e", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", @@ -10488,26 +10836,26 @@ "homepage": "https://github.com/wp-cli/super-admin-command", "support": { "issues": "https://github.com/wp-cli/super-admin-command/issues", - "source": "https://github.com/wp-cli/super-admin-command/tree/v2.0.15" + "source": "https://github.com/wp-cli/super-admin-command/tree/v2.0.16" }, - "time": "2024-10-01T10:48:29+00:00" + "time": "2025-04-02T13:07:32+00:00" }, { "name": "wp-cli/widget-command", - "version": "v2.1.11", + "version": "v2.1.12", "source": { "type": "git", "url": "https://github.com/wp-cli/widget-command.git", - "reference": "c50cd32e4e3d16bf29821ae0208b7154ef6f9031" + "reference": "73084053f7b32d92583e44d870b81f287beea6a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/widget-command/zipball/c50cd32e4e3d16bf29821ae0208b7154ef6f9031", - "reference": "c50cd32e4e3d16bf29821ae0208b7154ef6f9031", + "url": "https://api.github.com/repos/wp-cli/widget-command/zipball/73084053f7b32d92583e44d870b81f287beea6a9", + "reference": "73084053f7b32d92583e44d870b81f287beea6a9", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/extension-command": "^1.2 || ^2", @@ -10555,39 +10903,38 @@ "homepage": "https://github.com/wp-cli/widget-command", "support": { "issues": "https://github.com/wp-cli/widget-command/issues", - "source": "https://github.com/wp-cli/widget-command/tree/v2.1.11" + "source": "https://github.com/wp-cli/widget-command/tree/v2.1.12" }, - "time": "2024-10-01T10:48:21+00:00" + "time": "2025-04-11T09:29:37+00:00" }, { "name": "wp-cli/wp-cli", - "version": "v2.11.0", + "version": "v2.12.0", "source": { "type": "git", "url": "https://github.com/wp-cli/wp-cli.git", - "reference": "53f0df112901fcf95099d0f501912a209429b6a9" + "reference": "03d30d4138d12b4bffd8b507b82e56e129e0523f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/53f0df112901fcf95099d0f501912a209429b6a9", - "reference": "53f0df112901fcf95099d0f501912a209429b6a9", + "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/03d30d4138d12b4bffd8b507b82e56e129e0523f", + "reference": "03d30d4138d12b4bffd8b507b82e56e129e0523f", "shasum": "" }, "require": { "ext-curl": "*", - "mustache/mustache": "^2.14.1", "php": "^5.6 || ^7.0 || ^8.0", "symfony/finder": ">2.7", + "wp-cli/mustache": "^2.14.99", "wp-cli/mustangostang-spyc": "^0.6.3", - "wp-cli/php-cli-tools": "~0.11.2" + "wp-cli/php-cli-tools": "~0.12.4" }, "require-dev": { - "roave/security-advisories": "dev-latest", "wp-cli/db-command": "^1.3 || ^2", "wp-cli/entity-command": "^1.2 || ^2", "wp-cli/extension-command": "^1.1 || ^2", "wp-cli/package-command": "^1 || ^2", - "wp-cli/wp-cli-tests": "^4.0.1" + "wp-cli/wp-cli-tests": "^4.3.10" }, "suggest": { "ext-readline": "Include for a better --prompt implementation", @@ -10600,7 +10947,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.11.x-dev" + "dev-main": "2.12.x-dev" } }, "autoload": { @@ -10627,7 +10974,7 @@ "issues": "https://github.com/wp-cli/wp-cli/issues", "source": "https://github.com/wp-cli/wp-cli" }, - "time": "2024-08-08T03:04:55+00:00" + "time": "2025-05-07T01:16:12+00:00" }, { "name": "wp-cli/wp-cli-bundle", @@ -10704,23 +11051,23 @@ }, { "name": "wp-cli/wp-config-transformer", - "version": "v1.4.1", + "version": "v1.4.3", "source": { "type": "git", "url": "https://github.com/wp-cli/wp-config-transformer.git", - "reference": "9da378b5a4e28bba3bce4ff4ff04a54d8c9f1a01" + "reference": "5ade4e70349a1d5cd07efc33880ceb5eebb9e9fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/wp-config-transformer/zipball/9da378b5a4e28bba3bce4ff4ff04a54d8c9f1a01", - "reference": "9da378b5a4e28bba3bce4ff4ff04a54d8c9f1a01", + "url": "https://api.github.com/repos/wp-cli/wp-config-transformer/zipball/5ade4e70349a1d5cd07efc33880ceb5eebb9e9fa", + "reference": "5ade4e70349a1d5cd07efc33880ceb5eebb9e9fa", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0 || ^8.0" + "php": ">=7.2.24" }, "require-dev": { - "wp-cli/wp-cli-tests": "^4.0" + "wp-cli/wp-cli-tests": "^4.0 || ^5.0" }, "type": "library", "extra": { @@ -10747,9 +11094,9 @@ "homepage": "https://github.com/wp-cli/wp-config-transformer", "support": { "issues": "https://github.com/wp-cli/wp-config-transformer/issues", - "source": "https://github.com/wp-cli/wp-config-transformer/tree/v1.4.1" + "source": "https://github.com/wp-cli/wp-config-transformer/tree/v1.4.3" }, - "time": "2024-10-16T12:50:47+00:00" + "time": "2025-11-11T13:31:09+00:00" }, { "name": "wp-coding-standards/wpcs", @@ -10804,23 +11151,23 @@ }, { "name": "wp-graphql/wp-graphql", - "version": "v2.0.0", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/wp-graphql/wp-graphql.git", - "reference": "a2e5d6838af8731b19efb4709e4490720ce47595" + "reference": "5b7e6886fd1cd8b447792a109c31bfbca87eafa3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-graphql/wp-graphql/zipball/a2e5d6838af8731b19efb4709e4490720ce47595", - "reference": "a2e5d6838af8731b19efb4709e4490720ce47595", + "url": "https://api.github.com/repos/wp-graphql/wp-graphql/zipball/5b7e6886fd1cd8b447792a109c31bfbca87eafa3", + "reference": "5b7e6886fd1cd8b447792a109c31bfbca87eafa3", "shasum": "" }, "require": { "appsero/client": "2.0.4", "ivome/graphql-relay-php": "0.7.0", "php": "^7.4 || ^8.0", - "webonyx/graphql-php": "15.19.1" + "webonyx/graphql-php": "15.24.0" }, "require-dev": { "automattic/vipwpcs": "^3.0", @@ -10832,6 +11179,8 @@ "codeception/module-rest": "^1.2", "codeception/module-webdriver": "^1.0", "codeception/util-universalframework": "^1.0", + "composer/semver": "^3.0", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", "lucatume/wp-browser": "<3.5", "phpcompatibility/php-compatibility": "dev-develop as 9.9.9", "phpcompatibility/phpcompatibility-wp": "^2.1", @@ -10851,6 +11200,7 @@ "WPGraphQL\\": "src/" }, "classmap": [ + "deprecated/", "src/WPGraphQL.php" ] }, @@ -10879,9 +11229,9 @@ "description": "GraphQL API for WordPress", "support": { "issues": "https://github.com/wp-graphql/wp-graphql/issues", - "source": "https://github.com/wp-graphql/wp-graphql/tree/v2.0.0" + "source": "https://github.com/wp-graphql/wp-graphql/tree/v2.5.3" }, - "time": "2025-02-13T20:45:59+00:00" + "time": "2025-11-24T22:39:53+00:00" }, { "name": "wp-graphql/wp-graphql-testcase", diff --git a/src/Cache/Collection.php b/src/Cache/Collection.php index 815fcf19..0be0eda3 100644 --- a/src/Cache/Collection.php +++ b/src/Cache/Collection.php @@ -73,6 +73,9 @@ public function save_query_mapping_cb( return; } + // Set the request so build_key() can access AppContext->viewer for the user ID + $this->request = $request; + $request_key = $this->build_key( $query_id, $query, $variables, $operation ); if ( false === $request_key ) { diff --git a/src/Cache/Query.php b/src/Cache/Query.php index ec5cfdca..51e41787 100644 --- a/src/Cache/Query.php +++ b/src/Cache/Query.php @@ -22,6 +22,13 @@ class Query { **/ public static $storage = null; + /** + * The current GraphQL request. + * + * @var \WPGraphQL\Request|null + */ + protected $request; + /** * @return void */ @@ -60,14 +67,23 @@ public function build_key( $query_id, $query, $variables = null, $operation = nu return false; } - // WP_User - $user = wp_get_current_user(); + // Get user ID from AppContext->viewer which is set at Request creation + // and doesn't change even if wp_set_current_user(0) is called later. + // We intentionally do NOT fall back to wp_get_current_user() because that + // function's return value can change mid-request (e.g., when WPGraphQL calls + // wp_set_current_user(0) in has_authentication_errors()). Using 0 as fallback + // treats the request as unauthenticated, which is the safe default. + if ( $this->request ) { + $user_id = $this->request->app_context->viewer->ID; + } else { + $user_id = 0; + } $parts = [ 'query' => $query, 'variables' => $variables ?: null, 'operation' => $operation ?: null, - 'user' => $user->ID, + 'user' => $user_id, ]; $parts_string = wp_json_encode( $parts ); diff --git a/src/Cache/Results.php b/src/Cache/Results.php index 27b2e850..36c3db27 100644 --- a/src/Cache/Results.php +++ b/src/Cache/Results.php @@ -22,9 +22,14 @@ class Results extends Query { protected $is_cached = []; /** - * @var \WPGraphQL\Request + * Stores whether the object cache is enabled. + * + * This is cached after first determination to ensure consistent behavior + * throughout the request lifecycle, even if WordPress auth state changes. + * + * @var bool|null */ - protected $request; + protected $is_object_cache_enabled = null; /** * @return void @@ -36,9 +41,35 @@ public function init() { add_action( 'wpgraphql_cache_purge_all', [ $this, 'purge_all_cb' ], 10, 0 ); add_filter( 'graphql_request_results', [ $this, 'add_cache_key_to_response_extensions' ], 10, 7 ); + // Set Cache-Control: no-store for authenticated requests to prevent network/CDN caching + add_filter( 'graphql_response_headers_to_send', [ $this, 'add_no_cache_headers_for_authenticated_requests' ], PHP_INT_MAX ); + parent::init(); } + /** + * Add Cache-Control: no-store header for authenticated requests. + * + * This prevents network caches (Varnish, CDN, etc.) from caching responses + * that were made by authenticated users, which could contain sensitive data. + * + * Uses AppContext->viewer which is set at Request creation and doesn't change + * even if wp_set_current_user(0) is called later. + * + * @param array $headers The headers to be sent with the response. + * + * @return array The modified headers. + */ + public function add_no_cache_headers_for_authenticated_requests( $headers ) { + // Use the viewer from AppContext, which is set at Request creation + // and doesn't change even if wp_set_current_user(0) is called later + if ( $this->request && $this->request->app_context->viewer->exists() ) { + $headers['Cache-Control'] = 'no-store'; + } + + return $headers; + } + /** * Unique identifier for this request is normalized query string, operation and variables * @@ -111,6 +142,10 @@ public function add_cache_key_to_response_extensions( public function get_query_results_from_cache_cb( $result, Request $request ) { $this->request = $request; + // Reset the cached is_object_cache_enabled value for each new request + // This ensures we re-evaluate based on the current request's auth state + $this->is_object_cache_enabled = null; + // if caching is not enabled or the request is authenticated, bail early // right now we're not supporting GraphQL cache for authenticated requests. // Possibly in the future. @@ -177,6 +212,12 @@ public function get_result( $query_id, $query_string, $variables, $operation_nam */ protected function is_object_cache_enabled() { + // Return cached value if already determined for this request. + // This ensures consistent behavior even if WordPress auth state changes mid-request. + if ( null !== $this->is_object_cache_enabled ) { + return (bool) $this->is_object_cache_enabled; + } + // default to disabled $enabled = false; @@ -185,13 +226,21 @@ protected function is_object_cache_enabled() { $enabled = true; } - // however, if the user is logged in, we should bypass the cache - if ( is_user_logged_in() ) { + // Check if the user is authenticated using AppContext->viewer. + // This is more reliable than is_user_logged_in() because: + // 1. AppContext->viewer is set once at Request creation and doesn't change + // 2. WPGraphQL core may call wp_set_current_user(0) mid-request in has_authentication_errors(), + // or even within individual resolvers, etc which would cause is_user_logged_in() + // to return false even for authenticated requests + // 3. Using AppContext is more "GraphQL-native" and consistent with how WPGraphQL handles auth + if ( $this->request && $this->request->app_context->viewer->exists() ) { $enabled = false; } // @phpcs:ignore - return (bool) apply_filters( 'graphql_cache_is_object_cache_enabled', $enabled, $this->request ); + $this->is_object_cache_enabled = (bool) apply_filters( 'graphql_cache_is_object_cache_enabled', $enabled, $this->request ); + + return $this->is_object_cache_enabled; } /** diff --git a/tests/_support/Helper/Functional.php b/tests/_support/Helper/Functional.php index 4183cb0a..fcb68b2d 100644 --- a/tests/_support/Helper/Functional.php +++ b/tests/_support/Helper/Functional.php @@ -6,5 +6,4 @@ class Functional extends \Codeception\Module { - } diff --git a/tests/acceptance.suite.yml b/tests/acceptance.suite.yml index e030d031..d016a05c 100644 --- a/tests/acceptance.suite.yml +++ b/tests/acceptance.suite.yml @@ -10,6 +10,7 @@ modules: enabled: - Asserts - WPBrowser + - WPDb - REST: depends: PhpBrowser part: Json @@ -24,3 +25,10 @@ modules: adminUsername: '%TEST_SITE_ADMIN_USERNAME%' adminPassword: '%TEST_SITE_ADMIN_PASSWORD%' adminPath: '/wp-admin' + WPDb: + dsn: 'mysql:host=%TEST_SITE_DB_HOST%;dbname=%TEST_SITE_DB_NAME%' + user: '%TEST_SITE_DB_USER%' + password: '%TEST_SITE_DB_PASSWORD%' + url: '%WP_URL%' + tablePrefix: '%TEST_SITE_TABLE_PREFIX%' + urlReplacement: false diff --git a/tests/acceptance/AuthenticatedRequestCacheCest.php b/tests/acceptance/AuthenticatedRequestCacheCest.php new file mode 100644 index 00000000..b08916a0 --- /dev/null +++ b/tests/acceptance/AuthenticatedRequestCacheCest.php @@ -0,0 +1,229 @@ +viewer (set early, stable) instead of is_user_logged_in(). + */ +class AuthenticatedRequestCacheCest { + + /** + * @var int + */ + protected $draft_post_id; + + /** + * @var string + */ + protected $draft_post_title; + + /** + * @var string + */ + protected $test_run_id; + + public function _before( AcceptanceTester $I ) { + $this->test_run_id = uniqid( 'test_', true ); + $this->draft_post_title = 'Secret Draft ' . $this->test_run_id; + } + + /** + * Test that draft posts visible to admin don't leak to public users via cache. + * + * This test: + * 1. Logs in as admin via browser + * 2. Makes GraphQL request for drafts via browser URL (same session) + * 3. Verifies admin sees the draft and response is NOT from cache + * 4. Makes SECOND authenticated request to verify cache is still not populated + * 5. Makes same request via REST module (clean session, no cookies) + * 6. Verifies public user does NOT see the draft + */ + public function testDraftContentDoesNotLeakToPublicUsers( AcceptanceTester $I ) { + // Enable object cache + $I->haveOptionInDatabase( 'graphql_cache_section', [ 'cache_toggle' => 'on' ] ); + + // Create draft post + $this->draft_post_id = $I->havePostInDatabase( [ + 'post_type' => 'post', + 'post_status' => 'draft', + 'post_title' => $this->draft_post_title, + 'post_content' => 'Secret content', + ] ); + + // Build unique query + $operation_name = 'TestDraft_' . str_replace( '.', '_', $this->test_run_id ); + $query = "query {$operation_name} { posts(where: {status: DRAFT}) { nodes { title status } } }"; + $query_encoded = urlencode( $query ); + $graphql_url = "/graphql?query={$query_encoded}"; + + // ===================================================== + // STEP 1: Admin logs in and makes GraphQL request + // ===================================================== + $I->loginAsAdmin(); + $I->amOnPage( $graphql_url ); + + // Grab the raw page source (JSON response) + $auth_body = $I->grabPageSource(); + codecept_debug( 'Authenticated response: ' . $auth_body ); + + $auth_response = json_decode( $auth_body, true ); + $I->assertIsArray( $auth_response, 'Response should be valid JSON' ); + $I->assertArrayHasKey( 'data', $auth_response, 'Response should have data key' ); + + // Admin should see the draft post + $auth_posts = $auth_response['data']['posts']['nodes'] ?? []; + $found_draft = false; + foreach ( $auth_posts as $post ) { + if ( $post['title'] === $this->draft_post_title ) { + $found_draft = true; + break; + } + } + $I->assertTrue( $found_draft, 'Authenticated admin should see the draft post' ); + + // Verify it was NOT served from cache (first request) + $auth_cache_info = $auth_response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; + codecept_debug( 'Auth cache info (1st request): ' . json_encode( $auth_cache_info ) ); + $I->assertEquals( [], $auth_cache_info, 'First auth request should NOT be from cache' ); + + // ===================================================== + // STEP 2: Make SECOND authenticated request to verify cache is still not populated + // ===================================================== + $I->amOnPage( $graphql_url ); + + $auth_body_2 = $I->grabPageSource(); + codecept_debug( 'Second authenticated response: ' . $auth_body_2 ); + + $auth_response_2 = json_decode( $auth_body_2, true ); + $I->assertIsArray( $auth_response_2, 'Second auth response should be valid JSON' ); + $I->assertArrayHasKey( 'data', $auth_response_2, 'Second auth response should have data key' ); + + // Admin should still see the draft post + $auth_posts_2 = $auth_response_2['data']['posts']['nodes'] ?? []; + $found_draft_2 = false; + foreach ( $auth_posts_2 as $post ) { + if ( $post['title'] === $this->draft_post_title ) { + $found_draft_2 = true; + break; + } + } + $I->assertTrue( $found_draft_2, 'Second authenticated request should still see the draft post' ); + + // CRITICAL: Second auth request should ALSO not be from cache + // This proves authenticated requests never populate or use the object cache + $auth_cache_info_2 = $auth_response_2['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; + codecept_debug( 'Auth cache info (2nd request): ' . json_encode( $auth_cache_info_2 ) ); + $I->assertEquals( [], $auth_cache_info_2, 'Second auth request should ALSO NOT be from cache - authenticated requests should never cache' ); + + // ===================================================== + // STEP 3: Make same request as public user via REST (clean session) + // ===================================================== + // Use sendGet from REST module - this doesn't share cookies with WPBrowser + $I->deleteHeader( 'Authorization' ); + $I->sendGet( 'graphql', [ 'query' => $query ] ); + $I->seeResponseCodeIs( 200 ); + + $public_body = $I->grabResponse(); + codecept_debug( 'Public response: ' . $public_body ); + + $public_response = json_decode( $public_body, true ); + $I->assertIsArray( $public_response, 'Response should be valid JSON' ); + + // Check cache status + $public_cache_info = $public_response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; + codecept_debug( 'Public cache info: ' . json_encode( $public_cache_info ) ); + + // CRITICAL SECURITY CHECK: Public user should NOT see draft posts + $public_posts = $public_response['data']['posts']['nodes'] ?? []; + codecept_debug( 'Public posts count: ' . count( $public_posts ) ); + + foreach ( $public_posts as $post ) { + $I->assertNotEquals( + $this->draft_post_title, + $post['title'], + 'SECURITY VULNERABILITY: Public user can see draft posts!' + ); + } + + // Public request should NOT come from cache (auth didn't cache it) + $I->assertEquals( + [], + $public_cache_info, + 'Public request should NOT be from cache - auth request should not have cached' + ); + + // Cleanup + $I->dontHavePostInDatabase( [ 'ID' => $this->draft_post_id ] ); + $I->dontHaveOptionInDatabase( 'graphql_cache_section' ); + } + + /** + * Test that public requests ARE properly cached, but authenticated requests bypass the cache. + * + * This test: + * 1. Makes first public request - NOT from cache (populates cache) + * 2. Makes second public request - SHOULD be from cache + * 3. Logs in as admin and makes same request - should NOT be from cache + */ + public function testPublicRequestsAreCached( AcceptanceTester $I ) { + // Enable object cache + $I->haveOptionInDatabase( 'graphql_cache_section', [ 'cache_toggle' => 'on' ] ); + + $operation_name = 'TestPublic_' . str_replace( '.', '_', $this->test_run_id ); + $query_string = "query {$operation_name} { __typename }"; + $query = urlencode( $query_string ); + $graphql_url = "/graphql?query={$query}"; + + // ===================================================== + // STEP 1: First public request - NOT from cache (populates cache) + // ===================================================== + $I->amOnPage( $graphql_url ); + $body1 = $I->grabPageSource(); + codecept_debug( 'First public response: ' . $body1 ); + + $response1 = json_decode( $body1, true ); + $I->assertIsArray( $response1, 'Response should be valid JSON' ); + + $cache1 = $response1['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; + $I->assertEquals( [], $cache1, 'First public request should NOT be from cache' ); + + // ===================================================== + // STEP 2: Second public request - SHOULD be from cache + // ===================================================== + $I->amOnPage( $graphql_url ); + $body2 = $I->grabPageSource(); + codecept_debug( 'Second public response: ' . $body2 ); + + $response2 = json_decode( $body2, true ); + $I->assertIsArray( $response2, 'Response should be valid JSON' ); + + $cache2 = $response2['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; + $I->assertNotEmpty( $cache2, 'Second public request SHOULD be from cache' ); + + // ===================================================== + // STEP 3: Authenticated request - should NOT use cache + // Even though there's a cached entry, authenticated users bypass it entirely + // ===================================================== + $I->loginAsAdmin(); + $I->amOnPage( $graphql_url ); + $body3 = $I->grabPageSource(); + codecept_debug( 'Authenticated response: ' . $body3 ); + + $response3 = json_decode( $body3, true ); + $I->assertIsArray( $response3, 'Authenticated response should be valid JSON' ); + $I->assertArrayHasKey( 'data', $response3, 'Authenticated response should have data key' ); + + $cache3 = $response3['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; + $I->assertEquals( [], $cache3, 'Authenticated request should NOT be from cache - auth users bypass cache entirely' ); + + // Cleanup + $I->dontHaveOptionInDatabase( 'graphql_cache_section' ); + } +} diff --git a/tests/wpunit/AuthenticatedRequestCacheTest.php b/tests/wpunit/AuthenticatedRequestCacheTest.php new file mode 100644 index 00000000..fa55c3cc --- /dev/null +++ b/tests/wpunit/AuthenticatedRequestCacheTest.php @@ -0,0 +1,480 @@ +viewer is set to current user (e.g., admin with ID 123) + * 2. before_execute() runs - stores globals, handles batch setup (NO auth checks here!) + * 3. Query executes, returning data based on admin's permissions (e.g., draft posts) + * 4. after_execute() is called + * 5. has_authentication_errors() is called which does: + * - Checks if nonce is present + * - If NO nonce: calls wp_set_current_user(0) to treat as unauthenticated + * - This has been the behavior since 2019 (see Request.php lines 355-361) + * 6. after_execute_actions() runs (lines 420-427) + * 7. 'graphql_return_response' action fires - THIS IS WHERE SMART CACHE SAVES TO CACHE + * + * ## The Challenge + * + * At step 7, if we check is_user_logged_in(), it returns FALSE because wp_set_current_user(0) + * was called in step 5. But the query results from step 3 contain authenticated data! + * + * So we would: + * - See is_user_logged_in() === false + * - Think "this is an unauthenticated request, safe to cache" + * - Cache authenticated data (draft posts, private content, etc.) + * - Public users then get this cached authenticated data + * + * ## Historical Context + * + * The comment in WPGraphQL core at line 408-409 says "prevent execution" but + * has_authentication_errors() runs in after_execute() - AFTER the query has already executed! + * + * GitHub Issue #38 (wp-graphql-jwt-authentication, July 2019) + * discusses this exact problem - authentication errors should halt execution BEFORE + * the query runs, not after. The issue suggests using the rest_authentication_errors + * hook pattern to abort processing early. While the issue is closed it seems it might not be fully addressed. + * + * @see https://github.com/wp-graphql/wp-graphql-jwt-authentication/issues/38 + * + * ## The Solution + * + * Instead of checking is_user_logged_in() (which changes mid-request), we check + * AppContext->viewer which is set once at Request creation and never changes. + * + * - AppContext->viewer is set in Request constructor via WPGraphQL::get_app_context() + * - This captures the REAL user at request start, before any nonce checks + * - Even after wp_set_current_user(0) is called, AppContext->viewer still reflects + * the original authenticated user + * + * Additionally, we cache the result of is_object_cache_enabled() per-request to ensure + * consistent behavior throughout the entire request lifecycle. + * + * @see vendor/wp-graphql/wp-graphql/src/Request.php lines 355-361 (wp_set_current_user(0)) + * @see vendor/wp-graphql/wp-graphql/src/Request.php lines 408-427 (execution order) + * @see vendor/wp-graphql/wp-graphql/src/WPGraphQL.php line 950 (AppContext->viewer set) + */ +class AuthenticatedRequestCacheTest extends \Codeception\TestCase\WPTestCase { + + /** + * @var \WP_User + */ + protected $admin_user; + + /** + * @var int + */ + protected $draft_post_id; + + /** + * @var int + */ + protected $published_post_id; + + public function setUp(): void { + parent::setUp(); + + // Enable object caching + add_option( 'graphql_cache_section', [ 'cache_toggle' => 'on' ] ); + + // Create an admin user + $this->admin_user = self::factory()->user->create_and_get( [ + 'role' => 'administrator', + ] ); + + // Create a draft post (only visible to authenticated users with proper capabilities) + $this->draft_post_id = self::factory()->post->create( [ + 'post_type' => 'post', + 'post_status' => 'draft', + 'post_title' => 'Secret Draft Post', + 'post_author' => $this->admin_user->ID, + ] ); + + // Create a published post + $this->published_post_id = self::factory()->post->create( [ + 'post_type' => 'post', + 'post_status' => 'publish', + 'post_title' => 'Public Published Post', + ] ); + } + + public function tearDown(): void { + delete_option( 'graphql_cache_section' ); + wp_delete_post( $this->draft_post_id, true ); + wp_delete_post( $this->published_post_id, true ); + wp_delete_user( $this->admin_user->ID ); + + parent::tearDown(); + } + + /** + * Test that is_object_cache_enabled returns false when AppContext viewer exists (authenticated), + * even if wp_set_current_user(0) was called later. + * + * This is the core of the fix - using AppContext->viewer instead of + * is_user_logged_in() which can change mid-request. + */ + public function testCacheIsDisabledWhenAppContextViewerExists() { + // Log in as admin before creating the GraphQL request + wp_set_current_user( $this->admin_user->ID ); + + // Execute a simple query - this creates a Request with AppContext->viewer set to admin + $query = '{ __typename }'; + $response = graphql( [ 'query' => $query ] ); + + // The cache should have been disabled for this authenticated request + $this->assertEmpty( + $response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Authenticated request should not be cached' + ); + } + + /** + * Test that cache IS enabled for truly unauthenticated requests. + */ + public function testCacheIsEnabledForUnauthenticatedRequests() { + // Ensure no user is logged in + wp_set_current_user( 0 ); + + // Execute a simple query twice + $query = '{ __typename }'; + + // First request - should execute and cache + $response1 = graphql( [ 'query' => $query ] ); + $this->assertArrayHasKey( 'data', $response1 ); + + // Second request - should be served from cache + $response2 = graphql( [ 'query' => $query ] ); + + // The second response should indicate it came from cache + $this->assertNotEmpty( + $response2['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Second unauthenticated request should be served from cache' + ); + } + + /** + * Test the real-world scenario with draft posts. + * + * This test replicates the scenario: + * + * 1. Admin user is logged in (authenticated via WordPress session/cookie) + * 2. Admin makes request: /graphql/?query={posts(where:{status:DRAFT}){nodes{title status}}} + * 3. Admin sees draft posts in response (expected - they have permission) + * 4. WPGraphQL core calls wp_set_current_user(0) because no nonce was provided + * 5. Smart cache attempts to save results - should be BLOCKED because user WAS authenticated + * 6. Public user makes the same request + * 7. Public user should NOT see the draft posts + * + * WITHOUT THE FIX: At step 5, is_user_logged_in() returns FALSE (because of step 4), + * so the cache thinks it's safe to save, and public users get cached draft posts. + * + * WITH THE FIX: At step 5, we check AppContext->viewer which still reflects the admin + * user from step 1, so we correctly block caching. + */ + public function testDraftPostsDoNotLeakFromAuthenticatedToPublicUsers() { + // ===================================================================== + // STEP 1: Admin user is logged in + // ===================================================================== + wp_set_current_user( $this->admin_user->ID ); + + // This is the exact query from the real-world scenario + // /graphql/?query={posts(where:{status:DRAFT}){nodes{title status}}} + $query = '{ + posts(where: {status: DRAFT}) { + nodes { + title + status + } + } + }'; + + // ===================================================================== + // STEP 2-3: Admin executes query and sees draft posts + // ===================================================================== + $admin_response = graphql( [ 'query' => $query ] ); + + // Verify admin can see the draft post + $this->assertArrayHasKey( 'data', $admin_response ); + $this->assertArrayHasKey( 'posts', $admin_response['data'] ); + + $admin_posts = $admin_response['data']['posts']['nodes']; + $found_draft = false; + foreach ( $admin_posts as $post ) { + if ( 'Secret Draft Post' === $post['title'] ) { + $found_draft = true; + // GraphQL returns status in lowercase + $this->assertEquals( 'draft', strtolower( $post['status'] ) ); + } + } + $this->assertTrue( $found_draft, 'Admin should see the draft post' ); + + // ===================================================================== + // STEP 4-5: Verify the response was NOT cached + // (This is where the fix prevents the issue) + // ===================================================================== + $this->assertEmpty( + $admin_response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Admin request should NOT be served from cache' + ); + + // ===================================================================== + // STEP 6: Public user (incognito window) makes the same request + // ===================================================================== + wp_set_current_user( 0 ); // Simulate unauthenticated user + + $public_response = graphql( [ 'query' => $query ] ); + + // ===================================================================== + // STEP 7: Verify public user does NOT see draft posts + // ===================================================================== + $this->assertArrayHasKey( 'data', $public_response ); + $public_posts = $public_response['data']['posts']['nodes'] ?? []; + + // Public user should NOT see the draft post - this is the critical check + foreach ( $public_posts as $post ) { + $this->assertNotEquals( + 'Secret Draft Post', + $post['title'], + 'Public user should not see draft post that was visible to admin.' + ); + $this->assertNotEquals( + 'draft', + strtolower( $post['status'] ), + 'Public user should not see draft content.' + ); + } + + // Also verify the public response was NOT served from a polluted cache + $this->assertEmpty( + $public_response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Public request should not be served from a cache that was potentially populated by authenticated user' + ); + } + + /** + * Test that authenticated query results are NOT cached and don't leak to public users. + * + * This simulates the full flow: + * 1. Admin user is logged in + * 2. Request is created with AppContext->viewer set to admin + * 3. Query executes and returns draft posts + * 4. Cache save is attempted but should be blocked + * 5. Public user makes same query + * 6. Verify: Public user should NOT see cached authenticated data + */ + public function testAuthenticatedQueryResultsAreNotCached() { + // Log in as admin + wp_set_current_user( $this->admin_user->ID ); + + $query = ' + query GetDraftPosts { + posts(where: {status: DRAFT}) { + nodes { + id + title + status + } + } + } + '; + + // Execute the query as authenticated user + $response = graphql( [ 'query' => $query ] ); + + // Verify we got the draft post in the response + $this->assertArrayHasKey( 'data', $response ); + $this->assertArrayHasKey( 'posts', $response['data'] ); + + // Now check that the result was NOT cached + $this->assertEmpty( + $response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Authenticated request should not be from cache' + ); + + // Now log out and make the same request + wp_set_current_user( 0 ); + + $public_response = graphql( [ 'query' => $query ] ); + + // The public response should also NOT be from cache (because the authenticated + // user's response should not have been cached in the first place) + $this->assertEmpty( + $public_response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Public request should not be served from a cache that was populated by authenticated user' + ); + + // And the public response should NOT contain the draft post + $public_posts = $public_response['data']['posts']['nodes'] ?? []; + foreach ( $public_posts as $post ) { + $this->assertNotEquals( + 'Secret Draft Post', + $post['title'], + 'Public user should NOT see draft posts that were visible to authenticated user' + ); + } + } + + /** + * Test that the Cache-Control header method correctly identifies authenticated requests. + * + * This ensures that network caches (Varnish, CDN) also don't cache authenticated responses. + * The Cache-Control: no-store header tells upstream caches not to store the response. + * + * Note: The graphql_response_headers_to_send filter only fires for HTTP requests, + * not internal graphql() calls. So we test the method directly. + */ + public function testCacheControlHeaderSetForAuthenticatedRequests() { + // Log in as admin + wp_set_current_user( $this->admin_user->ID ); + + // Execute a query to set up the request on the Results instance + $query = '{ __typename }'; + graphql( [ 'query' => $query ] ); + + // Get the Results instance and test the header method directly + $results = new Results(); + $results->init(); + + // We need to set the request on the Results instance + // Use reflection to set the request property + $reflection = new \ReflectionClass( $results ); + $request_property = $reflection->getProperty( 'request' ); + $request_property->setAccessible( true ); + + // Create a mock request with an authenticated viewer + $mock_request = new \stdClass(); + $mock_request->app_context = new \stdClass(); + $mock_request->app_context->viewer = wp_get_current_user(); + + $request_property->setValue( $results, $mock_request ); + + // Test the header filter method directly + $headers = [ 'Content-Type' => 'application/json' ]; + $filtered_headers = $results->add_no_cache_headers_for_authenticated_requests( $headers ); + + $this->assertArrayHasKey( 'Cache-Control', $filtered_headers, 'Cache-Control header should be set for authenticated requests' ); + $this->assertEquals( 'no-store', $filtered_headers['Cache-Control'], 'Cache-Control should be no-store for authenticated requests' ); + } + + /** + * Test that Cache-Control header is NOT set to no-store for unauthenticated requests. + * + * Unauthenticated requests CAN be cached by network caches, so we should not set + * Cache-Control: no-store for them. + */ + public function testCacheControlHeaderNotSetForUnauthenticatedRequests() { + // Ensure no user is logged in + wp_set_current_user( 0 ); + + // Get the Results instance and test the header method directly + $results = new Results(); + $results->init(); + + // Use reflection to set the request property + $reflection = new \ReflectionClass( $results ); + $request_property = $reflection->getProperty( 'request' ); + $request_property->setAccessible( true ); + + // Create a mock request with an unauthenticated viewer + $mock_request = new \stdClass(); + $mock_request->app_context = new \stdClass(); + $mock_request->app_context->viewer = wp_get_current_user(); // Returns user with ID 0 + + $request_property->setValue( $results, $mock_request ); + + // Test the header filter method directly + $headers = [ 'Content-Type' => 'application/json' ]; + $filtered_headers = $results->add_no_cache_headers_for_authenticated_requests( $headers ); + + // Cache-Control should NOT be set to no-store + $this->assertNotEquals( + 'no-store', + $filtered_headers['Cache-Control'] ?? '', + 'Cache-Control should not be no-store for unauthenticated requests' + ); + } + + /** + * Test that the is_object_cache_enabled result is cached after first determination. + * + * This ensures consistent behavior throughout the request even if something + * tries to change the auth state mid-request. + * + * The property is reset at the start of each new request (in get_query_results_from_cache_cb) + * to ensure each request gets a fresh evaluation based on its own auth state. + */ + public function testIsObjectCacheEnabledResultIsCached() { + $results = new Results(); + $results->init(); + + // Ensure no user is logged in + wp_set_current_user( 0 ); + + // We need to set a mock request on the Results object + // Since we can't easily create a full Request object, we'll test via graphql() + $query = '{ __typename }'; + + // First request as unauthenticated - should enable cache + $response1 = graphql( [ 'query' => $query ] ); + + // Second identical request should come from cache + $response2 = graphql( [ 'query' => $query ] ); + + $this->assertNotEmpty( + $response2['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Second request should be served from cache, proving cache is enabled' + ); + } + + /** + * Test that multiple sequential requests with different auth states are handled correctly. + * + * This ensures the per-request reset of is_object_cache_enabled works correctly. + */ + public function testSequentialRequestsWithDifferentAuthStates() { + $query = '{ __typename }'; + + // Request 1: Unauthenticated - should cache + wp_set_current_user( 0 ); + $response1 = graphql( [ 'query' => $query ] ); + $this->assertArrayHasKey( 'data', $response1 ); + + // Request 2: Unauthenticated again - should be from cache + $response2 = graphql( [ 'query' => $query ] ); + $this->assertNotEmpty( + $response2['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Second unauthenticated request should be from cache' + ); + + // Request 3: Authenticated - should NOT use cache and NOT cache result + wp_set_current_user( $this->admin_user->ID ); + $response3 = graphql( [ 'query' => $query ] ); + $this->assertEmpty( + $response3['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Authenticated request should not be from cache' + ); + + // Request 4: Back to unauthenticated - cache should still work + // (the authenticated request should not have polluted the cache) + wp_set_current_user( 0 ); + $response4 = graphql( [ 'query' => $query ] ); + $this->assertNotEmpty( + $response4['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Unauthenticated request after authenticated request should still use cache' + ); + } + +}