diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index a718fa9..3dfbc3d 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -5,12 +5,12 @@ name: docs # is reflected out of all five `src/` trees at build time. # # Pull requests build and check but never deploy. `master` deploys. The -# reference documents the satellites from their PUBLISHED tags: a satellite -# release changes what belongs on this site without changing a single file -# here. Deliberately no `repository_dispatch` wired to a satellite release — -# a cross-repository PAT for a rare event that the weekly cron already bounds -# is not worth the secret-management overhead; `workflow_dispatch` covers the -# "I want it now" case by hand. +# reference documents the satellites at the versions +# `docs/.api-workspace/composer.lock` holds — a caret on 0.x pins a minor, so +# the lock moves in the release PR that follows a satellite release, and the +# `composer outdated` step below turns a lock left behind into a red build +# rather than a site that quietly documents a version three minors old (which +# is what happened between 2026-08-28 and 2026-09-05). on: pull_request: paths: &paths @@ -29,7 +29,8 @@ on: branches: - master paths: *paths - # The reference is never more than a week behind an adapter release. + # The weekly run re-reads the lock, so a satellite release nobody pinned is + # reported within a week even when nothing here changed. schedule: - cron: '41 5 * * 1' # Mondays, 05:41 UTC workflow_dispatch: @@ -83,6 +84,13 @@ jobs: working-directory: docs/.api-workspace run: composer install --no-interaction --no-progress + # A satellite with a release the pins do not reach is documented at the + # wrong version, silently. `--direct` looks at the four satellites only + # (and the docblock parser, ignored), `--strict` makes it a red build. + - name: Refuse a workspace that documents a satellite behind its release + working-directory: docs/.api-workspace + run: composer outdated --direct --strict --ignore phpdocumentor/reflection-docblock + # What every engine reference page is stamped with. On a tagged commit # `git describe` prints the tag; between releases it prints the nearest # tag plus the commit, so a page built from master still says which diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml index 4f37b82..4fc7637 100644 --- a/.github/workflows/static-analysis.yml +++ b/.github/workflows/static-analysis.yml @@ -85,3 +85,10 @@ jobs: - name: Psalm run: composer psalm + + # Part of `composer release-check`, and until now run by nobody but a + # human before a tag: rector was red under green builds for five + # releases of this family before anyone looked. Same job, so the + # required check keeps its name. + - name: Rector + run: composer rector diff --git a/.gitignore b/.gitignore index 98a255b..e5ed8a1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ vendor/ composer.lock +# The API reflection workspace is a project, not a library: its lock is what +# the site documents the satellites from, and it moves with their releases. +!/docs/.api-workspace/composer.lock .php-cs-fixer.cache /build/* !/build/.gitkeep diff --git a/AGENTS.md b/AGENTS.md index dc42c82..c413e33 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -451,6 +451,7 @@ decided lives in this section and in `docs/scripts/check-integrity.mjs`. | **A new `@api` free function needs `make docs-api` too**, and a row in `llms.txt` | checks 2b and 7 — the class-only pipeline used to drop functions silently | | **A new PHPStan rule needs its row on `/api/rules` in the same PR** | check 9; the analyser packages have no other public contract | | **`MIGRATION.md` is generated** from `docs/src/guide/migrating-*.md`. Edit the pages, run `make docs-migration` | check via `docs:check:migration` | +| **`docs/.api-workspace/composer.lock` is committed and moves with every satellite release.** A caret on 0.x pins a minor, so `^0.2` documented `understudy-psalm` 0.2.0 while 0.8.0 was out; bump the pin, `composer update` in the workspace, `make docs-api`, commit all three | `docs.yml` runs `composer outdated --direct --strict` there and goes red otherwise | | **`make perf` means re-reading three files**: `perf/README.md`, `README.md`'s Performance table and `README.ru.md`'s. Keep the `` markers and the `Taken YYYY-MM-DD` line | checks 10 and 11 | | **An `@include` that cannot resolve fails silently in VitePress** — the page renders as its heading and nothing else | check 12 | | **`{{` in prose needs ``** | Vue interpolates it otherwise | diff --git a/CHANGELOG.md b/CHANGELOG.md index b2080f6..85ebb2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Changelog +## Unreleased + +- **The API reference documents the satellites at their current versions.** + `docs/.api-workspace/composer.json` pinned `understudy-psalm ^0.2`, + `understudy-phpstan ^0.2`, `understudy-phpunit ^0.1` and `understudy-testo + ^0.1` — a caret on 0.x pins a minor — so the site reflected the plugins at + 0.2.0 and the adapters at 0.1.x while 0.8.0, 0.5.0, 0.2.0 and 0.3.0 were out, + and the weekly rebuild rebuilt the same thing. The pins move to the current + lines, the workspace lock is committed so the pages in the repository and on + the site come from the same install, and `docs.yml` runs `composer outdated + --direct --strict` in the workspace: a satellite release the pins do not + reach is a red build now, not a stale page. +- `static-analysis.yml` runs `composer rector` in the Psalm job. It is part of + `composer release-check` and was run by nobody but a human before a tag — + this package went out four times with it red under green builds. +- Two defects of the reference generator that the refresh exposed: + `docs/scripts/reflect-rules.php` took every string literal starting with + `understudy.` for a rule identifier, so `ClosureShape`'s php-parser attribute + `understudy.receiverOfCall` sat on the rules page as a sixth identifier nobody + could write into `ignoreErrors` (only constants named `*IDENTIFIER` count + now); and `generate-api.mjs` had no label for a trait, so the PHPUnit + adapter's page was headed «undefined». + ## 0.9.0 — 2026-09-05 The 1.0 candidate. A minor rather than a patch, and the last one before the diff --git a/docs/.api-workspace/composer.json b/docs/.api-workspace/composer.json index a6f4f18..9be9730 100644 --- a/docs/.api-workspace/composer.json +++ b/docs/.api-workspace/composer.json @@ -5,10 +5,10 @@ "require": { "php": "8.3 - 8.5", "phpdocumentor/reflection-docblock": "^5.6", - "rasuvaeff/understudy-phpstan": "^0.2", - "rasuvaeff/understudy-phpunit": "^0.1", - "rasuvaeff/understudy-psalm": "^0.2", - "rasuvaeff/understudy-testo": "^0.1" + "rasuvaeff/understudy-phpstan": "^0.5", + "rasuvaeff/understudy-phpunit": "^0.3", + "rasuvaeff/understudy-psalm": "^0.8", + "rasuvaeff/understudy-testo": "^0.3" }, "repositories": [ { @@ -16,7 +16,7 @@ "url": "../..", "options": { "versions": { - "rasuvaeff/understudy": "0.4.0" + "rasuvaeff/understudy": "0.9.0" } } } diff --git a/docs/.api-workspace/composer.lock b/docs/.api-workspace/composer.lock new file mode 100644 index 0000000..0bb03d7 --- /dev/null +++ b/docs/.api-workspace/composer.lock @@ -0,0 +1,6825 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "dd7957d4e46599d66ae2175c4c47f3e1", + "packages": [ + { + "name": "amphp/amp", + "version": "v3.1.3", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "73c38b323ff8d790abf0f76c56fcc892bda4111a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/73c38b323ff8d790abf0f76c56fcc892bda4111a", + "reference": "73c38b323ff8d790abf0f76c56fcc892bda4111a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php", + "src/Future/functions.php", + "src/Internal/functions.php" + ], + "psr-4": { + "Amp\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + } + ], + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", + "keywords": [ + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" + ], + "support": { + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v3.1.3" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2026-07-19T17:59:20+00:00" + }, + { + "name": "amphp/byte-stream", + "version": "v2.1.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/byte-stream.git", + "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/55a6bd071aec26fa2a3e002618c20c35e3df1b46", + "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/parser": "^1.1", + "amphp/pipeline": "^1", + "amphp/serialization": "^1", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2.3" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.22.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php", + "src/Internal/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "https://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], + "support": { + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v2.1.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2025-03-16T17:10:27+00:00" + }, + { + "name": "amphp/cache", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/cache.git", + "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/cache/zipball/46912e387e6aa94933b61ea1ead9cf7540b7797c", + "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/serialization": "^1", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\Cache\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + } + ], + "description": "A fiber-aware cache API based on Amp and Revolt.", + "homepage": "https://amphp.org/cache", + "support": { + "issues": "https://github.com/amphp/cache/issues", + "source": "https://github.com/amphp/cache/tree/v2.0.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-04-19T03:38:06+00:00" + }, + { + "name": "amphp/dns", + "version": "v2.4.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/dns.git", + "reference": "ec5948bfafac808f410406e18bc7b52a2d4629b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/dns/zipball/ec5948bfafac808f410406e18bc7b52a2d4629b7", + "reference": "ec5948bfafac808f410406e18bc7b52a2d4629b7", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/cache": "^2", + "amphp/parser": "^1", + "amphp/process": "^2", + "daverandom/libdns": "^2.0.2", + "ext-filter": "*", + "ext-json": "*", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Dns\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Wright", + "email": "addr@daverandom.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + } + ], + "description": "Async DNS resolution for Amp.", + "homepage": "https://github.com/amphp/dns", + "keywords": [ + "amp", + "amphp", + "async", + "client", + "dns", + "resolve" + ], + "support": { + "issues": "https://github.com/amphp/dns/issues", + "source": "https://github.com/amphp/dns/tree/v2.4.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2026-07-26T17:53:54+00:00" + }, + { + "name": "amphp/parallel", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/amphp/parallel.git", + "reference": "37f5b2754fadc229c00f9416bd68fb8d04529a81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/parallel/zipball/37f5b2754fadc229c00f9416bd68fb8d04529a81", + "reference": "37f5b2754fadc229c00f9416bd68fb8d04529a81", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/cache": "^2", + "amphp/parser": "^1", + "amphp/pipeline": "^1", + "amphp/process": "^2", + "amphp/serialization": "^1", + "amphp/socket": "^2", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/Context/functions.php", + "src/Context/Internal/functions.php", + "src/Ipc/functions.php", + "src/Worker/functions.php" + ], + "psr-4": { + "Amp\\Parallel\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Stephen Coakley", + "email": "me@stephencoakley.com" + } + ], + "description": "Parallel processing component for Amp.", + "homepage": "https://github.com/amphp/parallel", + "keywords": [ + "async", + "asynchronous", + "concurrent", + "multi-processing", + "multi-threading" + ], + "support": { + "issues": "https://github.com/amphp/parallel/issues", + "source": "https://github.com/amphp/parallel/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2026-05-16T16:54:01+00:00" + }, + { + "name": "amphp/parser", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/parser.git", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\Parser\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A generator parser to make streaming parsers simple.", + "homepage": "https://github.com/amphp/parser", + "keywords": [ + "async", + "non-blocking", + "parser", + "stream" + ], + "support": { + "issues": "https://github.com/amphp/parser/issues", + "source": "https://github.com/amphp/parser/tree/v1.1.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-21T19:16:53+00:00" + }, + { + "name": "amphp/pipeline", + "version": "v1.2.7", + "source": { + "type": "git", + "url": "https://github.com/amphp/pipeline.git", + "reference": "cf2d67696c2015ea7c7fd8f6ec5f8ed7c2d17c17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/pipeline/zipball/cf2d67696c2015ea7c7fd8f6ec5f8ed7c2d17c17", + "reference": "cf2d67696c2015ea7c7fd8f6ec5f8ed7c2d17c17", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "php": ">=8.1", + "revolt/event-loop": "^1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\Pipeline\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Asynchronous iterators and operators.", + "homepage": "https://amphp.org/pipeline", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "iterator", + "non-blocking" + ], + "support": { + "issues": "https://github.com/amphp/pipeline/issues", + "source": "https://github.com/amphp/pipeline/tree/v1.2.7" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2026-07-26T14:50:43+00:00" + }, + { + "name": "amphp/process", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/amphp/process.git", + "reference": "583959df17d00304ad7b0b32285373f985935643" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/process/zipball/583959df17d00304ad7b0b32285373f985935643", + "reference": "583959df17d00304ad7b0b32285373f985935643", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Process\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A fiber-aware process manager based on Amp and Revolt.", + "homepage": "https://amphp.org/process", + "support": { + "issues": "https://github.com/amphp/process/issues", + "source": "https://github.com/amphp/process/tree/v2.1.0" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2026-05-31T15:11:55+00:00" + }, + { + "name": "amphp/serialization", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/amphp/serialization.git", + "reference": "fdf2834d78cebb0205fb2672676c1b1eb84371f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/serialization/zipball/fdf2834d78cebb0205fb2672676c1b1eb84371f0", + "reference": "fdf2834d78cebb0205fb2672676c1b1eb84371f0", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "ext-json": "*", + "ext-zlib": "*", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Serialization\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Serialization tools for IPC and data storage in PHP.", + "homepage": "https://github.com/amphp/serialization", + "keywords": [ + "async", + "asynchronous", + "serialization", + "serialize" + ], + "support": { + "issues": "https://github.com/amphp/serialization/issues", + "source": "https://github.com/amphp/serialization/tree/v1.1.0" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2026-04-05T15:59:53+00:00" + }, + { + "name": "amphp/socket", + "version": "v2.4.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/socket.git", + "reference": "b347be5aff6b2cc025208bb4d896607eb470c018" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/socket/zipball/b347be5aff6b2cc025208bb4d896607eb470c018", + "reference": "b347be5aff6b2cc025208bb4d896607eb470c018", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/dns": "^2", + "ext-openssl": "*", + "kelunik/certificate": "^1.1", + "league/uri": "^7", + "league/uri-interfaces": "^7", + "php": ">=8.1", + "revolt/event-loop": "^1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "amphp/process": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php", + "src/Internal/functions.php", + "src/SocketAddress/functions.php" + ], + "psr-4": { + "Amp\\Socket\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@gmail.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Non-blocking socket connection / server implementations based on Amp and Revolt.", + "homepage": "https://github.com/amphp/socket", + "keywords": [ + "amp", + "async", + "encryption", + "non-blocking", + "sockets", + "tcp", + "tls" + ], + "support": { + "issues": "https://github.com/amphp/socket/issues", + "source": "https://github.com/amphp/socket/tree/v2.4.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2026-08-22T18:13:20+00:00" + }, + { + "name": "amphp/sync", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/amphp/sync.git", + "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/sync/zipball/217097b785130d77cfcc58ff583cf26cd1770bf1", + "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/pipeline": "^1", + "amphp/serialization": "^1", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.23" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Sync\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Stephen Coakley", + "email": "me@stephencoakley.com" + } + ], + "description": "Non-blocking synchronization primitives for PHP based on Amp and Revolt.", + "homepage": "https://github.com/amphp/sync", + "keywords": [ + "async", + "asynchronous", + "mutex", + "semaphore", + "synchronization" + ], + "support": { + "issues": "https://github.com/amphp/sync/issues", + "source": "https://github.com/amphp/sync/tree/v2.3.0" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-08-03T19:31:26+00:00" + }, + { + "name": "composer/pcre", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "d5a341b3fb61f3001970940afb1d332968a183ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/d5a341b3fb61f3001970940afb1d332968a183ed", + "reference": "d5a341b3fb61f3001970940afb1d332968a183ed", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<2.2.2" + }, + "require-dev": { + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.4.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2026-06-07T11:47:49+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-08-20T19:15:30+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" + }, + { + "name": "danog/advanced-json-rpc", + "version": "v3.2.3", + "source": { + "type": "git", + "url": "https://github.com/danog/php-advanced-json-rpc.git", + "reference": "ae703ea7b4811797a10590b6078de05b3b33dd91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danog/php-advanced-json-rpc/zipball/ae703ea7b4811797a10590b6078de05b3b33dd91", + "reference": "ae703ea7b4811797a10590b6078de05b3b33dd91", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^5", + "php": ">=8.1", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0 || ^6" + }, + "replace": { + "felixfbecker/php-advanced-json-rpc": "^3" + }, + "require-dev": { + "phpunit/phpunit": "^9" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + }, + { + "name": "Daniil Gentili", + "email": "daniil@daniil.it" + } + ], + "description": "A more advanced JSONRPC implementation", + "support": { + "issues": "https://github.com/danog/php-advanced-json-rpc/issues", + "source": "https://github.com/danog/php-advanced-json-rpc/tree/v3.2.3" + }, + "time": "2026-01-12T21:07:10+00:00" + }, + { + "name": "daverandom/libdns", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/DaveRandom/LibDNS.git", + "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DaveRandom/LibDNS/zipball/b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", + "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "Required for IDN support" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "LibDNS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "DNS protocol implementation written in pure PHP", + "keywords": [ + "dns" + ], + "support": { + "issues": "https://github.com/DaveRandom/LibDNS/issues", + "source": "https://github.com/DaveRandom/LibDNS/tree/v2.1.0" + }, + "time": "2024-04-12T12:12:48+00:00" + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "support": { + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + }, + "time": "2019-12-04T15:06:13+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.6", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=14" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" + }, + "time": "2026-02-07T07:09:04+00:00" + }, + { + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.3", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "LanguageServerProtocol\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "PHP classes for the Language Server Protocol", + "keywords": [ + "language", + "microsoft", + "php", + "server" + ], + "support": { + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" + }, + "time": "2024-04-30T00:40:11+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2025-08-14T07:29:31+00:00" + }, + { + "name": "internal/destroy", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-internal/destroy.git", + "reference": "93068c4f7da218034f5373e31407f564b74b4a06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-internal/destroy/zipball/93068c4f7da218034f5373e31407f564b74b4a06", + "reference": "93068c4f7da218034f5373e31407f564b74b4a06", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "buggregator/trap": "^1.10", + "phpunit/phpunit": "^10.5", + "spiral/code-style": "^2.2.2", + "ta-tikoma/phpunit-architecture-test": "^0.8.4", + "vimeo/psalm": "^6.10" + }, + "suggest": { + "ext-simplexml": "to support XML configs parsing" + }, + "type": "library", + "autoload": { + "psr-4": { + "Internal\\Destroy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "keywords": [ + "download binaries", + "memory" + ], + "support": { + "issues": "https://github.com/php-internal/destroy/issues", + "source": "https://github.com/php-internal/destroy/tree/1.0.0" + }, + "funding": [ + { + "url": "https://patreon.com/roxblnfk", + "type": "patreon" + } + ], + "time": "2025-09-08T14:29:16+00:00" + }, + { + "name": "internal/path", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/php-internal/path.git", + "reference": "3eca0088117a4b2a1523a320d6ebe093e206cbaa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-internal/path/zipball/3eca0088117a4b2a1523a320d6ebe093e206cbaa", + "reference": "3eca0088117a4b2a1523a320d6ebe093e206cbaa", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "buggregator/trap": "^1.15", + "infection/infection": "^0.33.2", + "llm/skills": "^1.7", + "roxblnfk/unpoly": "^1.8.1", + "spiral/code-style": "^2.3.1", + "testo/bridge-infection": "^0.1.6", + "testo/testo": "^0.10.21", + "vimeo/psalm": "^7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Internal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Type-safe, immutable file path library with cross-platform support and automatic normalization.", + "keywords": [ + "cross-platform", + "file", + "filepath", + "filesystem", + "helper", + "path", + "unix", + "windows" + ], + "support": { + "issues": "https://github.com/php-internal/path/issues", + "source": "https://github.com/php-internal/path/tree/1.3.0" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-08-12T21:55:41+00:00" + }, + { + "name": "kelunik/certificate", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/kelunik/certificate.git", + "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kelunik/certificate/zipball/7e00d498c264d5eb4f78c69f41c8bd6719c0199e", + "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "php": ">=7.0" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^6 | 7 | ^8 | ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Kelunik\\Certificate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Access certificate details and transform between different formats.", + "keywords": [ + "DER", + "certificate", + "certificates", + "openssl", + "pem", + "x509" + ], + "support": { + "issues": "https://github.com/kelunik/certificate/issues", + "source": "https://github.com/kelunik/certificate/tree/v1.1.3" + }, + "time": "2023-02-03T21:26:53+00:00" + }, + { + "name": "league/uri", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.8.1", + "php": "^8.1", + "psr/http-factory": "^1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "URN", + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc2141", + "rfc3986", + "rfc3987", + "rfc6570", + "rfc8141", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-15T20:22:25+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-08T20:05:35+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.14.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.14.0" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + } + ], + "time": "2026-08-11T10:17:44+00:00" + }, + { + "name": "netresearch/jsonmapper", + "version": "v5.0.1", + "source": { + "type": "git", + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "980674efdda65913492d29a8fd51c82270dd37bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/980674efdda65913492d29a8fd51c82270dd37bb", + "reference": "980674efdda65913492d29a8fd51c82270dd37bb", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v5.0.1" + }, + "time": "2026-02-22T16:28:03+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.8.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.8.0" + }, + "time": "2026-07-04T14:30:18+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.6.7", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "31a105931bc8ffa3a123383829772e832fd8d903" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/31a105931bc8ffa3a123383829772e832fd8d903", + "reference": "31a105931bc8ffa3a123383829772e832fd8d903", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7|^2.0", + "webmozart/assert": "^1.9.1 || ^2" + }, + "require-dev": { + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.7" + }, + "time": "2026-03-18T20:47:46+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195", + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0" + }, + "time": "2025-11-21T15:09:14+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.3.5", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "148cefffaf0233e4c08cc13db8a195a56dd6dfe9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/148cefffaf0233e4c08cc13db8a195a56dd6dfe9", + "reference": "148cefffaf0233e4c08cc13db8a195a56dd6dfe9", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.5" + }, + "time": "2026-08-31T16:05:28+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "2.2.13", + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260", + "reference": "9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ondřej Mirtes" + }, + { + "name": "Markus Staab" + }, + { + "name": "Vincent Langlet" + } + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2026-09-03T20:38:19+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "14.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "93d62632fb675b76c9b941fdcfcfa10ffb9dea75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/93d62632fb675b76c9b941fdcfcfa10ffb9dea75", + "reference": "93d62632fb675b76c9b941fdcfcfa10ffb9dea75", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.8.0", + "php": ">=8.4", + "phpunit/php-text-template": "^6.0", + "sebastian/complexity": "^6.0", + "sebastian/environment": "^9.3.2", + "sebastian/git-state": "^1.0", + "sebastian/lines-of-code": "^5.0.2", + "sebastian/version": "^7.0", + "theseer/tokenizer": "^2.0.1" + }, + "require-dev": { + "phpunit/phpunit": "^13.3.2" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "14.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.3.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2026-09-04T03:46:43+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "9bb4e6c58b62c1e043be995c66abec7c97307aae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/9bb4e6c58b62c1e043be995c66abec7c97307aae", + "reference": "9bb4e6c58b62c1e043be995c66abec7c97307aae", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.3.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" + } + ], + "time": "2026-08-25T14:47:43+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88", + "reference": "42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^13.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-invoker", + "type": "tidelift" + } + ], + "time": "2026-02-06T04:34:47+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/a47af19f93f76aa3368303d752aa5272ca3299f4", + "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-text-template", + "type": "tidelift" + } + ], + "time": "2026-02-06T04:36:37+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "9.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "a0e12065831f6ab0d83120dc61513eb8d9a966f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a0e12065831f6ab0d83120dc61513eb8d9a966f6", + "reference": "a0e12065831f6ab0d83120dc61513eb8d9a966f6", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/9.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-timer", + "type": "tidelift" + } + ], + "time": "2026-02-06T04:37:53+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "13.1.14", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "cdd419c33c040c6b570e51dba8ecbe81d399da53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/cdd419c33c040c6b570e51dba8ecbe81d399da53", + "reference": "cdd419c33c040c6b570e51dba8ecbe81d399da53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.4.1", + "phpunit/php-code-coverage": "^14.1.10", + "phpunit/php-file-iterator": "^7.0.0", + "phpunit/php-invoker": "^7.0.0", + "phpunit/php-text-template": "^6.0.0", + "phpunit/php-timer": "^9.0.0", + "sebastian/cli-parser": "^5.0.0", + "sebastian/comparator": "^8.2.1", + "sebastian/diff": "^8.3.0", + "sebastian/environment": "^9.3.2", + "sebastian/exporter": "^8.1.0", + "sebastian/git-state": "^1.0", + "sebastian/global-state": "^9.0.1", + "sebastian/object-enumerator": "^8.0.0", + "sebastian/recursion-context": "^8.0.0", + "sebastian/type": "^7.0.1", + "sebastian/version": "^7.0.0", + "staabm/side-effects-detector": "^1.0.5" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "13.1-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/13.1.14" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsoring.html", + "type": "other" + } + ], + "time": "2026-06-04T06:16:42+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "rasuvaeff/understudy", + "version": "0.9.0", + "dist": { + "type": "path", + "url": "../..", + "reference": "9ac32c63fb78082a2abc8a1483f66b2d745655ec" + }, + "require": { + "ext-tokenizer": "*", + "php": "8.3 - 8.5" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.51", + "friendsofphp/php-cs-fixer": "^3.95", + "infection/infection": "^0.35", + "maglnet/composer-require-checker": "^4.17", + "rasuvaeff/property-testing-testo": "^0.9", + "rasuvaeff/rector-named-literals": "^1.0", + "rector/rector": "^2.4", + "roave/backward-compatibility-check": "^8.0", + "testo/bridge-infection": "^0.1.6", + "testo/testo": "^0.10.25", + "vimeo/psalm": "^6.16" + }, + "type": "library", + "extra": { + "skills": { + "source": "resources/skills" + } + }, + "autoload": { + "psr-4": { + "Rasuvaeff\\Understudy\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "autoload-dev": { + "psr-4": { + "Rasuvaeff\\Understudy\\Benchmarks\\": "benchmarks/", + "Rasuvaeff\\Understudy\\Tests\\": "tests/" + } + }, + "scripts": { + "bc-check": [ + "roave-backward-compatibility-check" + ], + "bench": [ + "testo --suite=Benchmarks -vv" + ], + "build": [ + "@composer validate --strict", + "@composer normalize --dry-run", + "@require-checker", + "@cs", + "@psalm", + "@test", + "@test:integration", + "@examples" + ], + "cs": [ + "php-cs-fixer fix --dry-run --diff --config=.php-cs-fixer.php" + ], + "cs:fix": [ + "php-cs-fixer fix --diff --config=.php-cs-fixer.php" + ], + "examples": [ + "@php examples/basic-usage.php", + "@php examples/modes.php", + "@php examples/property-hooks.php", + "@php examples/wiring.php", + "@php examples/protocol.php", + "@php examples/defaults-registry.php", + "@php examples/structured-failures.php" + ], + "mutation": [ + "infection --threads=max" + ], + "psalm": [ + "psalm --no-cache" + ], + "rector": [ + "rector process --dry-run" + ], + "rector:fix": [ + "rector process" + ], + "release-check": [ + "@build", + "@rector", + "@bc-check" + ], + "require-checker": [ + "composer-require-checker check composer.json" + ], + "test": [ + "testo --suite=Unit" + ], + "test:coverage": [ + "testo --suite=Unit --coverage --coverage-clover=build/coverage.xml" + ], + "test:coverage:ci": [ + "testo --suite=Unit --coverage-clover=build/coverage.xml" + ], + "test:integration": [ + "testo --suite=Integration" + ] + }, + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Victor Razuvaev", + "email": "rasuvaeff@gmail.com" + } + ], + "description": "Test double library for PHP with a call-closure API", + "homepage": "https://github.com/rasuvaeff/understudy", + "keywords": [ + "double", + "fake", + "mock", + "spy", + "stub", + "test-double", + "testing" + ], + "support": { + "issues": "https://github.com/rasuvaeff/understudy/issues", + "source": "https://github.com/rasuvaeff/understudy" + }, + "transport-options": { + "relative": true + } + }, + { + "name": "rasuvaeff/understudy-phpstan", + "version": "v0.5.1", + "source": { + "type": "git", + "url": "https://github.com/rasuvaeff/understudy-phpstan.git", + "reference": "4346ebd4669322dfc8fd6a804e464357e0e7c391" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rasuvaeff/understudy-phpstan/zipball/4346ebd4669322dfc8fd6a804e464357e0e7c391", + "reference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": "8.3 - 8.5", + "phpstan/phpstan": "^2.2.2", + "rasuvaeff/understudy": "^0.8 || ^0.9" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.51", + "friendsofphp/php-cs-fixer": "^3.95", + "infection/infection": "^0.35", + "maglnet/composer-require-checker": "^4.17", + "rasuvaeff/rector-named-literals": "^1.0", + "rector/rector": "^2.4", + "roave/backward-compatibility-check": "^8.0", + "testo/bridge-infection": "^0.1.6", + "testo/testo": "^0.10.39", + "vimeo/psalm": "^6.16" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Rasuvaeff\\Understudy\\PhpStan\\": "src/PhpStan/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Victor Razuvaev", + "email": "rasuvaeff@gmail.com" + } + ], + "description": "PHPStan extension for the understudy test double library: matcher-aware specification closures and misuse rules", + "homepage": "https://github.com/rasuvaeff/understudy-phpstan", + "keywords": [ + "PHPStan", + "mock", + "phpstan-extension", + "static-analysis", + "stub", + "test-double", + "testing" + ], + "support": { + "issues": "https://github.com/rasuvaeff/understudy-phpstan/issues", + "source": "https://github.com/rasuvaeff/understudy-phpstan" + }, + "time": "2026-09-05T13:16:45+00:00" + }, + { + "name": "rasuvaeff/understudy-phpunit", + "version": "v0.3.0", + "source": { + "type": "git", + "url": "https://github.com/rasuvaeff/understudy-phpunit.git", + "reference": "1c5d658896cd8086b4f80087782f3c0a80e31501" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rasuvaeff/understudy-phpunit/zipball/1c5d658896cd8086b4f80087782f3c0a80e31501", + "reference": "1c5d658896cd8086b4f80087782f3c0a80e31501", + "shasum": "" + }, + "require": { + "php": "8.3 - 8.5", + "phpunit/phpunit": "^11.5 || ^12.0 || ^13.0", + "rasuvaeff/understudy": "^0.8 || ^0.9" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.51", + "friendsofphp/php-cs-fixer": "^3.95", + "infection/infection": "^0.35", + "maglnet/composer-require-checker": "^4.17", + "rasuvaeff/rector-named-literals": "^1.0", + "rector/rector": "^2.4", + "roave/backward-compatibility-check": "^8.0", + "testo/bridge-infection": "^0.1.6", + "testo/testo": "^0.10.39", + "vimeo/psalm": "^6.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Rasuvaeff\\Understudy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Victor Razuvaev", + "email": "rasuvaeff@gmail.com" + } + ], + "description": "PHPUnit adapter for the understudy test double library: automatic verification and cleanup after every test", + "homepage": "https://github.com/rasuvaeff/understudy-phpunit", + "keywords": [ + "mock", + "pest", + "phpunit", + "spy", + "stub", + "test-double", + "testing" + ], + "support": { + "issues": "https://github.com/rasuvaeff/understudy-phpunit/issues", + "source": "https://github.com/rasuvaeff/understudy-phpunit" + }, + "time": "2026-09-05T13:16:32+00:00" + }, + { + "name": "rasuvaeff/understudy-psalm", + "version": "v0.8.1", + "source": { + "type": "git", + "url": "https://github.com/rasuvaeff/understudy-psalm.git", + "reference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rasuvaeff/understudy-psalm/zipball/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", + "reference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": "8.3 - 8.5", + "rasuvaeff/understudy": "^0.8 || ^0.9", + "vimeo/psalm": "^6.16" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.51", + "friendsofphp/php-cs-fixer": "^3.95", + "infection/infection": "^0.35", + "maglnet/composer-require-checker": "^4.17", + "rasuvaeff/rector-named-literals": "^1.0", + "rector/rector": "^2.4", + "roave/backward-compatibility-check": "^8.0", + "testo/bridge-infection": "^0.1.6", + "testo/testo": "^0.10.39" + }, + "type": "psalm-plugin", + "extra": { + "psalm": { + "pluginClass": "Rasuvaeff\\Understudy\\Psalm\\Plugin" + } + }, + "autoload": { + "psr-4": { + "Rasuvaeff\\Understudy\\Psalm\\": "src/Psalm/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Victor Razuvaev", + "email": "rasuvaeff@gmail.com" + } + ], + "description": "Psalm plugin for the understudy test double library: matcher-aware setup closures and misuse diagnostics", + "homepage": "https://github.com/rasuvaeff/understudy-psalm", + "keywords": [ + "mock", + "psalm", + "static-analysis", + "stub", + "test-double", + "testing" + ], + "support": { + "issues": "https://github.com/rasuvaeff/understudy-psalm/issues", + "source": "https://github.com/rasuvaeff/understudy-psalm" + }, + "time": "2026-09-05T13:16:38+00:00" + }, + { + "name": "rasuvaeff/understudy-testo", + "version": "v0.3.1", + "source": { + "type": "git", + "url": "https://github.com/rasuvaeff/understudy-testo.git", + "reference": "cb5eae3591ccf730503566f237679fb63a07a677" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rasuvaeff/understudy-testo/zipball/cb5eae3591ccf730503566f237679fb63a07a677", + "reference": "cb5eae3591ccf730503566f237679fb63a07a677", + "shasum": "" + }, + "require": { + "php": "8.3 - 8.5", + "rasuvaeff/understudy": "^0.8 || ^0.9", + "testo/assert": "^0.1.13", + "testo/testo": "^0.10.42" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.51", + "friendsofphp/php-cs-fixer": "^3.95", + "infection/infection": "^0.35", + "internal/path": "^1.2", + "maglnet/composer-require-checker": "^4.17", + "rasuvaeff/rector-named-literals": "^1.0", + "rector/rector": "^2.4", + "roave/backward-compatibility-check": "^8.0", + "testo/bridge-infection": "^0.1.6", + "vimeo/psalm": "^6.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Rasuvaeff\\Understudy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Victor Razuvaev", + "email": "rasuvaeff@gmail.com" + } + ], + "description": "Testo adapter for the understudy test double library: automatic verification and cleanup after every test", + "homepage": "https://github.com/rasuvaeff/understudy-testo", + "keywords": [ + "mock", + "spy", + "stub", + "test-double", + "testing", + "testo" + ], + "support": { + "issues": "https://github.com/rasuvaeff/understudy-testo/issues", + "source": "https://github.com/rasuvaeff/understudy-testo" + }, + "time": "2026-09-05T13:16:25+00:00" + }, + { + "name": "revolt/event-loop", + "version": "v1.0.9", + "source": { + "type": "git", + "url": "https://github.com/revoltphp/event-loop.git", + "reference": "44061cf513e53c6200372fc935ac42271566295d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/44061cf513e53c6200372fc935ac42271566295d", + "reference": "44061cf513e53c6200372fc935ac42271566295d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Revolt\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "ceesjank@gmail.com" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Rock-solid event loop for concurrent PHP applications.", + "keywords": [ + "async", + "asynchronous", + "concurrency", + "event", + "event-loop", + "non-blocking", + "scheduler" + ], + "support": { + "issues": "https://github.com/revoltphp/event-loop/issues", + "source": "https://github.com/revoltphp/event-loop/tree/v1.0.9" + }, + "time": "2026-05-16T17:55:38+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "eeb759ad3146b7096fb59c3195d39e071cd409e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/eeb759ad3146b7096fb59c3195d39e071cd409e3", + "reference": "eeb759ad3146b7096fb59c3195d39e071cd409e3", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.2.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" + } + ], + "time": "2026-08-01T04:27:14+00:00" + }, + { + "name": "sebastian/comparator", + "version": "8.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "ce999bf08b2c387a5423fe56961c32eed3f88089" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/ce999bf08b2c387a5423fe56961c32eed3f88089", + "reference": "ce999bf08b2c387a5423fe56961c32eed3f88089", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.4", + "sebastian/diff": "^8.3", + "sebastian/exporter": "^8.0.3" + }, + "require-dev": { + "phpunit/phpunit": "^13.1.10" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/8.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2026-05-21T04:46:40+00:00" + }, + { + "name": "sebastian/complexity", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "c5651c795c98093480df79350cb050813fc7a2f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c5651c795c98093480df79350cb050813fc7a2f3", + "reference": "c5651c795c98093480df79350cb050813fc7a2f3", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/6.0.0" + }, + "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/complexity", + "type": "tidelift" + } + ], + "time": "2026-02-06T04:41:32+00:00" + }, + { + "name": "sebastian/diff", + "version": "8.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b36d33b6e796513de7cb7df053afb3f55eefcd47" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b36d33b6e796513de7cb7df053afb3f55eefcd47", + "reference": "b36d33b6e796513de7cb7df053afb3f55eefcd47", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0", + "symfony/process": "^7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/8.3.0" + }, + "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/diff", + "type": "tidelift" + } + ], + "time": "2026-05-15T04:58:09+00:00" + }, + { + "name": "sebastian/environment", + "version": "9.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e", + "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.1.11" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/9.3.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2026-05-25T13:41:38+00:00" + }, + { + "name": "sebastian/exporter", + "version": "8.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "24a3b69bba4a12ab615fca9d34680c5598d9ab7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/24a3b69bba4a12ab615fca9d34680c5598d9ab7a", + "reference": "24a3b69bba4a12ab615fca9d34680c5598d9ab7a", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.4", + "sebastian/recursion-context": "^8.0.1" + }, + "require-dev": { + "phpunit/phpunit": "^13.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/8.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" + } + ], + "time": "2026-08-07T07:22:06+00:00" + }, + { + "name": "sebastian/git-state", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/git-state.git", + "reference": "792a952e0eba55b6960a48aeceb9f371aad1f76b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/git-state/zipball/792a952e0eba55b6960a48aeceb9f371aad1f76b", + "reference": "792a952e0eba55b6960a48aeceb9f371aad1f76b", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for describing the state of a Git checkout", + "homepage": "https://github.com/sebastianbergmann/git-state", + "support": { + "issues": "https://github.com/sebastianbergmann/git-state/issues", + "security": "https://github.com/sebastianbergmann/git-state/security/policy", + "source": "https://github.com/sebastianbergmann/git-state/tree/1.0.0" + }, + "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/git-state", + "type": "tidelift" + } + ], + "time": "2026-03-21T12:54:28+00:00" + }, + { + "name": "sebastian/global-state", + "version": "9.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "ba68ba79da690cf7eddefd3ce5b78b20b9ba9945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ba68ba79da690cf7eddefd3ce5b78b20b9ba9945", + "reference": "ba68ba79da690cf7eddefd3ce5b78b20b9ba9945", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "sebastian/object-reflector": "^6.0", + "sebastian/recursion-context": "^8.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^13.1.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/9.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" + } + ], + "time": "2026-06-01T15:11:33+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d1b6f8fce682505dbd048977f1abedf1b8ad3ff8", + "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.8.0", + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/lines-of-code", + "type": "tidelift" + } + ], + "time": "2026-07-09T08:42:34+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "8.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "511064ecde82bd747e2ba2fab3dda8d977b59576" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/511064ecde82bd747e2ba2fab3dda8d977b59576", + "reference": "511064ecde82bd747e2ba2fab3dda8d977b59576", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "sebastian/recursion-context": "^8.0.1" + }, + "require-dev": { + "phpunit/phpunit": "^13.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/8.1.0" + }, + "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/object-enumerator", + "type": "tidelift" + } + ], + "time": "2026-08-13T07:05:05+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "6.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "f71bbcdc4f95456b4622810bec64eb06372e25b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/f71bbcdc4f95456b4622810bec64eb06372e25b2", + "reference": "f71bbcdc4f95456b4622810bec64eb06372e25b2", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/6.1.0" + }, + "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/object-reflector", + "type": "tidelift" + } + ], + "time": "2026-08-13T06:34:36+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "8.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0", + "reference": "32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.2.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/8.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2026-08-03T05:58:12+00:00" + }, + { + "name": "sebastian/type", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "bd1df467864cb95140414059a535b2d906173fcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/bd1df467864cb95140414059a535b2d906173fcf", + "reference": "bd1df467864cb95140414059a535b2d906173fcf", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" + } + ], + "time": "2026-08-10T08:00:57+00:00" + }, + { + "name": "sebastian/version", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "ad37a5552c8e2b88572249fdc19b6da7792e021b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ad37a5552c8e2b88572249fdc19b6da7792e021b", + "reference": "ad37a5552c8e2b88572249fdc19b6da7792e021b", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/7.0.0" + }, + "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/version", + "type": "tidelift" + } + ], + "time": "2026-02-06T04:52:52+00:00" + }, + { + "name": "spatie/array-to-xml", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/spatie/array-to-xml.git", + "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/88b2f3852a922dd73177a68938f8eb2ec70c7224", + "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": "^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.2", + "pestphp/pest": "^1.21", + "spatie/pest-plugin-snapshots": "^1.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\ArrayToXml\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://freek.dev", + "role": "Developer" + } + ], + "description": "Convert an array to xml", + "homepage": "https://github.com/spatie/array-to-xml", + "keywords": [ + "array", + "convert", + "xml" + ], + "support": { + "source": "https://github.com/spatie/array-to-xml/tree/3.4.4" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2025-12-15T09:00:41+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "symfony/console", + "version": "v8.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "eb7d9957d66739649e931ce7a9d05dab69f8abac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/eb7d9957d66739649e931ce7a9d05dab69f8abac", + "reference": "eb7d9957d66739649e931ce7a9d05dab69f8abac", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php85": "^1.32", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.4.6|^8.0.6" + }, + "conflict": { + "symfony/dependency-injection": "<8.1", + "symfony/event-dispatcher": "<8.1" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^8.1", + "symfony/event-dispatcher": "^8.1", + "symfony/filesystem": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/lock": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v8.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-25T14:18:42+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "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": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-05T06:23:12+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v8.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "7599ebb855fede59413ddb7f15198d67bfcae7ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7599ebb855fede59413ddb7f15198d67bfcae7ba", + "reference": "7599ebb855fede59413ddb7f15198d67bfcae7ba", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v8.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-23T10:06:25+00:00" + }, + { + "name": "symfony/finder", + "version": "v8.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "8d7acede2b2ae07605783d1c43e49b5767036474" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/8d7acede2b2ae07605783d1c43e49b5767036474", + "reference": "8d7acede2b2ae07605783d1c43e49b5767036474", + "shasum": "" + }, + "require": { + "php": ">=8.4.1" + }, + "require-dev": { + "symfony/filesystem": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v8.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-21T12:16:08+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.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": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.41.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "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 for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.41.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": "2026-07-28T08:25:59+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.42.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/aa20edea75bd9c48cfecc8360922e5a6e5c44502", + "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "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 for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.42.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": "2026-08-07T06:33:24+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.38.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "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 for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-27T06:59:30+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.38.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-26T12:51:13+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.41.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/255fab485aaa1006ed411040c42aecd7b5302d7a", + "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a", + "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.41.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": "2026-07-01T12:47:55+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.7.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "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": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.7.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-07-27T15:39:01+00:00" + }, + { + "name": "symfony/string", + "version": "v8.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc", + "reference": "286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v8.1.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-07-28T07:35:25+00:00" + }, + { + "name": "testo/assert", + "version": "0.1.14", + "source": { + "type": "git", + "url": "https://github.com/php-testo/assert.git", + "reference": "5f0ae9b80057e9c81655f3355c6f4820b5a4d830" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-testo/assert/zipball/5f0ae9b80057e9c81655f3355c6f4820b5a4d830", + "reference": "5f0ae9b80057e9c81655f3355c6f4820b5a4d830", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "testo/testo": "0.10.44 - 1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "Assert.php", + "Expect.php" + ], + "psr-4": { + "Testo\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Assert plugin for the Testo testing framework.", + "keywords": [ + "assert", + "testo" + ], + "support": { + "source": "https://github.com/php-testo/assert/tree/0.1.14" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-08-27T22:11:20+00:00" + }, + { + "name": "testo/bench", + "version": "0.1.10", + "source": { + "type": "git", + "url": "https://github.com/php-testo/bench.git", + "reference": "d5b54de9ecfeb18e2cf4dbc3a33a6f886bd26f6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-testo/bench/zipball/d5b54de9ecfeb18e2cf4dbc3a33a6f886bd26f6a", + "reference": "d5b54de9ecfeb18e2cf4dbc3a33a6f886bd26f6a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "testo/data": "^0.1.9", + "testo/filter": "^0.1.6", + "testo/inline": "^0.1.8", + "testo/testo": "0.10.44 - 1" + }, + "require-dev": { + "testo/assert": "^0.1.14" + }, + "suggest": { + "testo/assert": "Enables the benchmark verdict as an assertion: current must be the fastest within tolerance, otherwise the test fails." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "Bench.php" + ], + "psr-4": { + "Testo\\Bench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Benchmark plugin for the Testo testing framework.", + "keywords": [ + "benchmark", + "testo" + ], + "support": { + "source": "https://github.com/php-testo/bench/tree/0.1.10" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-08-27T22:11:46+00:00" + }, + { + "name": "testo/bridge-symfony-console", + "version": "0.1.11", + "source": { + "type": "git", + "url": "https://github.com/php-testo/bridge-symfony-console.git", + "reference": "f4f7911a571bc5484f0148f71edd7b29889d62a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-testo/bridge-symfony-console/zipball/f4f7911a571bc5484f0148f71edd7b29889d62a2", + "reference": "f4f7911a571bc5484f0148f71edd7b29889d62a2", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/console": "^6.4 || ^7 || ^8.0", + "testo/testo": "0.10.45 - 1" + }, + "bin": [ + "bin/testo" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Testo\\Bridge\\Symfony\\Console\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Symfony Console bridge for the Testo testing framework.", + "keywords": [ + "console", + "symfony", + "testo" + ], + "support": { + "source": "https://github.com/php-testo/bridge-symfony-console/tree/0.1.11" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-08-30T18:23:56+00:00" + }, + { + "name": "testo/codecov", + "version": "0.2.1", + "source": { + "type": "git", + "url": "https://github.com/php-testo/codecov.git", + "reference": "dbb028f5e2c65b9ef6227bb9d67460bc10be37b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-testo/codecov/zipball/dbb028f5e2c65b9ef6227bb9d67460bc10be37b8", + "reference": "dbb028f5e2c65b9ef6227bb9d67460bc10be37b8", + "shasum": "" + }, + "require": { + "ext-xmlwriter": "*", + "php": ">=8.2", + "testo/data": "^0.1.9", + "testo/inline": "^0.1.8", + "testo/testo": "0.10.44 - 1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Testo\\Codecov\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Code coverage plugin for the Testo testing framework.", + "keywords": [ + "code-coverage", + "testo" + ], + "support": { + "source": "https://github.com/php-testo/codecov/tree/0.2.1" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-08-27T22:11:28+00:00" + }, + { + "name": "testo/convention", + "version": "0.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-testo/convention.git", + "reference": "ad33205f07e29030aaf4d776fa2c068445971b46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-testo/convention/zipball/ad33205f07e29030aaf4d776fa2c068445971b46", + "reference": "ad33205f07e29030aaf4d776fa2c068445971b46", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "testo/testo": "0.10.34 - 1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Testo\\Convention\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Naming convention plugin for the Testo testing framework.", + "keywords": [ + "convention", + "testo" + ], + "support": { + "source": "https://github.com/php-testo/convention/tree/0.1.4" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-07-01T13:40:27+00:00" + }, + { + "name": "testo/data", + "version": "0.1.9", + "source": { + "type": "git", + "url": "https://github.com/php-testo/data.git", + "reference": "411748b7eb0b7a190d6744e802da6e4473223e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-testo/data/zipball/411748b7eb0b7a190d6744e802da6e4473223e5b", + "reference": "411748b7eb0b7a190d6744e802da6e4473223e5b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "testo/filter": "^0.1.6", + "testo/testo": "0.10.44 - 1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Testo\\Data\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Data provider plugin for the Testo testing framework.", + "keywords": [ + "data-provider", + "testo" + ], + "support": { + "source": "https://github.com/php-testo/data/tree/0.1.9" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-08-27T22:11:20+00:00" + }, + { + "name": "testo/fiber", + "version": "0.1.3", + "source": { + "type": "git", + "url": "https://github.com/php-testo/fiber.git", + "reference": "80806749fd830d27f8fe32febd92021b856e442d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-testo/fiber/zipball/80806749fd830d27f8fe32febd92021b856e442d", + "reference": "80806749fd830d27f8fe32febd92021b856e442d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "testo/testo": "0.10.43 - 1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Testo\\Fiber\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Fiber/coroutine execution plugin for the Testo testing framework: run tests as cooperatively-scheduled plain fibers.", + "keywords": [ + "concurrency", + "coroutine", + "fiber", + "scheduler", + "testo" + ], + "support": { + "source": "https://github.com/php-testo/fiber/tree/0.1.3" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-08-25T15:47:38+00:00" + }, + { + "name": "testo/filter", + "version": "0.1.6", + "source": { + "type": "git", + "url": "https://github.com/php-testo/filter.git", + "reference": "dd3bc254ccece5008ec22d3cdba313b43a1f786d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-testo/filter/zipball/dd3bc254ccece5008ec22d3cdba313b43a1f786d", + "reference": "dd3bc254ccece5008ec22d3cdba313b43a1f786d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "testo/testo": "0.10.39 - 1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "Filter.php" + ], + "psr-4": { + "Testo\\Filter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Test filtering plugin for the Testo testing framework.", + "keywords": [ + "filter", + "testo" + ], + "support": { + "source": "https://github.com/php-testo/filter/tree/0.1.6" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-08-06T07:42:41+00:00" + }, + { + "name": "testo/inline", + "version": "0.1.8", + "source": { + "type": "git", + "url": "https://github.com/php-testo/inline.git", + "reference": "f6a8f10c3241d05916a5bbb1412df68e3f610b10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-testo/inline/zipball/f6a8f10c3241d05916a5bbb1412df68e3f610b10", + "reference": "f6a8f10c3241d05916a5bbb1412df68e3f610b10", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "testo/assert": "^0.1.12", + "testo/data": "^0.1.7", + "testo/filter": "^0.1.6", + "testo/testo": "0.10.40 - 1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Testo\\Inline\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Inline test plugin for the Testo testing framework.", + "keywords": [ + "inline", + "testo" + ], + "support": { + "source": "https://github.com/php-testo/inline/tree/0.1.8" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-08-10T12:39:25+00:00" + }, + { + "name": "testo/lifecycle", + "version": "0.1.5", + "source": { + "type": "git", + "url": "https://github.com/php-testo/lifecycle.git", + "reference": "961ae522548719aa74d7484c335b0f7b0e080638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-testo/lifecycle/zipball/961ae522548719aa74d7484c335b0f7b0e080638", + "reference": "961ae522548719aa74d7484c335b0f7b0e080638", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "testo/testo": "0.10.34 - 1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Testo\\Lifecycle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Lifecycle hooks plugin for the Testo testing framework.", + "keywords": [ + "lifecycle", + "testo" + ], + "support": { + "source": "https://github.com/php-testo/lifecycle/tree/0.1.5" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-07-01T13:40:46+00:00" + }, + { + "name": "testo/repeat", + "version": "0.1.9", + "source": { + "type": "git", + "url": "https://github.com/php-testo/repeat.git", + "reference": "9d20e475e6fe94d0bb7a43d6ab2b12c69d77a0f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-testo/repeat/zipball/9d20e475e6fe94d0bb7a43d6ab2b12c69d77a0f5", + "reference": "9d20e475e6fe94d0bb7a43d6ab2b12c69d77a0f5", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "testo/testo": "0.10.39 - 1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "Repeat.php" + ], + "psr-4": { + "Testo\\Repeat\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Repeat policy plugin for the Testo testing framework.", + "keywords": [ + "repeat", + "test", + "testo" + ], + "support": { + "source": "https://github.com/php-testo/repeat/tree/0.1.9" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-08-06T07:42:29+00:00" + }, + { + "name": "testo/retry", + "version": "0.1.5", + "source": { + "type": "git", + "url": "https://github.com/php-testo/retry.git", + "reference": "8e158e8341a5824b96f252fc711988daf15694d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-testo/retry/zipball/8e158e8341a5824b96f252fc711988daf15694d2", + "reference": "8e158e8341a5824b96f252fc711988daf15694d2", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "testo/testo": "0.10.39 - 1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "Retry.php" + ], + "psr-4": { + "Testo\\Retry\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Retry policy plugin for the Testo testing framework.", + "keywords": [ + "retry", + "testo" + ], + "support": { + "source": "https://github.com/php-testo/retry/tree/0.1.5" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-08-06T07:43:03+00:00" + }, + { + "name": "testo/test", + "version": "0.1.6", + "source": { + "type": "git", + "url": "https://github.com/php-testo/test.git", + "reference": "a67bb2c742936c6180175b3eda7baec8b9990954" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-testo/test/zipball/a67bb2c742936c6180175b3eda7baec8b9990954", + "reference": "a67bb2c742936c6180175b3eda7baec8b9990954", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "testo/testo": "0.10.34 - 1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "Test.php" + ], + "psr-4": { + "Testo\\Test\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "Test attribute plugin for the Testo testing framework.", + "keywords": [ + "test", + "testo" + ], + "support": { + "source": "https://github.com/php-testo/test/tree/0.1.6" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-07-01T13:41:02+00:00" + }, + { + "name": "testo/testo", + "version": "0.10.45", + "source": { + "type": "git", + "url": "https://github.com/php-testo/testo.git", + "reference": "d67b3ba43ac30fe0ffa4e69d08782aba466d249c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-testo/testo/zipball/d67b3ba43ac30fe0ffa4e69d08782aba466d249c", + "reference": "d67b3ba43ac30fe0ffa4e69d08782aba466d249c", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "internal/destroy": "^1.0", + "internal/path": "^1.3", + "php": ">=8.2", + "psr/container": "1 - 2", + "psr/event-dispatcher": "^1.0", + "psr/log": "^2.0 || ^3.0", + "symfony/console": "^6.4 || ^7 || ^8.0", + "symfony/finder": "^6.4 || ^7 || ^8.0", + "testo/assert": "^0.1.14", + "testo/bench": "^0.1.10", + "testo/bridge-symfony-console": "^0.1.11", + "testo/codecov": "^0.2.1", + "testo/convention": "^0.1.4", + "testo/data": "^0.1.9", + "testo/fiber": "^0.1.3", + "testo/filter": "^0.1.6", + "testo/inline": "^0.1.8", + "testo/lifecycle": "^0.1.5", + "testo/repeat": "^0.1.9", + "testo/retry": "^0.1.5", + "testo/test": "^0.1.6", + "yiisoft/injector": "^1.2" + }, + "replace": { + "internal/container": "*", + "internal/fiber": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8", + "buggregator/trap": "^1.10", + "internal/dload": "^1.6", + "llm/skills": "^1.3", + "php-vcr/php-vcr": "^1.6", + "rector/rector": "^2.6.4", + "roxblnfk/unpoly": "1.8.2", + "testo/bridge-infection": "^0.1.8", + "testo/bridge-mockery": "^0.1.2", + "testo/bridge-rector": "^0.2.5", + "testo/bridge-revolt": "^0.1.2", + "testo/bridge-vcr": "^0.1.1", + "testo/facade": "^0.1.1" + }, + "suggest": { + "llm/skills": "Ship Testo's bundled AI-agent skills into your project's skills directory automatically.", + "testo/bridge-infection": "Provides integration with Infection PHP mutation testing framework.", + "testo/bridge-mockery": "Provides integration with the Mockery mocking framework." + }, + "type": "library", + "extra": { + "skills": { + "source": "skills" + }, + "bamarni-bin": { + "bin-links": true, + "forward-command": false, + "target-directory": "tools" + } + }, + "autoload": { + "psr-4": { + "Testo\\": "core/", + "Internal\\Fiber\\": "internal/fiber/src", + "Internal\\Container\\": "internal/container/src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + } + ], + "description": "A lightweight PHP testing framework.", + "homepage": "https://php-testo.github.io/", + "keywords": [ + "dev", + "test", + "testing", + "tests" + ], + "support": { + "docs": "https://php-testo.github.io/", + "issues": "https://github.com/php-testo/testo/issues", + "source": "https://github.com/php-testo/testo" + }, + "funding": [ + { + "url": "https://boosty.to/roxblnfk", + "type": "boosty" + } + ], + "time": "2026-08-30T18:23:09+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^8.1" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "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/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2025-12-08T11:19:18+00:00" + }, + { + "name": "vimeo/psalm", + "version": "6.16.1", + "source": { + "type": "git", + "url": "https://github.com/vimeo/psalm.git", + "reference": "f1f5de594dc76faf8784e02d3dc4716c91c6f6ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/f1f5de594dc76faf8784e02d3dc4716c91c6f6ac", + "reference": "f1f5de594dc76faf8784e02d3dc4716c91c6f6ac", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/parallel": "^2.3", + "composer-runtime-api": "^2", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^2.0 || ^3.0", + "danog/advanced-json-rpc": "^3.1", + "dnoegel/php-xdg-base-dir": "^0.1.1", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "felixfbecker/language-server-protocol": "^1.5.3", + "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", + "netresearch/jsonmapper": "^5.0", + "nikic/php-parser": "^5.0.0", + "php": "~8.1.31 || ~8.2.27 || ~8.3.16 || ~8.4.3 || ~8.5.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", + "spatie/array-to-xml": "^2.17.0 || ^3.0", + "symfony/console": "^6.0 || ^7.0 || ^8.0", + "symfony/filesystem": "~6.3.12 || ~6.4.3 || ^7.0.3 || ^8.0", + "symfony/polyfill-php84": "^1.31.0" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "amphp/phpunit-util": "^3", + "bamarni/composer-bin-plugin": "^1.4", + "brianium/paratest": "^6.9", + "danog/class-finder": "^0.4.8", + "dg/bypass-finals": "^1.5", + "ext-curl": "*", + "mockery/mockery": "^1.5", + "nunomaduro/mock-final-classes": "^1.1", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpdoc-parser": "^1.6", + "phpunit/phpunit": "^9.6", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.19", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.6", + "symfony/process": "^6.0 || ^7.0 || ^8.0" + }, + "suggest": { + "ext-curl": "In order to send data to shepherd", + "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + }, + "bin": [ + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalm-review", + "psalter" + ], + "type": "project", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev", + "dev-2.x": "2.x-dev", + "dev-3.x": "3.x-dev", + "dev-4.x": "4.x-dev", + "dev-5.x": "5.x-dev", + "dev-6.x": "6.x-dev", + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psalm\\": "src/Psalm/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Brown" + }, + { + "name": "Daniil Gentili", + "email": "daniil@daniil.it" + } + ], + "description": "A static analysis tool for finding errors in PHP applications", + "keywords": [ + "code", + "inspection", + "php", + "static analysis" + ], + "support": { + "docs": "https://psalm.dev/docs", + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm" + }, + "time": "2026-03-19T10:56:09+00:00" + }, + { + "name": "webmozart/assert", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/2ccb7c2e821038c03a3e6e1700c570c158c55f70", + "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-date": "*", + "ext-filter": "*", + "php": "^8.2" + }, + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" + }, + "type": "library", + "extra": { + "psalm": { + "pluginClass": "Webmozart\\Assert\\PsalmPlugin" + }, + "branch-alias": { + "dev-master": "2.0-dev", + "dev-feature/2-0": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Woody Gilk", + "email": "woody.gilk@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/2.4.1" + }, + "time": "2026-06-15T15:31:57+00:00" + }, + { + "name": "yiisoft/injector", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/injector.git", + "reference": "d3f718256b734933670ad11143cca724d340fc90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/injector/zipball/d3f718256b734933670ad11143cca724d340fc90", + "reference": "d3f718256b734933670ad11143cca724d340fc90", + "shasum": "" + }, + "require": { + "php": "7.4 - 8.5" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.3", + "maglnet/composer-require-checker": "^3.8 || ^4.2", + "phpbench/phpbench": "^1.1", + "phpunit/phpunit": "^9.5", + "psr/container": "^1.0 || ^2.0", + "rector/rector": "^2.0.10", + "spatie/phpunit-watcher": "^1.23", + "yiisoft/test-support": "^1.4 || ^3.1" + }, + "suggest": { + "psr/container": "For automatic resolving of dependencies" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true, + "target-directory": "tools" + } + }, + "autoload": { + "psr-4": { + "Yiisoft\\Injector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR-11 compatible injector. Executes a callable and makes an instances by injecting dependencies from a given DI container.", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "PSR-11", + "dependency injection", + "di", + "injector", + "reflection" + ], + "support": { + "chat": "https://t.me/yii3en", + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/injector/issues?state=open", + "source": "https://github.com/yiisoft/injector", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "opencollective" + } + ], + "time": "2025-12-01T11:14:17+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "8.3 - 8.5" + }, + "platform-dev": {}, + "plugin-api-version": "2.9.0" +} diff --git a/docs/scripts/api-snapshot.json b/docs/scripts/api-snapshot.json index f8ae004..5f66c5c 100644 --- a/docs/scripts/api-snapshot.json +++ b/docs/scripts/api-snapshot.json @@ -2,7 +2,7 @@ "classes": [ { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Arg", "kind": "class", @@ -437,7 +437,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Bypass\\FileWrapper", "kind": "class", @@ -1099,7 +1099,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Bypass\\FinalStripper", "kind": "class", @@ -1159,7 +1159,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Captor", "kind": "class", @@ -1287,7 +1287,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Cardinality", "kind": "class", @@ -1480,7 +1480,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Codegen\\Blueprint", "kind": "class", @@ -1617,7 +1617,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Codegen\\DoubleFactory", "kind": "class", @@ -1746,7 +1746,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Codegen\\MethodSignature", "kind": "class", @@ -1875,7 +1875,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Codegen\\PropertyDefaults", "kind": "class", @@ -1928,7 +1928,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Codegen\\PropertySignature", "kind": "class", @@ -2018,7 +2018,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Codegen\\TargetUnifier", "kind": "class", @@ -2071,7 +2071,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Codegen\\TypeRenderer", "kind": "class", @@ -2191,7 +2191,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Defaults\\DefaultFactories", "kind": "class", @@ -2296,7 +2296,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Defaults\\TypeDefaultResolver", "kind": "class", @@ -2435,7 +2435,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\AmbiguousDefaultFactory", "kind": "class", @@ -2495,7 +2495,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\BypassUnavailable", "kind": "class", @@ -2601,7 +2601,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\CannotWire", "kind": "class", @@ -2846,7 +2846,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\ConflictingExpectation", "kind": "class", @@ -2966,7 +2966,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\ContextOwnershipViolation", "kind": "class", @@ -3011,7 +3011,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\ForgottenDouble", "kind": "class", @@ -3148,7 +3148,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\ForwardingTargetMismatch", "kind": "class", @@ -3238,7 +3238,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\InvalidCallSpecification", "kind": "class", @@ -3629,7 +3629,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\InvalidDefaultValue", "kind": "class", @@ -3689,7 +3689,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\InvalidSpecificationArgument", "kind": "class", @@ -3877,7 +3877,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\MatcherLeaked", "kind": "class", @@ -3944,7 +3944,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\NeverMethodCalled", "kind": "class", @@ -4064,7 +4064,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\NoDefaultValue", "kind": "class", @@ -4131,7 +4131,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\NothingCaptured", "kind": "class", @@ -4184,7 +4184,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\OriginalCallUnavailable", "kind": "class", @@ -4267,7 +4267,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\OriginalReturnTypeViolation", "kind": "class", @@ -4334,7 +4334,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\OutcomeUnavailable", "kind": "class", @@ -4417,7 +4417,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\StrictModeViolation", "kind": "class", @@ -4484,7 +4484,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\UnderstudyError", "kind": "interface", @@ -4533,7 +4533,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\UnsupportedTarget", "kind": "class", @@ -4653,7 +4653,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Exception\\VerificationFailed", "kind": "class", @@ -4740,7 +4740,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\ExpectBuilder", "kind": "class", @@ -4788,7 +4788,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Expectation\\Action", "kind": "interface", @@ -4845,7 +4845,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Expectation\\ArgumentFormatter", "kind": "class", @@ -4928,7 +4928,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Expectation\\ComputeAnswer", "kind": "class", @@ -4995,7 +4995,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Expectation\\Expectation", "kind": "class", @@ -5453,7 +5453,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Expectation\\ReturnValue", "kind": "class", @@ -5520,7 +5520,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Expectation\\ThrowError", "kind": "class", @@ -5587,7 +5587,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\FailureKind", "kind": "enum", @@ -5676,7 +5676,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\FailureReport", "kind": "class", @@ -5861,7 +5861,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Invocation", "kind": "class", @@ -6217,7 +6217,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\AllOf", "kind": "class", @@ -6301,7 +6301,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\AnyArgument", "kind": "class", @@ -6375,7 +6375,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\AnyOf", "kind": "class", @@ -6459,7 +6459,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\AnyRest", "kind": "class", @@ -6559,7 +6559,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\AnyTail", "kind": "class", @@ -6659,7 +6659,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\ArgumentMatcher", "kind": "interface", @@ -6747,7 +6747,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\ArrayContaining", "kind": "class", @@ -6831,7 +6831,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\BooleanValue", "kind": "class", @@ -6905,7 +6905,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\Bounds", "kind": "class", @@ -6965,7 +6965,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\Capturing", "kind": "class", @@ -7058,7 +7058,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\CountBetween", "kind": "class", @@ -7151,7 +7151,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\EmptyTail", "kind": "class", @@ -7251,7 +7251,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\FloatInRange", "kind": "class", @@ -7344,7 +7344,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\IdenticalTo", "kind": "class", @@ -7428,7 +7428,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\InstanceOfType", "kind": "class", @@ -7512,7 +7512,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\IntInRange", "kind": "class", @@ -7605,7 +7605,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\Negated", "kind": "class", @@ -7689,7 +7689,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\Operand", "kind": "class", @@ -7772,7 +7772,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\QueryEquals", "kind": "class", @@ -7865,7 +7865,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\Satisfying", "kind": "class", @@ -7958,7 +7958,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\StringMatching", "kind": "class", @@ -8042,7 +8042,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Matcher\\TailMatcher", "kind": "interface", @@ -8101,7 +8101,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Outcome", "kind": "class", @@ -8273,8 +8273,8 @@ }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\ArgReturnType", "kind": "class", "isApi": false, @@ -8381,13 +8381,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/ArgReturnType.php#L40", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/ArgReturnType.php#L40", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\BuilderReturnType", "kind": "class", "isApi": false, @@ -8477,13 +8477,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/BuilderReturnType.php#L23", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/BuilderReturnType.php#L23", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\CaptorReturnType", "kind": "class", "isApi": false, @@ -8590,25 +8590,25 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/CaptorReturnType.php#L30", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/CaptorReturnType.php#L30", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Collector\\CaptureCallCollector", "kind": "class", "isApi": false, "isAbstract": false, "isThrowable": false, "summary": "Where every `$captor->capture()` is written.", - "description": "The receiver's type is what decides — a foreign `capture()` on some other\nobject is not a matcher, and reporting it as a leak would be a false\naccusation in a consumer's own code. Type-checked here, where a Scope is\navailable; the leak rule that reads this out only sees lines.", + "description": "The receiver's type is what decides — a foreign `capture()` on some other\nobject is not a matcher, and reporting it as a leak would be a false\naccusation in a consumer's own code. Type-checked here, where a Scope is\navailable; the leak rule that reads this out only sees locations.", "deprecated": null, "see": [], "extensionTags": { "implements": [ - "\\PHPStan\\Collectors\\Collector<\\PhpParser\\Node\\Expr\\MethodCall,int>" + "\\PHPStan\\Collectors\\Collector<\\PhpParser\\Node\\Expr\\MethodCall,array{int, int}>" ], "internal": [ "" @@ -8658,7 +8658,7 @@ "variadic": false } ], - "returnType": "?int", + "returnType": "?array", "summary": "", "description": "", "throws": [], @@ -8674,13 +8674,97 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Collector/CaptureCallCollector.php#L27", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Collector/CaptureCallCollector.php#L27", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", + "class": "Rasuvaeff\\Understudy\\PhpStan\\Collector\\HoistedMatcherCollector", + "kind": "class", + "isApi": false, + "isAbstract": false, + "isThrowable": false, + "summary": "Where a matcher is stored rather than passed.", + "description": "`$any = Arg::any();` and `$this->any = Arg::any();` hand the matcher to\nnothing: they name it, and the name is used inside a specification later.\nThat later use is what `Rule\\MatcherLeakRule` judges, and it judges by\ntextual range — so without this the assignment itself, which is nobody's\nargument, was reported as a matcher reaching a real call.\n\nThe range is the matcher's own, which is what the leak rule compares\nagainst.", + "deprecated": null, + "see": [], + "extensionTags": { + "implements": [ + "\\PHPStan\\Collectors\\Collector<\\PhpParser\\Node\\Expr\\Assign,array{int, int}>" + ], + "internal": [ + "" + ] + }, + "extends": null, + "implements": [ + "PHPStan\\Collectors\\Collector" + ], + "attributes": [], + "constructorParams": [], + "publicProperties": [], + "publicMethods": [ + { + "name": "getNodeType", + "static": false, + "params": [], + "returnType": "string", + "summary": "", + "description": "", + "throws": [], + "throwsInBody": false, + "inheritedFrom": null, + "see": [], + "deprecated": null, + "attributes": [ + "Override" + ], + "startLine": 32 + }, + { + "name": "processNode", + "static": false, + "params": [ + { + "name": "node", + "type": "\\PHPStan\\Collectors\\TNodeType", + "description": "", + "default": null, + "variadic": false + }, + { + "name": "scope", + "type": "PHPStan\\Analyser\\Scope", + "description": "", + "default": null, + "variadic": false + } + ], + "returnType": "?array", + "summary": "", + "description": "", + "throws": [], + "throwsInBody": false, + "inheritedFrom": "PHPStan\\Collectors\\Collector", + "see": [], + "deprecated": null, + "attributes": [ + "Override" + ], + "startLine": 38 + } + ], + "constants": [], + "enumCases": [], + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Collector/HoistedMatcherCollector.php#L29", + "implementedBy": [] + }, + { + "root": "phpstan", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Collector\\MatcherCallCollector", "kind": "class", "isApi": false, @@ -8692,7 +8776,7 @@ "see": [], "extensionTags": { "implements": [ - "\\PHPStan\\Collectors\\Collector<\\PhpParser\\Node\\Expr\\StaticCall,array{int, string}>" + "\\PHPStan\\Collectors\\Collector<\\PhpParser\\Node\\Expr\\StaticCall,array{int, int, string}>" ], "internal": [ "" @@ -8758,19 +8842,19 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Collector/MatcherCallCollector.php#L20", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Collector/MatcherCallCollector.php#L20", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Collector\\SpecificationRangeCollector", "kind": "class", "isApi": false, "isAbstract": false, "isThrowable": false, - "summary": "The lines every specification call spans.", + "summary": "The file offsets every specification call spans.", "description": "Collected rather than read from a parent node because PHPStan hands a rule\na node and a scope and nothing above it, and the order nodes arrive in is\nnot part of its contract — a static index filled as the analysis walks\nwould be right or empty depending on that order. Collected data is keyed\nby file and survives the result cache, so `Rule\\MatcherLeakRule` can ask\nits question once every file has answered.", "deprecated": null, "see": [], @@ -8842,13 +8926,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Collector/SpecificationRangeCollector.php#L27", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Collector/SpecificationRangeCollector.php#L27", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Internal\\BuilderType", "kind": "class", "isApi": false, @@ -8909,13 +8993,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Internal/BuilderType.php#L30", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Internal/BuilderType.php#L30", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Internal\\Cardinality", "kind": "class", "isApi": false, @@ -8992,13 +9076,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Internal/Cardinality.php#L16", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Internal/Cardinality.php#L16", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Internal\\ClosureShape", "kind": "class", "isApi": false, @@ -9034,6 +9118,15 @@ "promoted": true, "promotedVisibility": "public", "readonly": false + }, + { + "name": "candidateCalls", + "type": "int<0, max>", + "description": "the subset of $methodCalls that could\nland on a double: the engine throws\n`InvocationSignal` on the first call\nthat does, and never sees the rest", + "default": null, + "promoted": true, + "promotedVisibility": "public", + "readonly": false } ], "publicProperties": [], @@ -9059,7 +9152,7 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 42 + "startLine": 54 }, { "name": "problem", @@ -9074,18 +9167,18 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 104 + "startLine": 154 } ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Internal/ClosureShape.php#L29", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Internal/ClosureShape.php#L30", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Internal\\MatcherKind", "kind": "class", "isApi": false, @@ -9139,13 +9232,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Internal/MatcherKind.php#L28", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Internal/MatcherKind.php#L28", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Internal\\MatcherName", "kind": "class", "isApi": false, @@ -9192,13 +9285,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Internal/MatcherName.php#L22", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Internal/MatcherName.php#L22", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Internal\\ResolvedName", "kind": "class", "isApi": false, @@ -9245,13 +9338,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Internal/ResolvedName.php#L20", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Internal/ResolvedName.php#L20", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Internal\\SpecificationCheck", "kind": "class", "isApi": false, @@ -9331,13 +9424,13 @@ } ], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Internal/SpecificationCheck.php#L35", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Internal/SpecificationCheck.php#L35", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Internal\\SpecificationExpr", "kind": "class", "isApi": false, @@ -9384,13 +9477,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Internal/SpecificationExpr.php#L22", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Internal/SpecificationExpr.php#L22", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Internal\\SpecifiedCall", "kind": "class", "isApi": false, @@ -9467,7 +9560,7 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 39 + "startLine": 40 }, { "name": "parameters", @@ -9482,7 +9575,7 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 60 + "startLine": 61 }, { "name": "returnType", @@ -9497,18 +9590,18 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 65 + "startLine": 66 } ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Internal/SpecifiedCall.php#L31", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Internal/SpecifiedCall.php#L32", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Internal\\VerbNames", "kind": "class", "isApi": false, @@ -9550,7 +9643,7 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 40 + "startLine": 64 }, { "name": "isStaticCall", @@ -9580,7 +9673,7 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 59 + "startLine": 83 }, { "name": "shortVerb", @@ -9603,7 +9696,7 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 68 + "startLine": 92 } ], "constants": [ @@ -9615,13 +9708,13 @@ } ], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Internal/VerbNames.php#L16", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Internal/VerbNames.php#L16", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Internal\\WireShape", "kind": "class", "isApi": false, @@ -9680,25 +9773,25 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 37 + "startLine": 39 } ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Internal/WireShape.php#L30", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Internal/WireShape.php#L32", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\RestArity", "kind": "class", "isApi": false, "isAbstract": false, "isThrowable": false, "summary": "Lets a specification stop before the contract's required parameters run\nout, the way `Arg::rest()` says it may.", - "description": "`when(fn () => $storage->recordOutcome('svc', Arg::rest()))` physically\npasses two arguments to a seven-parameter method — the engine's generated\nparameters carry a sentinel default exactly so that call can be made — and\nPHPStan's `arguments.count` report is correct about the contract and wrong\nabout the idiom.\n\nIgnored wherever the call's last written argument is `Arg::rest()`, with\nno specification-scope test, and that is a reasoned omission rather than a\nshortcut: this extension is handed the error's node and scope, not the\ncollected specification ranges, and it does not need them — a `rest()` in\na real call is already reported by `Rule\\MatcherLeakRule` (and answered at\nruntime with `ArgumentCountError`), so silencing the arity half there\nhides nothing that is not louder elsewhere.", + "description": "`when(fn () => $storage->recordOutcome('svc', Arg::rest()))` physically\npasses two arguments to a seven-parameter method — the engine's generated\nparameters carry a sentinel default exactly so that call can be made — and\nPHPStan's `arguments.count` report is correct about the contract and wrong\nabout the idiom.\n\nIgnored wherever the call's last written argument is `Arg::rest()`, with\nno specification-scope test, and that is a reasoned omission rather than a\nshortcut: this extension is handed the error's node and scope, not the\ncollected specification ranges, and it does not need them — a `rest()` in\na real call is already reported by `Rule\\MatcherLeakRule` (and answered at\nruntime with `ArgumentCountError`), so silencing the arity half there\nhides nothing that is not louder elsewhere.\n\n`understudy-psalm` deliberately differs: its suppression requires the call\nto sit inside a recorded specification as well, because there a leaked\nmatcher has no rule of its own to report it — Psalm answers a `never`-typed\nargument with `NoValue`, so the leak is caught by the argument diagnostic\nthat this narrower scope is what keeps alive. Two answers to one question,\neach right for the analyser it lives in.", "deprecated": null, "see": [], "extensionTags": { @@ -9751,18 +9844,18 @@ "attributes": [ "Override" ], - "startLine": 39 + "startLine": 46 } ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/RestArity.php#L34", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/RestArity.php#L41", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Rule\\FluentCardinalityRule", "kind": "class", "isApi": false, @@ -9803,7 +9896,7 @@ "attributes": [ "Override" ], - "startLine": 30 + "startLine": 31 }, { "name": "processNode", @@ -9835,18 +9928,18 @@ "attributes": [ "Override" ], - "startLine": 36 + "startLine": 37 } ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Rule/FluentCardinalityRule.php#L27", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Rule/FluentCardinalityRule.php#L28", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Rule\\MatcherLeakRule", "kind": "class", "isApi": false, @@ -9887,7 +9980,7 @@ "attributes": [ "Override" ], - "startLine": 39 + "startLine": 40 }, { "name": "processNode", @@ -9919,7 +10012,7 @@ "attributes": [ "Override" ], - "startLine": 45 + "startLine": 46 } ], "constants": [ @@ -9931,19 +10024,19 @@ } ], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Rule/MatcherLeakRule.php#L34", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Rule/MatcherLeakRule.php#L35", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Rule\\SpecificationCallRule", "kind": "class", "isApi": false, "isAbstract": false, "isThrowable": false, - "summary": "The free-function form: `when()`, `expect()`, `verify()`.", + "summary": "The free-function form: `when()`, `expect()`, `expectSequence()`, `verify()`.", "description": "", "deprecated": null, "see": [], @@ -10015,13 +10108,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Rule/SpecificationCallRule.php#L21", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Rule/SpecificationCallRule.php#L21", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Rule\\SpecificationStaticCallRule", "kind": "class", "isApi": false, @@ -10099,13 +10192,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Rule/SpecificationStaticCallRule.php#L23", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Rule/SpecificationStaticCallRule.php#L23", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\Rule\\VoidReturnsRule", "kind": "class", "isApi": false, @@ -10146,7 +10239,7 @@ "attributes": [ "Override" ], - "startLine": 39 + "startLine": 40 }, { "name": "processNode", @@ -10178,7 +10271,7 @@ "attributes": [ "Override" ], - "startLine": 45 + "startLine": 46 } ], "constants": [ @@ -10190,13 +10283,13 @@ } ], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/Rule/VoidReturnsRule.php#L34", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/Rule/VoidReturnsRule.php#L35", "implementedBy": [] }, { "root": "phpstan", - "rootVersion": "v0.2.1", - "rootReference": "55df82300b4eba83c101d835f6abe02159215d97", + "rootVersion": "v0.5.1", + "rootReference": "4346ebd4669322dfc8fd6a804e464357e0e7c391", "class": "Rasuvaeff\\Understudy\\PhpStan\\StaticBuilderReturnType", "kind": "class", "isApi": false, @@ -10313,13 +10406,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/55df82300b4eba83c101d835f6abe02159215d97/src/PhpStan/StaticBuilderReturnType.php#L29", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpstan/blob/4346ebd4669322dfc8fd6a804e464357e0e7c391/src/PhpStan/StaticBuilderReturnType.php#L29", "implementedBy": [] }, { "root": "phpunit", - "rootVersion": "v0.1.7", - "rootReference": "d48d08dcb2d23a0359d2f756cc51e96c8ece7624", + "rootVersion": "v0.3.0", + "rootReference": "1c5d658896cd8086b4f80087782f3c0a80e31501", "class": "Rasuvaeff\\Understudy\\PhpUnit\\UnderstudyPHPUnitIntegration", "kind": "trait", "isApi": true, @@ -10342,13 +10435,13 @@ "publicMethods": [], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-phpunit/blob/d48d08dcb2d23a0359d2f756cc51e96c8ece7624/src/PhpUnit/UnderstudyPHPUnitIntegration.php#L83", + "sourceUrl": "https://github.com/rasuvaeff/understudy-phpunit/blob/1c5d658896cd8086b4f80087782f3c0a80e31501/src/PhpUnit/UnderstudyPHPUnitIntegration.php#L83", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\BuilderReturnType", "kind": "class", "isApi": false, @@ -10416,13 +10509,87 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/BuilderReturnType.php#L19", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/BuilderReturnType.php#L19", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", + "class": "Rasuvaeff\\Understudy\\Psalm\\CaptorRecorder", + "kind": "class", + "isApi": false, + "isAbstract": false, + "isThrowable": false, + "summary": "Records where a captor's `capture()` is, with the receiver resolved.", + "description": "It answers `null` to every call, and that is not a stub waiting to be\nfilled in: this hook is here for the receiver, not for the type. A\n`capture()` is a matcher written as a method call, so `SpecificationScope`\ncannot recognise it the way it recognises `Arg::` — the name of a method\nsays nothing about the class it belongs to. Psalm has resolved that class by\nthe time it asks for a return type, and `getClassLikeNames()` means the hook\nis handed nothing else, so the call it is looking at IS ours. All the\nsuppression hook needs is where it is.\n\nThe obvious alternative does not work here. PHPStan types `capture()` as\n`never`, which makes the argument acceptable everywhere and needs no\nsuppression at all; Psalm answers a `never`-typed argument with `NoValue` —\na false positive inside a specification, and at a real call the right\nverdict under the wrong issue. Both halves of\n`MatcherSuppressionIntegrationTest` go red on it. Measured, not assumed;\ndo not re-try it without re-reading this.\n\nThe one thing this depends on that is not a contract: the return type is\nasked for before the enclosing call's argument is judged. If that order ever\ninverts, a diagnostic REAPPEARS inside a specification — noise, not silence,\nwhich is the direction a failure here should take.", + "deprecated": null, + "see": [], + "extensionTags": { + "internal": [ + "" + ] + }, + "extends": null, + "implements": [ + "Psalm\\Plugin\\EventHandler\\MethodReturnTypeProviderInterface" + ], + "attributes": [], + "constructorParams": [], + "publicProperties": [], + "publicMethods": [ + { + "name": "getClassLikeNames", + "static": true, + "params": [], + "returnType": "array", + "summary": "", + "description": "", + "throws": [], + "throwsInBody": false, + "inheritedFrom": null, + "see": [], + "deprecated": null, + "attributes": [ + "Override" + ], + "startLine": 45 + }, + { + "name": "getMethodReturnType", + "static": true, + "params": [ + { + "name": "event", + "type": "Psalm\\Plugin\\EventHandler\\Event\\MethodReturnTypeProviderEvent", + "description": "", + "default": null, + "variadic": false + } + ], + "returnType": "?Psalm\\Type\\Union", + "summary": "Use this hook for providing custom return type logic. If this plugin does not know what a method should return\nbut another plugin may be able to determine the type, return null. Otherwise return a mixed union type if\nsomething should be returned, but can't be more specific.", + "description": "", + "throws": [], + "throwsInBody": false, + "inheritedFrom": "Psalm\\Plugin\\EventHandler\\MethodReturnTypeProviderInterface", + "see": [], + "deprecated": null, + "attributes": [ + "Override" + ], + "startLine": 51 + } + ], + "constants": [], + "enumCases": [], + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/CaptorRecorder.php#L39", + "implementedBy": [] + }, + { + "root": "psalm", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\Internal\\BuilderType", "kind": "class", "isApi": false, @@ -10485,18 +10652,18 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 44 + "startLine": 45 } ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/Internal/BuilderType.php#L36", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/Internal/BuilderType.php#L37", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\Internal\\Cardinality", "kind": "class", "isApi": false, @@ -10573,13 +10740,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/Internal/Cardinality.php#L16", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/Internal/Cardinality.php#L16", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\Internal\\ClosureShape", "kind": "class", "isApi": false, @@ -10615,6 +10782,15 @@ "promoted": true, "promotedVisibility": "public", "readonly": false + }, + { + "name": "candidateCalls", + "type": "int<0, max>", + "description": "the subset of $methodCalls that could\nland on a double: the engine throws\n`InvocationSignal` on the first call\nthat does, and never sees the rest", + "default": null, + "promoted": true, + "promotedVisibility": "public", + "readonly": false } ], "publicProperties": [], @@ -10640,7 +10816,7 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 42 + "startLine": 54 }, { "name": "problem", @@ -10655,18 +10831,18 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 104 + "startLine": 160 } ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/Internal/ClosureShape.php#L29", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/Internal/ClosureShape.php#L30", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\Internal\\MatcherClass", "kind": "class", "isApi": false, @@ -10713,20 +10889,20 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/Internal/MatcherClass.php#L20", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/Internal/MatcherClass.php#L20", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\Internal\\MatcherKind", "kind": "class", "isApi": false, "isAbstract": false, "isThrowable": false, "summary": "Whether a matcher can ever match a parameter of a given type.", - "description": "Deliberately about the KIND, not about assignability. `Arg::int()` cannot\nmatch a `string` parameter under any argument, and that is worth saying\nbefore the test runs; `Arg::any()` can match anything and never complains.\nEverything the plugin is not sure about is silent — a false accusation here\ncosts more than a missed one, because the runtime still catches the miss.", + "description": "Deliberately about the KIND, not about assignability. `Arg::int()` cannot\nmatch a `string` parameter under any argument, and that is worth saying\nbefore the test runs; `Arg::any()` can match anything and never complains.\nEverything the plugin is not sure about is silent — a false accusation here\ncosts more than a missed one, because the runtime still catches the miss.\n\nThe question is asked of Psalm's atomic types, not of the names they print\nas. A name comparison called `non-empty-string`, `numeric-string`,\n`class-string`, `positive-int`, `int<1, 10>` and every literal a mistake,\nbecause none of those strings is `string` or `int` — and a refined type is\nstill the kind it refines. `TNonEmptyString` IS a `TString` and\n`TIntRange` IS a `TInt`, so the class hierarchy answers what the spelling\ncould not.", "deprecated": null, "see": [], "extensionTags": { @@ -10752,9 +10928,9 @@ "variadic": false }, { - "name": "parameterTypes", - "type": "list", - "description": "atomic types the parameter accepts", + "name": "parameterType", + "type": "Psalm\\Type\\Union", + "description": "", "default": null, "variadic": false } @@ -10768,78 +10944,25 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 43 - } - ], - "constants": [], - "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/Internal/MatcherKind.php#L18", - "implementedBy": [] - }, - { - "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", - "class": "Rasuvaeff\\Understudy\\Psalm\\Internal\\MatcherText", - "kind": "class", - "isApi": false, - "isAbstract": false, - "isThrowable": false, - "summary": "Whether the source text Psalm complained about is an `Arg::` matcher.", - "description": "Read off the reported selection rather than the AST because the selection\nis all the issue hook is handed. That is a real limit, and it is the reason\nthis test is narrow: a literal that merely sits inside a specification\nclosure has to keep its diagnostic, so anything that is not recognisably a\nmatcher call is left alone.", - "deprecated": null, - "see": [], - "extensionTags": { - "internal": [ - "" - ] - }, - "extends": null, - "implements": [], - "attributes": [], - "constructorParams": [], - "publicProperties": [], - "publicMethods": [ - { - "name": "looksLikeMatcher", - "static": true, - "params": [ - { - "name": "selected", - "type": "string", - "description": "", - "default": null, - "variadic": false - } - ], - "returnType": "bool", - "summary": "", - "description": "", - "throws": [], - "throwsInBody": false, - "inheritedFrom": null, - "see": [], - "deprecated": null, - "attributes": [], - "startLine": 45 + "startLine": 78 } ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/Internal/MatcherText.php#L18", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/Internal/MatcherKind.php#L41", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\Internal\\ScopeIndex", "kind": "class", "isApi": false, "isAbstract": false, "isThrowable": false, - "summary": "Where the specification calls of each file are.", - "description": "Line ranges rather than AST nodes: the issue hook is handed a location, not\na node, so a range is the only thing the two hooks can compare. A call\nspanning several lines therefore covers all of them, which is right — its\narguments are on those lines.", + "summary": "Where something of each file is, as inclusive integer ranges.", + "description": "Ranges rather than AST nodes: the issue hook is handed a location, not a\nnode, so a range is the only thing the two hooks can compare. All callers\nuse file offsets, which keeps two calls on one line distinct.", "deprecated": null, "see": [], "extensionTags": { @@ -10888,7 +11011,7 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 22 + "startLine": 21 }, { "name": "covers", @@ -10918,7 +11041,7 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 29 + "startLine": 28 }, { "name": "forget", @@ -10933,24 +11056,24 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 40 + "startLine": 39 } ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/Internal/ScopeIndex.php#L17", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/Internal/ScopeIndex.php#L16", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\Internal\\VerbNames", "kind": "class", "isApi": false, "isAbstract": false, "isThrowable": false, - "summary": "Whether a called name is one of understudy's three specification verbs.", + "summary": "Whether a called name is one of understudy's specification verbs.", "description": "Split out of the hook because this is the whole decision and the hook is\nonly plumbing: reaching it through Psalm would mean building an `Expr`, a\n`Context`, a `StatementsSource` and a `Codebase` to ask a question about a\nstring.", "deprecated": null, "see": [], @@ -10986,7 +11109,7 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 44 + "startLine": 62 }, { "name": "isStaticCall", @@ -11016,7 +11139,7 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 63 + "startLine": 81 } ], "constants": [ @@ -11028,13 +11151,13 @@ } ], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/Internal/VerbNames.php#L17", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/Internal/VerbNames.php#L17", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\Internal\\WireShape", "kind": "class", "isApi": false, @@ -11083,18 +11206,18 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 38 + "startLine": 39 } ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/Internal/WireShape.php#L31", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/Internal/WireShape.php#L32", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\Issue\\UnderstudyMisuse", "kind": "class", "isApi": true, @@ -11113,20 +11236,20 @@ "publicMethods": [], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/Issue/UnderstudyMisuse.php#L20", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/Issue/UnderstudyMisuse.php#L20", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\MatcherArgument", "kind": "class", "isApi": false, "isAbstract": false, "isThrowable": false, "summary": "Drops the one diagnostic the call-closure API cannot avoid on its own.", - "description": "`Arg::int()` is declared `mixed`, because a matcher has to be passable\nwherever the contract declares anything at all. Inside a specification\nclosure that is exactly right and Psalm cannot know it, so it reports the\nargument as mixed or invalid. Outside one, the same report is correct and\nstays.\n\nNarrow by construction, and deliberately so — a blanket suppression would\nhide the mistakes this plugin exists to surface. Three things must hold:\nthe issue is about an argument, the location is inside a recorded\nspecification call, and the offending text is an `Arg::` matcher.", + "description": "`Arg::int()` is declared `mixed`, because a matcher has to be passable\nwherever the contract declares anything at all. Inside a specification\nclosure that is exactly right and Psalm cannot know it, so it reports the\nargument as mixed or invalid. Outside one, the same report is correct and\nstays.\n\nNarrow by construction, and deliberately so — a blanket suppression would\nhide the mistakes this plugin exists to surface. Three things must hold:\nthe issue is about an argument, the location is inside a recorded\nspecification call, and the location is inside a call the resolver said is\none of our matchers.\n\nThe last of those used to be a look at the reported source text, and it was\nunsound in both directions: a foreign `Arg::` written unqualified had its\nown diagnostic silenced, and ours under an alias kept one it should not\nhave. `CodeLocation` carries `raw_file_start`/`raw_file_end` — the node's\nown `startFilePos`/`endFilePos` — so the answer is an offset lookup into\nwhat `SpecificationScope` resolved while walking the AST.", "deprecated": null, "see": [], "extensionTags": { @@ -11165,18 +11288,18 @@ "attributes": [ "Override" ], - "startLine": 48 + "startLine": 55 } ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/MatcherArgument.php#L27", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/MatcherArgument.php#L34", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\Plugin", "kind": "class", "isApi": true, @@ -11231,13 +11354,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/Plugin.php#L18", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/Plugin.php#L18", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\SpecificationRules", "kind": "class", "isApi": false, @@ -11283,18 +11406,18 @@ "attributes": [ "Override" ], - "startLine": 49 + "startLine": 53 } ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/SpecificationRules.php#L46", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/SpecificationRules.php#L50", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\SpecificationScope", "kind": "class", "isApi": false, @@ -11340,7 +11463,7 @@ "attributes": [ "Override" ], - "startLine": 37 + "startLine": 40 }, { "name": "index", @@ -11355,7 +11478,7 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 66 + "startLine": 91 }, { "name": "restCalls", @@ -11370,7 +11493,22 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 77 + "startLine": 102 + }, + { + "name": "matcherCalls", + "static": true, + "params": [], + "returnType": "Rasuvaeff\\Understudy\\Psalm\\Internal\\ScopeIndex", + "summary": "Where the matcher calls of each file are, in FILE OFFSETS rather than\nline numbers — the unit the other two indexes do not use.", + "description": "This is what lets the issue hook answer \"is the thing complained about\none of our matchers\" by resolution instead of by how it was spelled: a\n`StaticCall` is recorded only when the resolver says its class is ours,\nso a namesake keeps its diagnostics and an alias of ours loses the ones\nit should never have had.", + "throws": [], + "throwsInBody": false, + "inheritedFrom": null, + "see": [], + "deprecated": null, + "attributes": [], + "startLine": 117 }, { "name": "reset", @@ -11385,18 +11523,18 @@ "see": [], "deprecated": null, "attributes": [], - "startLine": 86 + "startLine": 126 } ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/SpecificationScope.php#L30", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/SpecificationScope.php#L31", "implementedBy": [] }, { "root": "psalm", - "rootVersion": "v0.2.0", - "rootReference": "d4f53860f7e5a7e2463dc087ce5dc3eb1826e631", + "rootVersion": "v0.8.1", + "rootReference": "a5371cb3f323de133bb20d89ac0cdb2ab2cb572d", "class": "Rasuvaeff\\Understudy\\Psalm\\StaticBuilderReturnType", "kind": "class", "isApi": false, @@ -11464,12 +11602,12 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/d4f53860f7e5a7e2463dc087ce5dc3eb1826e631/src/Psalm/StaticBuilderReturnType.php#L23", + "sourceUrl": "https://github.com/rasuvaeff/understudy-psalm/blob/a5371cb3f323de133bb20d89ac0cdb2ab2cb572d/src/Psalm/StaticBuilderReturnType.php#L23", "implementedBy": [] }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Runtime\\Absent", "kind": "enum", @@ -11512,7 +11650,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Runtime\\ArmedSequence", "kind": "class", @@ -11680,7 +11818,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Runtime\\DoubleState", "kind": "class", @@ -12161,7 +12299,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Runtime\\InvocationSignal", "kind": "class", @@ -12237,7 +12375,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Runtime\\Mode", "kind": "enum", @@ -12300,7 +12438,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Runtime\\ReferenceSlot", "kind": "class", @@ -12336,7 +12474,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Runtime\\Runtime", "kind": "class", @@ -12885,7 +13023,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Runtime\\RuntimeContext", "kind": "class", @@ -13232,7 +13370,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Runtime\\SequenceVerdict", "kind": "enum", @@ -13305,8 +13443,8 @@ }, { "root": "testo", - "rootVersion": "v0.1.4", - "rootReference": "dead543cd518323bf94aa1c7df69b947c71a40e9", + "rootVersion": "v0.3.1", + "rootReference": "cb5eae3591ccf730503566f237679fb63a07a677", "class": "Rasuvaeff\\Understudy\\Testo\\UnderstudyInterceptor", "kind": "class", "isApi": true, @@ -13373,13 +13511,13 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-testo/blob/dead543cd518323bf94aa1c7df69b947c71a40e9/src/Testo/UnderstudyInterceptor.php#L51", + "sourceUrl": "https://github.com/rasuvaeff/understudy-testo/blob/cb5eae3591ccf730503566f237679fb63a07a677/src/Testo/UnderstudyInterceptor.php#L51", "implementedBy": [] }, { "root": "testo", - "rootVersion": "v0.1.4", - "rootReference": "dead543cd518323bf94aa1c7df69b947c71a40e9", + "rootVersion": "v0.3.1", + "rootReference": "cb5eae3591ccf730503566f237679fb63a07a677", "class": "Rasuvaeff\\Understudy\\Testo\\UnderstudyPlugin", "kind": "class", "isApi": true, @@ -13436,12 +13574,12 @@ ], "constants": [], "enumCases": [], - "sourceUrl": "https://github.com/rasuvaeff/understudy-testo/blob/dead543cd518323bf94aa1c7df69b947c71a40e9/src/Testo/UnderstudyPlugin.php#L29", + "sourceUrl": "https://github.com/rasuvaeff/understudy-testo/blob/cb5eae3591ccf730503566f237679fb63a07a677/src/Testo/UnderstudyPlugin.php#L29", "implementedBy": [] }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Understudy", "kind": "class", @@ -14138,7 +14276,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\VerificationFailure", "kind": "class", @@ -14245,7 +14383,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\WhenBuilder", "kind": "class", @@ -14399,7 +14537,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "class": "Rasuvaeff\\Understudy\\Wiring\\Wire", "kind": "class", @@ -14464,7 +14602,7 @@ "functions": [ { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "kind": "function", "function": "Rasuvaeff\\Understudy\\expect", @@ -14488,7 +14626,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "kind": "function", "function": "Rasuvaeff\\Understudy\\expectSequence", @@ -14512,7 +14650,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "kind": "function", "function": "Rasuvaeff\\Understudy\\verify", @@ -14564,7 +14702,7 @@ }, { "root": "core", - "rootVersion": "v0.8.0", + "rootVersion": "v0.9.0", "rootReference": null, "kind": "function", "function": "Rasuvaeff\\Understudy\\when", diff --git a/docs/scripts/generate-api.mjs b/docs/scripts/generate-api.mjs index b491c20..c1c4c03 100644 --- a/docs/scripts/generate-api.mjs +++ b/docs/scripts/generate-api.mjs @@ -207,7 +207,7 @@ const BANNER = '