diff --git a/README.md b/README.md
index d768feb..82c8fb3 100644
--- a/README.md
+++ b/README.md
@@ -3,5 +3,46 @@
## Installation
```
-composer require php-extended-type-system/type-reflection
+composer require extended-type-system/type-reflection
+```
+
+## Usage
+
+```php
+use ExtendedTypeSystem\TypeReflector;
+
+/**
+ * @template-covariant T of non-empty-list
+ */
+final class A
+{
+ /**
+ * @param T $a
+ */
+ public function __construct(
+ public readonly array $a,
+ ) {
+ }
+}
+
+$reflector = new TypeReflector();
+
+// object(ExtendedTypeSystem\Type\TemplateT) {
+// name => string(1) "T"
+// declaredAt => object(ExtendedTypeSystem\Type\AtClass) {
+// class => string(7) "A"
+// }
+// }
+var_dump($reflector->reflectPropertyType(A::class, 'a'));
+
+// array(1) {
+// 0 => object(ExtendedTypeSystem\Template) {
+// name => string(1) "T"
+// constraint => object(ExtendedTypeSystem\Type\NonEmptyListT) {
+// valueType => object(ExtendedTypeSystem\Type\MixedT) {}
+// }
+// variance => enum(ExtendedTypeSystem\Variance::COVARIANT)
+// }
+// }
+var_dump($reflector->reflectClassTemplates(A::class));
```
diff --git a/composer.json b/composer.json
index dfc6415..18a6fa5 100644
--- a/composer.json
+++ b/composer.json
@@ -1,5 +1,5 @@
{
- "name": "php-extended-type-system/type-reflection",
+ "name": "extended-type-system/type-reflection",
"description": "PHP Extended Type System • Type Reflection",
"license": "MIT",
"type": "library",
@@ -11,17 +11,30 @@
],
"require": {
"php": "^8.1",
- "php-extended-type-system/type": "^0.1@dev"
+ "extended-type-system/type": "^0.1@dev",
+ "extended-type-system/type-stringifier": "^0.1@dev",
+ "phpdocumentor/reflection-docblock": "^5.2",
+ "phpdocumentor/type-resolver": "^1.3",
+ "phpstan/phpdoc-parser": "^1.0",
+ "phpyh/lru-memoizer": "^0.2"
},
"require-dev": {
"ergebnis/composer-normalize": "^2.30",
"friendsofphp/php-cs-fixer": "^3.14.4",
+ "phpunit/phpunit": "^9.6.3",
"phpyh/coding-standard": "^2.0.0",
+ "psalm/plugin-phpunit": "^0.18.4",
+ "symfony/finder": "^6.2.5",
"vimeo/psalm": "^5.7.7"
},
"autoload": {
"psr-4": {
- "PHP\\ExtendedTypeSystem\\TypeReflection\\": "src/"
+ "ExtendedTypeSystem\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "ExtendedTypeSystem\\": "tests/"
}
},
"config": {
@@ -33,6 +46,7 @@
"scripts": {
"cleanup": "find var ! -path var ! -path var/.gitignore -exec rm -rf {} +",
"fixcs": "PHP_CS_FIXER_IGNORE_ENV=1 vendor/bin/php-cs-fixer fix -v",
- "psalm": "vendor/bin/psalm --show-info"
+ "psalm": "psalm --show-info",
+ "test": "phpunit"
}
}
diff --git a/composer.lock b/composer.lock
index 3aa26a4..48fd947 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,27 +4,27 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "6f5ed36fafb7f61875ad5809aa40b2cf",
+ "content-hash": "ed7fcf3f04d347cbb1c88c873b8b8e8e",
"packages": [
{
- "name": "php-extended-type-system/type",
+ "name": "extended-type-system/type",
"version": "0.1.x-dev",
"source": {
"type": "git",
"url": "https://github.com/php-extended-type-system/type.git",
- "reference": "36dbe7a6e59d96eced6d1762b5318bfe01b80efc"
+ "reference": "82586a0299f7011ab259488d560806236ab646b7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-extended-type-system/type/zipball/36dbe7a6e59d96eced6d1762b5318bfe01b80efc",
- "reference": "36dbe7a6e59d96eced6d1762b5318bfe01b80efc",
+ "url": "https://api.github.com/repos/php-extended-type-system/type/zipball/82586a0299f7011ab259488d560806236ab646b7",
+ "reference": "82586a0299f7011ab259488d560806236ab646b7",
"shasum": ""
},
"require": {
"php": "^8.1"
},
"require-dev": {
- "ergebnis/composer-normalize": "^2.30",
+ "ergebnis/composer-normalize": "^2.30.2",
"friendsofphp/php-cs-fixer": "^3.14.4",
"phpyh/coding-standard": "^2.0.0",
"vimeo/psalm": "^5.7.7"
@@ -33,7 +33,7 @@
"type": "library",
"autoload": {
"psr-4": {
- "PHP\\ExtendedTypeSystem\\Type\\": "src/"
+ "ExtendedTypeSystem\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -51,49 +51,39 @@
"issues": "https://github.com/php-extended-type-system/type/issues",
"source": "https://github.com/php-extended-type-system/type/tree/0.1.x"
},
- "time": "2023-02-26T23:35:40+00:00"
- }
- ],
- "packages-dev": [
+ "time": "2023-03-01T10:37:38+00:00"
+ },
{
- "name": "amphp/amp",
- "version": "v2.6.2",
+ "name": "extended-type-system/type-stringifier",
+ "version": "0.1.x-dev",
"source": {
"type": "git",
- "url": "https://github.com/amphp/amp.git",
- "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb"
+ "url": "https://github.com/php-extended-type-system/type-stringifier.git",
+ "reference": "9042e0c0369770533afd0cc68f96bc431676e182"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb",
- "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb",
+ "url": "https://api.github.com/repos/php-extended-type-system/type-stringifier/zipball/9042e0c0369770533afd0cc68f96bc431676e182",
+ "reference": "9042e0c0369770533afd0cc68f96bc431676e182",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "extended-type-system/type": "^0.1@dev",
+ "php": "^8.1"
},
"require-dev": {
- "amphp/php-cs-fixer-config": "dev-master",
- "amphp/phpunit-util": "^1",
- "ext-json": "*",
- "jetbrains/phpstorm-stubs": "^2019.3",
- "phpunit/phpunit": "^7 | ^8 | ^9",
- "psalm/phar": "^3.11@dev",
- "react/promise": "^2"
+ "ergebnis/composer-normalize": "^2.30.2",
+ "friendsofphp/php-cs-fixer": "^3.14.4",
+ "phpunit/phpunit": "^9.6.4",
+ "phpyh/coding-standard": "^2.0.0",
+ "psalm/plugin-phpunit": "^0.18.4",
+ "vimeo/psalm": "^5.7.7"
},
+ "default-branch": true,
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.x-dev"
- }
- },
"autoload": {
- "files": [
- "lib/functions.php",
- "lib/Internal/functions.php"
- ],
"psr-4": {
- "Amp\\": "lib"
+ "ExtendedTypeSystem\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -102,86 +92,43 @@
],
"authors": [
{
- "name": "Daniel Lowrey",
- "email": "rdlowrey@php.net"
- },
- {
- "name": "Aaron Piotrowski",
- "email": "aaron@trowski.com"
- },
- {
- "name": "Bob Weinand",
- "email": "bobwei9@hotmail.com"
- },
- {
- "name": "Niklas Keller",
- "email": "me@kelunik.com"
+ "name": "Valentin Udaltsov",
+ "email": "udaltsov.valentin@gmail.com"
}
],
- "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"
- ],
+ "description": "PHP Extended Type System • Type Stringifier",
"support": {
- "irc": "irc://irc.freenode.org/amphp",
- "issues": "https://github.com/amphp/amp/issues",
- "source": "https://github.com/amphp/amp/tree/v2.6.2"
+ "issues": "https://github.com/php-extended-type-system/type-stringifier/issues",
+ "source": "https://github.com/php-extended-type-system/type-stringifier/tree/0.1.x"
},
- "funding": [
- {
- "url": "https://github.com/amphp",
- "type": "github"
- }
- ],
- "time": "2022-02-20T17:52:18+00:00"
+ "time": "2023-03-01T10:38:37+00:00"
},
{
- "name": "amphp/byte-stream",
- "version": "v1.8.1",
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
"source": {
"type": "git",
- "url": "https://github.com/amphp/byte-stream.git",
- "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd"
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd",
- "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
"shasum": ""
},
"require": {
- "amphp/amp": "^2",
- "php": ">=7.1"
- },
- "require-dev": {
- "amphp/php-cs-fixer-config": "dev-master",
- "amphp/phpunit-util": "^1.4",
- "friendsofphp/php-cs-fixer": "^2.3",
- "jetbrains/phpstorm-stubs": "^2019.3",
- "phpunit/phpunit": "^6 || ^7 || ^8",
- "psalm/phar": "^3.11.4"
+ "php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.x-dev"
+ "dev-2.x": "2.x-dev"
}
},
"autoload": {
- "files": [
- "lib/functions.php"
- ],
"psr-4": {
- "Amp\\ByteStream\\": "lib"
+ "phpDocumentor\\Reflection\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -190,73 +137,59 @@
],
"authors": [
{
- "name": "Aaron Piotrowski",
- "email": "aaron@trowski.com"
- },
- {
- "name": "Niklas Keller",
- "email": "me@kelunik.com"
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
}
],
- "description": "A stream abstraction to make working with non-blocking I/O simple.",
- "homepage": "http://amphp.org/byte-stream",
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
"keywords": [
- "amp",
- "amphp",
- "async",
- "io",
- "non-blocking",
- "stream"
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
],
"support": {
- "irc": "irc://irc.freenode.org/amphp",
- "issues": "https://github.com/amphp/byte-stream/issues",
- "source": "https://github.com/amphp/byte-stream/tree/v1.8.1"
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
},
- "funding": [
- {
- "url": "https://github.com/amphp",
- "type": "github"
- }
- ],
- "time": "2021-03-30T17:13:30+00:00"
+ "time": "2020-06-27T09:03:43+00:00"
},
{
- "name": "composer/package-versions-deprecated",
- "version": "1.11.99.5",
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.3.0",
"source": {
"type": "git",
- "url": "https://github.com/composer/package-versions-deprecated.git",
- "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d"
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d",
- "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
+ "reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
"shasum": ""
},
"require": {
- "composer-plugin-api": "^1.1.0 || ^2.0",
- "php": "^7 || ^8"
- },
- "replace": {
- "ocramius/package-versions": "1.11.99"
+ "ext-filter": "*",
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.3",
+ "webmozart/assert": "^1.9.1"
},
"require-dev": {
- "composer/composer": "^1.9.3 || ^2.0@dev",
- "ext-zip": "^1.13",
- "phpunit/phpunit": "^6.5 || ^7"
+ "mockery/mockery": "~1.3.2",
+ "psalm/phar": "^4.8"
},
- "type": "composer-plugin",
+ "type": "library",
"extra": {
- "class": "PackageVersions\\Installer",
"branch-alias": {
- "dev-master": "1.x-dev"
+ "dev-master": "5.x-dev"
}
},
"autoload": {
"psr-4": {
- "PackageVersions\\": "src/PackageVersions"
+ "phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -265,66 +198,57 @@
],
"authors": [
{
- "name": "Marco Pivetta",
- "email": "ocramius@gmail.com"
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
},
{
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be"
+ "name": "Jaap van Otterdijk",
+ "email": "account@ijaap.nl"
}
],
- "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
+ "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/composer/package-versions-deprecated/issues",
- "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5"
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
},
- "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": "2022-01-17T14:14:24+00:00"
+ "time": "2021-10-19T17:43:47+00:00"
},
{
- "name": "composer/pcre",
- "version": "3.1.0",
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.6.2",
"source": {
"type": "git",
- "url": "https://github.com/composer/pcre.git",
- "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2"
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2",
- "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d",
+ "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d",
"shasum": ""
},
"require": {
- "php": "^7.4 || ^8.0"
+ "php": "^7.4 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0"
},
"require-dev": {
- "phpstan/phpstan": "^1.3",
- "phpstan/phpstan-strict-rules": "^1.1",
- "symfony/phpunit-bridge": "^5"
+ "ext-tokenizer": "*",
+ "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-main": "3.x-dev"
+ "dev-1.x": "1.x-dev"
}
},
"autoload": {
"psr-4": {
- "Composer\\Pcre\\": "src"
+ "phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -333,487 +257,2379 @@
],
"authors": [
{
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
}
],
- "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
- "keywords": [
- "PCRE",
- "preg",
- "regex",
- "regular expression"
- ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
"support": {
- "issues": "https://github.com/composer/pcre/issues",
- "source": "https://github.com/composer/pcre/tree/3.1.0"
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2"
},
- "funding": [
- {
- "url": "https://packagist.com",
- "type": "custom"
- },
- {
- "url": "https://github.com/composer",
+ "time": "2022-10-14T12:47:21+00:00"
+ },
+ {
+ "name": "phpstan/phpdoc-parser",
+ "version": "1.16.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpdoc-parser.git",
+ "reference": "e27e92d939e2e3636f0a1f0afaba59692c0bf571"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/e27e92d939e2e3636f0a1f0afaba59692c0bf571",
+ "reference": "e27e92d939e2e3636f0a1f0afaba59692c0bf571",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^1.5",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpstan/phpstan-strict-rules": "^1.0",
+ "phpunit/phpunit": "^9.5",
+ "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/1.16.1"
+ },
+ "time": "2023-02-07T18:11:17+00:00"
+ },
+ {
+ "name": "phpyh/lru-memoizer",
+ "version": "0.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpyh/lru-memoizer.git",
+ "reference": "f15a81cd731f8b3d72137ca527683daecba2663e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpyh/lru-memoizer/zipball/f15a81cd731f8b3d72137ca527683daecba2663e",
+ "reference": "f15a81cd731f8b3d72137ca527683daecba2663e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.14.3",
+ "phpunit/phpunit": "^10.0",
+ "phpyh/coding-standard": "^1.0",
+ "vimeo/psalm": "^5.6"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPyh\\LRUMemoizer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Valentin Udaltsov",
+ "email": "udaltsov.valentin@gmail.com"
+ }
+ ],
+ "description": "PHPyh LRU Memoizer",
+ "support": {
+ "issues": "https://github.com/phpyh/lru-memoizer/issues",
+ "source": "https://github.com/phpyh/lru-memoizer/tree/0.2.0"
+ },
+ "time": "2023-02-25T04:45:09+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<4.6.1 || 4.6.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5.13"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@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/1.11.0"
+ },
+ "time": "2022-06-03T18:03:27+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "amphp/amp",
+ "version": "v2.6.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/amp.git",
+ "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb",
+ "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "dev-master",
+ "amphp/phpunit-util": "^1",
+ "ext-json": "*",
+ "jetbrains/phpstorm-stubs": "^2019.3",
+ "phpunit/phpunit": "^7 | ^8 | ^9",
+ "psalm/phar": "^3.11@dev",
+ "react/promise": "^2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "lib/functions.php",
+ "lib/Internal/functions.php"
+ ],
+ "psr-4": {
+ "Amp\\": "lib"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Daniel Lowrey",
+ "email": "rdlowrey@php.net"
+ },
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Bob Weinand",
+ "email": "bobwei9@hotmail.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "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": {
+ "irc": "irc://irc.freenode.org/amphp",
+ "issues": "https://github.com/amphp/amp/issues",
+ "source": "https://github.com/amphp/amp/tree/v2.6.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2022-02-20T17:52:18+00:00"
+ },
+ {
+ "name": "amphp/byte-stream",
+ "version": "v1.8.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/byte-stream.git",
+ "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd",
+ "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^2",
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "dev-master",
+ "amphp/phpunit-util": "^1.4",
+ "friendsofphp/php-cs-fixer": "^2.3",
+ "jetbrains/phpstorm-stubs": "^2019.3",
+ "phpunit/phpunit": "^6 || ^7 || ^8",
+ "psalm/phar": "^3.11.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "lib/functions.php"
+ ],
+ "psr-4": {
+ "Amp\\ByteStream\\": "lib"
+ }
+ },
+ "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": "http://amphp.org/byte-stream",
+ "keywords": [
+ "amp",
+ "amphp",
+ "async",
+ "io",
+ "non-blocking",
+ "stream"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/amphp",
+ "issues": "https://github.com/amphp/byte-stream/issues",
+ "source": "https://github.com/amphp/byte-stream/tree/v1.8.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2021-03-30T17:13:30+00:00"
+ },
+ {
+ "name": "composer/package-versions-deprecated",
+ "version": "1.11.99.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/package-versions-deprecated.git",
+ "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d",
+ "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.1.0 || ^2.0",
+ "php": "^7 || ^8"
+ },
+ "replace": {
+ "ocramius/package-versions": "1.11.99"
+ },
+ "require-dev": {
+ "composer/composer": "^1.9.3 || ^2.0@dev",
+ "ext-zip": "^1.13",
+ "phpunit/phpunit": "^6.5 || ^7"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "PackageVersions\\Installer",
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PackageVersions\\": "src/PackageVersions"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be"
+ }
+ ],
+ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
+ "support": {
+ "issues": "https://github.com/composer/package-versions-deprecated/issues",
+ "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.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": "2022-01-17T14:14:24+00:00"
+ },
+ {
+ "name": "composer/pcre",
+ "version": "3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/pcre.git",
+ "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2",
+ "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.3",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "symfony/phpunit-bridge": "^5"
+ },
+ "type": "library",
+ "extra": {
+ "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.1.0"
+ },
+ "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": "2022-11-17T09:50:14+00:00"
+ },
+ {
+ "name": "composer/semver",
+ "version": "3.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9",
+ "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.4",
+ "symfony/phpunit-bridge": "^4.2 || ^5"
+ },
+ "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": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/semver/issues",
+ "source": "https://github.com/composer/semver/tree/3.3.2"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-04-01T19:23:25+00:00"
+ },
+ {
+ "name": "composer/xdebug-handler",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/xdebug-handler.git",
+ "reference": "ced299686f41dce890debac69273b47ffe98a40c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c",
+ "reference": "ced299686f41dce890debac69273b47ffe98a40c",
+ "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",
+ "symfony/phpunit-bridge": "^6.0"
+ },
+ "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": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/xdebug-handler/issues",
+ "source": "https://github.com/composer/xdebug-handler/tree/3.0.3"
+ },
+ "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": "2022-02-25T21:32:43+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/annotations",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/annotations.git",
+ "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f",
+ "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "^2 || ^3",
+ "ext-tokenizer": "*",
+ "php": "^7.2 || ^8.0",
+ "psr/cache": "^1 || ^2 || ^3"
+ },
+ "require-dev": {
+ "doctrine/cache": "^2.0",
+ "doctrine/coding-standard": "^10",
+ "phpstan/phpstan": "^1.8.0",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "symfony/cache": "^5.4 || ^6",
+ "vimeo/psalm": "^4.10"
+ },
+ "suggest": {
+ "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Docblock Annotations Parser",
+ "homepage": "https://www.doctrine-project.org/projects/annotations.html",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "parser"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/annotations/issues",
+ "source": "https://github.com/doctrine/annotations/tree/2.0.1"
+ },
+ "time": "2023-02-02T22:02:53+00:00"
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^11",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/phpstan": "^1.9.4",
+ "phpstan/phpstan-phpunit": "^1.3",
+ "phpunit/phpunit": "^9.5.27",
+ "vimeo/psalm": "^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-30T00:23:10+00:00"
+ },
+ {
+ "name": "doctrine/lexer",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "84a527db05647743d50373e0ec53a152f2cde568"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568",
+ "reference": "84a527db05647743d50373e0ec53a152f2cde568",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^10",
+ "phpstan/phpstan": "^1.9",
+ "phpunit/phpunit": "^9.5",
+ "psalm/plugin-phpunit": "^0.18.3",
+ "vimeo/psalm": "^5.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Lexer\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "lexer",
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/lexer/issues",
+ "source": "https://github.com/doctrine/lexer/tree/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-15T16:57:16+00:00"
+ },
+ {
+ "name": "ergebnis/composer-normalize",
+ "version": "2.30.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ergebnis/composer-normalize.git",
+ "reference": "54d58f7dc5517ae183ac2c06f1dcbd616876673c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/54d58f7dc5517ae183ac2c06f1dcbd616876673c",
+ "reference": "54d58f7dc5517ae183ac2c06f1dcbd616876673c",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^2.0.0",
+ "ergebnis/json": "^1.0.1",
+ "ergebnis/json-normalizer": "^4.0.2",
+ "ergebnis/json-printer": "^3.3.0",
+ "ext-json": "*",
+ "justinrainbow/json-schema": "^5.2.12",
+ "localheinz/diff": "^1.1.1",
+ "php": "~8.0.0 || ~8.1.0 || ~8.2.0"
+ },
+ "require-dev": {
+ "composer/composer": "^2.5.1",
+ "ergebnis/license": "^2.1.0",
+ "ergebnis/php-cs-fixer-config": "^5.3.1",
+ "fakerphp/faker": "^1.21.0",
+ "infection/infection": "~0.26.19",
+ "phpunit/phpunit": "^9.6.3",
+ "psalm/plugin-phpunit": "~0.18.4",
+ "rector/rector": "~0.15.18",
+ "symfony/filesystem": "^6.0.13",
+ "vimeo/psalm": "^5.7.7"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Ergebnis\\Composer\\Normalize\\NormalizePlugin",
+ "composer-normalize": {
+ "indent-size": 2,
+ "indent-style": "space"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ergebnis\\Composer\\Normalize\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Andreas Möller",
+ "email": "am@localheinz.com"
+ }
+ ],
+ "description": "Provides a composer plugin for normalizing composer.json.",
+ "homepage": "https://github.com/ergebnis/composer-normalize",
+ "keywords": [
+ "composer",
+ "normalize",
+ "normalizer",
+ "plugin"
+ ],
+ "support": {
+ "issues": "https://github.com/ergebnis/composer-normalize/issues",
+ "source": "https://github.com/ergebnis/composer-normalize"
+ },
+ "time": "2023-02-27T17:23:42+00:00"
+ },
+ {
+ "name": "ergebnis/json",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ergebnis/json.git",
+ "reference": "d66ea30060856d0729a4aa319a02752519ca63a0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ergebnis/json/zipball/d66ea30060856d0729a4aa319a02752519ca63a0",
+ "reference": "d66ea30060856d0729a4aa319a02752519ca63a0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.0"
+ },
+ "require-dev": {
+ "ergebnis/composer-normalize": "^2.29.0",
+ "ergebnis/data-provider": "^1.2.0",
+ "ergebnis/license": "^2.1.0",
+ "ergebnis/php-cs-fixer-config": "^5.0.0",
+ "ergebnis/phpstan-rules": "^1.0.0",
+ "fakerphp/faker": "^1.20.0",
+ "infection/infection": "~0.26.16",
+ "phpunit/phpunit": "^9.5.27",
+ "psalm/plugin-phpunit": "~0.18.4",
+ "vimeo/psalm": "^5.1.0"
+ },
+ "type": "library",
+ "extra": {
+ "composer-normalize": {
+ "indent-size": 2,
+ "indent-style": "space"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ergebnis\\Json\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Andreas Möller",
+ "email": "am@localheinz.com"
+ }
+ ],
+ "description": "Provides a Json value object for representing a valid JSON string.",
+ "homepage": "https://github.com/ergebnis/json",
+ "keywords": [
+ "json"
+ ],
+ "support": {
+ "issues": "https://github.com/ergebnis/json/issues",
+ "source": "https://github.com/ergebnis/json"
+ },
+ "time": "2022-12-10T22:38:50+00:00"
+ },
+ {
+ "name": "ergebnis/json-normalizer",
+ "version": "4.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ergebnis/json-normalizer.git",
+ "reference": "15df99fbf454da13b31008795a7397d3d7d73bb4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/15df99fbf454da13b31008795a7397d3d7d73bb4",
+ "reference": "15df99fbf454da13b31008795a7397d3d7d73bb4",
+ "shasum": ""
+ },
+ "require": {
+ "ergebnis/json": "^1.0.1",
+ "ergebnis/json-pointer": "^3.2.0",
+ "ergebnis/json-printer": "^3.3.0",
+ "ergebnis/json-schema-validator": "^4.0.0",
+ "ext-json": "*",
+ "justinrainbow/json-schema": "^5.2.12",
+ "php": "~8.0.0 || ~8.1.0 || ~8.2.0"
+ },
+ "require-dev": {
+ "composer/semver": "^3.2.1",
+ "ergebnis/data-provider": "^1.3.0",
+ "ergebnis/license": "^2.1.0",
+ "ergebnis/php-cs-fixer-config": "^5.3.1",
+ "fakerphp/faker": "^1.21.0",
+ "infection/infection": "~0.26.19",
+ "phpunit/phpunit": "^9.6.3",
+ "psalm/plugin-phpunit": "~0.18.4",
+ "rector/rector": "~0.15.18",
+ "symfony/filesystem": "^6.0.19",
+ "symfony/finder": "^6.0.19",
+ "vimeo/psalm": "^5.7.7"
+ },
+ "suggest": {
+ "composer/semver": "If you want to use ComposerJsonNormalizer or VersionConstraintNormalizer"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Ergebnis\\Json\\Normalizer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Andreas Möller",
+ "email": "am@localheinz.com"
+ }
+ ],
+ "description": "Provides generic and vendor-specific normalizers for normalizing JSON documents.",
+ "homepage": "https://github.com/ergebnis/json-normalizer",
+ "keywords": [
+ "json",
+ "normalizer"
+ ],
+ "support": {
+ "issues": "https://github.com/ergebnis/json-normalizer/issues",
+ "source": "https://github.com/ergebnis/json-normalizer"
+ },
+ "time": "2023-02-27T17:17:30+00:00"
+ },
+ {
+ "name": "ergebnis/json-pointer",
+ "version": "3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ergebnis/json-pointer.git",
+ "reference": "861516ff5afa1aa8905fdf3361315909523a1bf8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/861516ff5afa1aa8905fdf3361315909523a1bf8",
+ "reference": "861516ff5afa1aa8905fdf3361315909523a1bf8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.0"
+ },
+ "require-dev": {
+ "ergebnis/composer-normalize": "^2.28.3",
+ "ergebnis/data-provider": "^1.2.0",
+ "ergebnis/license": "^2.1.0",
+ "ergebnis/php-cs-fixer-config": "^5.0.0",
+ "fakerphp/faker": "^1.20.0",
+ "infection/infection": "~0.26.16",
+ "phpunit/phpunit": "^9.5.26",
+ "psalm/plugin-phpunit": "~0.18.3",
+ "vimeo/psalm": "^4.30"
+ },
+ "type": "library",
+ "extra": {
+ "composer-normalize": {
+ "indent-size": 2,
+ "indent-style": "space"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ergebnis\\Json\\Pointer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Andreas Möller",
+ "email": "am@localheinz.com"
+ }
+ ],
+ "description": "Provides JSON pointer as a value object.",
+ "homepage": "https://github.com/ergebnis/json-pointer",
+ "keywords": [
+ "RFC6901",
+ "json",
+ "pointer"
+ ],
+ "support": {
+ "issues": "https://github.com/ergebnis/json-pointer/issues",
+ "source": "https://github.com/ergebnis/json-pointer"
+ },
+ "time": "2022-11-28T17:03:31+00:00"
+ },
+ {
+ "name": "ergebnis/json-printer",
+ "version": "3.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ergebnis/json-printer.git",
+ "reference": "18920367473b099633f644f0ca6dc8794345148f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/18920367473b099633f644f0ca6dc8794345148f",
+ "reference": "18920367473b099633f644f0ca6dc8794345148f",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "php": "^8.0"
+ },
+ "require-dev": {
+ "ergebnis/license": "^2.0.0",
+ "ergebnis/php-cs-fixer-config": "^4.11.0",
+ "fakerphp/faker": "^1.20.0",
+ "infection/infection": "~0.26.6",
+ "phpunit/phpunit": "^9.5.26",
+ "psalm/plugin-phpunit": "~0.18.3",
+ "vimeo/psalm": "^4.30.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Ergebnis\\Json\\Printer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Andreas Möller",
+ "email": "am@localheinz.com"
+ }
+ ],
+ "description": "Provides a JSON printer, allowing for flexible indentation.",
+ "homepage": "https://github.com/ergebnis/json-printer",
+ "keywords": [
+ "formatter",
+ "json",
+ "printer"
+ ],
+ "support": {
+ "issues": "https://github.com/ergebnis/json-printer/issues",
+ "source": "https://github.com/ergebnis/json-printer"
+ },
+ "time": "2022-11-28T10:27:43+00:00"
+ },
+ {
+ "name": "ergebnis/json-schema-validator",
+ "version": "4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ergebnis/json-schema-validator.git",
+ "reference": "a6166272ac5691a9bc791f185841e5f92a6d4723"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/a6166272ac5691a9bc791f185841e5f92a6d4723",
+ "reference": "a6166272ac5691a9bc791f185841e5f92a6d4723",
+ "shasum": ""
+ },
+ "require": {
+ "ergebnis/json": "^1.0.0",
+ "ergebnis/json-pointer": "^3.2.0",
+ "ext-json": "*",
+ "justinrainbow/json-schema": "^5.2.12",
+ "php": "^8.0"
+ },
+ "require-dev": {
+ "ergebnis/composer-normalize": "^2.21.0",
+ "ergebnis/data-provider": "^1.2.0",
+ "ergebnis/license": "^2.1.0",
+ "ergebnis/php-cs-fixer-config": "~5.0.0",
+ "fakerphp/faker": "^1.20.0",
+ "infection/infection": "~0.26.16",
+ "phpunit/phpunit": "~9.5.27",
+ "psalm/plugin-phpunit": "~0.18.4",
+ "vimeo/psalm": "^5.1.0"
+ },
+ "type": "library",
+ "extra": {
+ "composer-normalize": {
+ "indent-size": 2,
+ "indent-style": "space"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ergebnis\\Json\\SchemaValidator\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Andreas Möller",
+ "email": "am@localheinz.com"
+ }
+ ],
+ "description": "Provides a JSON schema validator, building on top of justinrainbow/json-schema.",
+ "homepage": "https://github.com/ergebnis/json-schema-validator",
+ "keywords": [
+ "json",
+ "schema",
+ "validator"
+ ],
+ "support": {
+ "issues": "https://github.com/ergebnis/json-schema-validator/issues",
+ "source": "https://github.com/ergebnis/json-schema-validator"
+ },
+ "time": "2022-12-10T14:50:15+00:00"
+ },
+ {
+ "name": "felixfbecker/advanced-json-rpc",
+ "version": "v3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git",
+ "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447",
+ "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447",
+ "shasum": ""
+ },
+ "require": {
+ "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
+ "php": "^7.1 || ^8.0",
+ "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.0 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "AdvancedJsonRpc\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "ISC"
+ ],
+ "authors": [
+ {
+ "name": "Felix Becker",
+ "email": "felix.b@outlook.com"
+ }
+ ],
+ "description": "A more advanced JSONRPC implementation",
+ "support": {
+ "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues",
+ "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1"
+ },
+ "time": "2021-06-11T22:34:44+00:00"
+ },
+ {
+ "name": "felixfbecker/language-server-protocol",
+ "version": "v1.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/felixfbecker/php-language-server-protocol.git",
+ "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842",
+ "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842",
+ "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.2"
+ },
+ "time": "2022-03-02T22:36:06+00:00"
+ },
+ {
+ "name": "fidry/cpu-core-counter",
+ "version": "0.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theofidry/cpu-core-counter.git",
+ "reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/b58e5a3933e541dc286cc91fc4f3898bbc6f1623",
+ "reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "fidry/makefile": "^0.2.0",
+ "phpstan/extension-installer": "^1.2.0",
+ "phpstan/phpstan": "^1.9.2",
+ "phpstan/phpstan-deprecation-rules": "^1.0.0",
+ "phpstan/phpstan-phpunit": "^1.2.2",
+ "phpstan/phpstan-strict-rules": "^1.4.4",
+ "phpunit/phpunit": "^9.5.26 || ^8.5.31",
+ "theofidry/php-cs-fixer-config": "^1.0",
+ "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/0.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theofidry",
+ "type": "github"
+ }
+ ],
+ "time": "2022-12-24T12:35:10+00:00"
+ },
+ {
+ "name": "friendsofphp/php-cs-fixer",
+ "version": "v3.14.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
+ "reference": "1b3d9dba63d93b8a202c31e824748218781eae6b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/1b3d9dba63d93b8a202c31e824748218781eae6b",
+ "reference": "1b3d9dba63d93b8a202c31e824748218781eae6b",
+ "shasum": ""
+ },
+ "require": {
+ "composer/semver": "^3.3",
+ "composer/xdebug-handler": "^3.0.3",
+ "doctrine/annotations": "^2",
+ "doctrine/lexer": "^2 || ^3",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": "^7.4 || ^8.0",
+ "sebastian/diff": "^4.0 || ^5.0",
+ "symfony/console": "^5.4 || ^6.0",
+ "symfony/event-dispatcher": "^5.4 || ^6.0",
+ "symfony/filesystem": "^5.4 || ^6.0",
+ "symfony/finder": "^5.4 || ^6.0",
+ "symfony/options-resolver": "^5.4 || ^6.0",
+ "symfony/polyfill-mbstring": "^1.27",
+ "symfony/polyfill-php80": "^1.27",
+ "symfony/polyfill-php81": "^1.27",
+ "symfony/process": "^5.4 || ^6.0",
+ "symfony/stopwatch": "^5.4 || ^6.0"
+ },
+ "require-dev": {
+ "justinrainbow/json-schema": "^5.2",
+ "keradus/cli-executor": "^2.0",
+ "mikey179/vfsstream": "^1.6.11",
+ "php-coveralls/php-coveralls": "^2.5.3",
+ "php-cs-fixer/accessible-object": "^1.1",
+ "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2",
+ "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1",
+ "phpspec/prophecy": "^1.16",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpunit/phpunit": "^9.5",
+ "phpunitgoodpractices/polyfill": "^1.6",
+ "phpunitgoodpractices/traits": "^1.9.2",
+ "symfony/phpunit-bridge": "^6.2.3",
+ "symfony/yaml": "^5.4 || ^6.0"
+ },
+ "suggest": {
+ "ext-dom": "For handling output formats in XML",
+ "ext-mbstring": "For handling non-UTF8 characters."
+ },
+ "bin": [
+ "php-cs-fixer"
+ ],
+ "type": "application",
+ "autoload": {
+ "psr-4": {
+ "PhpCsFixer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Dariusz Rumiński",
+ "email": "dariusz.ruminski@gmail.com"
+ }
+ ],
+ "description": "A tool to automatically fix PHP code style",
+ "support": {
+ "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
+ "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.14.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/keradus",
"type": "github"
+ }
+ ],
+ "time": "2023-02-09T21:49:13+00:00"
+ },
+ {
+ "name": "justinrainbow/json-schema",
+ "version": "5.2.12",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/justinrainbow/json-schema.git",
+ "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60",
+ "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
+ "json-schema/json-schema-test-suite": "1.2.0",
+ "phpunit/phpunit": "^4.8.35"
+ },
+ "bin": [
+ "bin/validate-json"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "JsonSchema\\": "src/JsonSchema/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bruno Prieto Reis",
+ "email": "bruno.p.reis@gmail.com"
+ },
+ {
+ "name": "Justin Rainbow",
+ "email": "justin.rainbow@gmail.com"
+ },
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
+ },
+ {
+ "name": "Robert Schönthal",
+ "email": "seroscho@googlemail.com"
+ }
+ ],
+ "description": "A library to validate a json schema.",
+ "homepage": "https://github.com/justinrainbow/json-schema",
+ "keywords": [
+ "json",
+ "schema"
+ ],
+ "support": {
+ "issues": "https://github.com/justinrainbow/json-schema/issues",
+ "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12"
+ },
+ "time": "2022-04-13T08:02:27+00:00"
+ },
+ {
+ "name": "localheinz/diff",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/localheinz/diff.git",
+ "reference": "851bb20ea8358c86f677f5f111c4ab031b1c764c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/localheinz/diff/zipball/851bb20ea8358c86f677f5f111c4ab031b1c764c",
+ "reference": "851bb20ea8358c86f677f5f111c4ab031b1c764c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.5 || ^8.0",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
},
{
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
- "type": "tidelift"
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Fork of sebastian/diff for use with ergebnis/composer-normalize",
+ "homepage": "https://github.com/localheinz/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "source": "https://github.com/localheinz/diff/tree/main"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-07-06T04:49:32+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
+ "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^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",
+ "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.11.0"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-03-03T13:19:32+00:00"
+ },
+ {
+ "name": "netresearch/jsonmapper",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cweiske/jsonmapper.git",
+ "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/cfa81ea1d35294d64adb9c68aa4cb9e92400e53f",
+ "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-pcre": "*",
+ "ext-reflection": "*",
+ "ext-spl": "*",
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~7.5 || ~8.0 || ~9.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"
}
],
- "time": "2022-11-17T09:50:14+00:00"
+ "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/v4.1.0"
+ },
+ "time": "2022-12-08T20:46:14+00:00"
},
{
- "name": "composer/semver",
- "version": "3.3.2",
+ "name": "nikic/php-parser",
+ "version": "v4.15.3",
"source": {
"type": "git",
- "url": "https://github.com/composer/semver.git",
- "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9"
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9",
- "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039",
+ "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039",
"shasum": ""
},
"require": {
- "php": "^5.3.2 || ^7.0 || ^8.0"
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
},
"require-dev": {
- "phpstan/phpstan": "^1.4",
- "symfony/phpunit-bridge": "^4.2 || ^5"
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
},
+ "bin": [
+ "bin/php-parse"
+ ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.x-dev"
+ "dev-master": "4.9-dev"
}
},
"autoload": {
"psr-4": {
- "Composer\\Semver\\": "src"
+ "PhpParser\\": "lib/PhpParser"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Nils Adermann",
- "email": "naderman@naderman.de",
- "homepage": "http://www.naderman.de"
+ "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/v4.15.3"
+ },
+ "time": "2023-01-16T22:05:37+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
+ "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "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": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
},
{
- "name": "Rob Bast",
- "email": "rob.bast@gmail.com",
- "homepage": "http://robbast.nl"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
}
],
- "description": "Semver library that offers utilities, version constraint parsing and validation.",
- "keywords": [
- "semantic",
- "semver",
- "validation",
- "versioning"
- ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
"support": {
- "irc": "irc://irc.freenode.org/composer",
- "issues": "https://github.com/composer/semver/issues",
- "source": "https://github.com/composer/semver/tree/3.3.2"
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.3"
},
- "funding": [
+ "time": "2021-07-20T11:28:43+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": [
{
- "url": "https://packagist.com",
- "type": "custom"
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
},
{
- "url": "https://github.com/composer",
- "type": "github"
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
},
{
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
- "type": "tidelift"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
}
],
- "time": "2022-04-01T19:23:25+00:00"
+ "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": "composer/xdebug-handler",
- "version": "3.0.3",
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.25",
"source": {
"type": "git",
- "url": "https://github.com/composer/xdebug-handler.git",
- "reference": "ced299686f41dce890debac69273b47ffe98a40c"
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "0e2b40518197a8c0d4b08bc34dfff1c99c508954"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c",
- "reference": "ced299686f41dce890debac69273b47ffe98a40c",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/0e2b40518197a8c0d4b08bc34dfff1c99c508954",
+ "reference": "0e2b40518197a8c0d4b08bc34dfff1c99c508954",
"shasum": ""
},
"require": {
- "composer/pcre": "^1 || ^2 || ^3",
- "php": "^7.2.5 || ^8.0",
- "psr/log": "^1 || ^2 || ^3"
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.15",
+ "php": ">=7.3",
+ "phpunit/php-file-iterator": "^3.0.3",
+ "phpunit/php-text-template": "^2.0.2",
+ "sebastian/code-unit-reverse-lookup": "^2.0.2",
+ "sebastian/complexity": "^2.0",
+ "sebastian/environment": "^5.1.2",
+ "sebastian/lines-of-code": "^1.0.3",
+ "sebastian/version": "^3.0.1",
+ "theseer/tokenizer": "^1.2.0"
},
"require-dev": {
- "phpstan/phpstan": "^1.0",
- "phpstan/phpstan-strict-rules": "^1.1",
- "symfony/phpunit-bridge": "^6.0"
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcov": "*",
+ "ext-xdebug": "*"
},
"type": "library",
- "autoload": {
- "psr-4": {
- "Composer\\XdebugHandler\\": "src"
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.2-dev"
}
},
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "John Stevenson",
- "email": "john-stevenson@blueyonder.co.uk"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Restarts a process without Xdebug.",
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
"keywords": [
- "Xdebug",
- "performance"
+ "coverage",
+ "testing",
+ "xunit"
],
"support": {
- "irc": "irc://irc.freenode.org/composer",
- "issues": "https://github.com/composer/xdebug-handler/issues",
- "source": "https://github.com/composer/xdebug-handler/tree/3.0.3"
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.25"
},
"funding": [
{
- "url": "https://packagist.com",
- "type": "custom"
- },
- {
- "url": "https://github.com/composer",
+ "url": "https://github.com/sebastianbergmann",
"type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
- "type": "tidelift"
}
],
- "time": "2022-02-25T21:32:43+00:00"
+ "time": "2023-02-25T05:32:00+00:00"
},
{
- "name": "dnoegel/php-xdg-base-dir",
- "version": "v0.1.1",
+ "name": "phpunit/php-file-iterator",
+ "version": "3.0.6",
"source": {
"type": "git",
- "url": "https://github.com/dnoegel/php-xdg-base-dir.git",
- "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd"
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "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",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-12-02T12:48:52+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
- "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
"shasum": ""
},
"require": {
- "php": ">=5.3.2"
+ "php": ">=7.3"
},
"require-dev": {
- "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35"
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
},
"type": "library",
- "autoload": {
- "psr-4": {
- "XdgBaseDir\\": "src/"
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
}
},
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "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"
],
- "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"
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
},
- "time": "2019-12-04T15:06:13+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:58:55+00:00"
},
{
- "name": "doctrine/annotations",
- "version": "2.0.1",
+ "name": "phpunit/php-text-template",
+ "version": "2.0.4",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/annotations.git",
- "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f"
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f",
- "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
"shasum": ""
},
"require": {
- "doctrine/lexer": "^2 || ^3",
- "ext-tokenizer": "*",
- "php": "^7.2 || ^8.0",
- "psr/cache": "^1 || ^2 || ^3"
+ "php": ">=7.3"
},
"require-dev": {
- "doctrine/cache": "^2.0",
- "doctrine/coding-standard": "^10",
- "phpstan/phpstan": "^1.8.0",
- "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
- "symfony/cache": "^5.4 || ^6",
- "vimeo/psalm": "^4.10"
- },
- "suggest": {
- "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
- "autoload": {
- "psr-4": {
- "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
}
},
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
- {
- "name": "Roman Borschel",
- "email": "roman@code-factory.org"
- },
- {
- "name": "Benjamin Eberlei",
- "email": "kontakt@beberlei.de"
- },
- {
- "name": "Jonathan Wage",
- "email": "jonwage@gmail.com"
- },
- {
- "name": "Johannes Schmitt",
- "email": "schmittjoh@gmail.com"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Docblock Annotations Parser",
- "homepage": "https://www.doctrine-project.org/projects/annotations.html",
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
"keywords": [
- "annotations",
- "docblock",
- "parser"
+ "template"
],
"support": {
- "issues": "https://github.com/doctrine/annotations/issues",
- "source": "https://github.com/doctrine/annotations/tree/2.0.1"
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
},
- "time": "2023-02-02T22:02:53+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T05:33:50+00:00"
},
{
- "name": "doctrine/lexer",
- "version": "3.0.0",
+ "name": "phpunit/php-timer",
+ "version": "5.0.3",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/lexer.git",
- "reference": "84a527db05647743d50373e0ec53a152f2cde568"
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568",
- "reference": "84a527db05647743d50373e0ec53a152f2cde568",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
"shasum": ""
},
"require": {
- "php": "^8.1"
+ "php": ">=7.3"
},
"require-dev": {
- "doctrine/coding-standard": "^10",
- "phpstan/phpstan": "^1.9",
- "phpunit/phpunit": "^9.5",
- "psalm/plugin-phpunit": "^0.18.3",
- "vimeo/psalm": "^5.0"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
- "autoload": {
- "psr-4": {
- "Doctrine\\Common\\Lexer\\": "src"
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
}
},
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
- {
- "name": "Roman Borschel",
- "email": "roman@code-factory.org"
- },
- {
- "name": "Johannes Schmitt",
- "email": "schmittjoh@gmail.com"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
- "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
"keywords": [
- "annotations",
- "docblock",
- "lexer",
- "parser",
- "php"
+ "timer"
],
"support": {
- "issues": "https://github.com/doctrine/lexer/issues",
- "source": "https://github.com/doctrine/lexer/tree/3.0.0"
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
},
"funding": [
{
- "url": "https://www.doctrine-project.org/sponsorship.html",
- "type": "custom"
- },
- {
- "url": "https://www.patreon.com/phpdoctrine",
- "type": "patreon"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
- "type": "tidelift"
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
}
],
- "time": "2022-12-15T16:57:16+00:00"
+ "time": "2020-10-26T13:16:10+00:00"
},
{
- "name": "ergebnis/composer-normalize",
- "version": "2.30.0",
+ "name": "phpunit/phpunit",
+ "version": "9.6.4",
"source": {
"type": "git",
- "url": "https://github.com/ergebnis/composer-normalize.git",
- "reference": "ea2affd0635564ccabddca0427a26b2f38a545f0"
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "9125ee085b6d95e78277dc07aa1f46f9e0607b8d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/ea2affd0635564ccabddca0427a26b2f38a545f0",
- "reference": "ea2affd0635564ccabddca0427a26b2f38a545f0",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9125ee085b6d95e78277dc07aa1f46f9e0607b8d",
+ "reference": "9125ee085b6d95e78277dc07aa1f46f9e0607b8d",
"shasum": ""
},
"require": {
- "composer-plugin-api": "^2.0.0",
- "ergebnis/json": "^1.0.1",
- "ergebnis/json-normalizer": "~4.0.0",
- "ergebnis/json-printer": "^3.3.0",
+ "doctrine/instantiator": "^1.3.1 || ^2",
+ "ext-dom": "*",
"ext-json": "*",
- "justinrainbow/json-schema": "^5.2.12",
- "localheinz/diff": "^1.1.1",
- "php": "~8.0.0 || ~8.1.0 || ~8.2.0"
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.10.1",
+ "phar-io/manifest": "^2.0.3",
+ "phar-io/version": "^3.0.2",
+ "php": ">=7.3",
+ "phpunit/php-code-coverage": "^9.2.13",
+ "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.3",
+ "phpunit/php-timer": "^5.0.2",
+ "sebastian/cli-parser": "^1.0.1",
+ "sebastian/code-unit": "^1.0.6",
+ "sebastian/comparator": "^4.0.8",
+ "sebastian/diff": "^4.0.3",
+ "sebastian/environment": "^5.1.3",
+ "sebastian/exporter": "^4.0.5",
+ "sebastian/global-state": "^5.0.1",
+ "sebastian/object-enumerator": "^4.0.3",
+ "sebastian/resource-operations": "^3.0.3",
+ "sebastian/type": "^3.2",
+ "sebastian/version": "^3.0.2"
},
- "require-dev": {
- "composer/composer": "^2.5.1",
- "ergebnis/license": "^2.1.0",
- "ergebnis/php-cs-fixer-config": "^5.3.1",
- "fakerphp/faker": "^1.21.0",
- "infection/infection": "~0.26.19",
- "phpunit/phpunit": "^9.6.3",
- "psalm/plugin-phpunit": "~0.18.4",
- "rector/rector": "~0.15.18",
- "symfony/filesystem": "^6.0.13",
- "vimeo/psalm": "^5.7.7"
+ "suggest": {
+ "ext-soap": "*",
+ "ext-xdebug": "*"
},
- "type": "composer-plugin",
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
"extra": {
- "class": "Ergebnis\\Composer\\Normalize\\NormalizePlugin",
- "composer-normalize": {
- "indent-size": 2,
- "indent-style": "space"
+ "branch-alias": {
+ "dev-master": "9.6-dev"
}
},
"autoload": {
- "psr-4": {
- "Ergebnis\\Composer\\Normalize\\": "src/"
- }
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Andreas Möller",
- "email": "am@localheinz.com"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Provides a composer plugin for normalizing composer.json.",
- "homepage": "https://github.com/ergebnis/composer-normalize",
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
"keywords": [
- "composer",
- "normalize",
- "normalizer",
- "plugin"
+ "phpunit",
+ "testing",
+ "xunit"
],
"support": {
- "issues": "https://github.com/ergebnis/composer-normalize/issues",
- "source": "https://github.com/ergebnis/composer-normalize"
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.4"
},
- "time": "2023-02-26T17:34:31+00:00"
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-02-27T13:06:37+00:00"
},
{
- "name": "ergebnis/json",
- "version": "1.0.1",
+ "name": "phpyh/coding-standard",
+ "version": "2.0.0",
"source": {
"type": "git",
- "url": "https://github.com/ergebnis/json.git",
- "reference": "d66ea30060856d0729a4aa319a02752519ca63a0"
+ "url": "https://github.com/phpyh/coding-standard.git",
+ "reference": "243b86ddb6357e944cdcdacbcb9efd2b7894c036"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ergebnis/json/zipball/d66ea30060856d0729a4aa319a02752519ca63a0",
- "reference": "d66ea30060856d0729a4aa319a02752519ca63a0",
+ "url": "https://api.github.com/repos/phpyh/coding-standard/zipball/243b86ddb6357e944cdcdacbcb9efd2b7894c036",
+ "reference": "243b86ddb6357e944cdcdacbcb9efd2b7894c036",
"shasum": ""
},
"require": {
- "php": "^8.0"
+ "friendsofphp/php-cs-fixer": "^3.14.3",
+ "php": "^8.1"
},
"require-dev": {
- "ergebnis/composer-normalize": "^2.29.0",
- "ergebnis/data-provider": "^1.2.0",
- "ergebnis/license": "^2.1.0",
- "ergebnis/php-cs-fixer-config": "^5.0.0",
- "ergebnis/phpstan-rules": "^1.0.0",
- "fakerphp/faker": "^1.20.0",
- "infection/infection": "~0.26.16",
- "phpunit/phpunit": "^9.5.27",
- "psalm/plugin-phpunit": "~0.18.4",
- "vimeo/psalm": "^5.1.0"
+ "vimeo/psalm": "^5.6"
},
"type": "library",
- "extra": {
- "composer-normalize": {
- "indent-size": 2,
- "indent-style": "space"
- }
- },
"autoload": {
"psr-4": {
- "Ergebnis\\Json\\": "src/"
+ "PHPyh\\CodingStandard\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -822,65 +2638,58 @@
],
"authors": [
{
- "name": "Andreas Möller",
- "email": "am@localheinz.com"
+ "name": "Valentin Udaltsov",
+ "email": "udaltsov.valentin@gmail.com"
}
],
- "description": "Provides a Json value object for representing a valid JSON string.",
- "homepage": "https://github.com/ergebnis/json",
- "keywords": [
- "json"
- ],
+ "description": "PHPyh Coding Standard For PHP CS Fixer",
"support": {
- "issues": "https://github.com/ergebnis/json/issues",
- "source": "https://github.com/ergebnis/json"
+ "issues": "https://github.com/phpyh/coding-standard/issues",
+ "source": "https://github.com/phpyh/coding-standard/tree/2.0.0"
},
- "time": "2022-12-10T22:38:50+00:00"
+ "time": "2023-02-25T04:52:27+00:00"
},
{
- "name": "ergebnis/json-normalizer",
- "version": "4.0.0",
+ "name": "psalm/plugin-phpunit",
+ "version": "0.18.4",
"source": {
"type": "git",
- "url": "https://github.com/ergebnis/json-normalizer.git",
- "reference": "250f41057e1e62662c076d9c133fe487760c0c2d"
+ "url": "https://github.com/psalm/psalm-plugin-phpunit.git",
+ "reference": "e4ab3096653d9eb6f6d0ea5f4461898d59ae4dbc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/250f41057e1e62662c076d9c133fe487760c0c2d",
- "reference": "250f41057e1e62662c076d9c133fe487760c0c2d",
+ "url": "https://api.github.com/repos/psalm/psalm-plugin-phpunit/zipball/e4ab3096653d9eb6f6d0ea5f4461898d59ae4dbc",
+ "reference": "e4ab3096653d9eb6f6d0ea5f4461898d59ae4dbc",
"shasum": ""
},
"require": {
- "ergebnis/json": "^1.0.1",
- "ergebnis/json-pointer": "^3.2.0",
- "ergebnis/json-printer": "^3.3.0",
- "ergebnis/json-schema-validator": "^4.0.0",
- "ext-json": "*",
- "justinrainbow/json-schema": "^5.2.12",
- "php": "~8.0.0 || ~8.1.0 || ~8.2.0"
+ "composer/package-versions-deprecated": "^1.10",
+ "composer/semver": "^1.4 || ^2.0 || ^3.0",
+ "ext-simplexml": "*",
+ "php": "^7.1 || ^8.0",
+ "vimeo/psalm": "dev-master || dev-4.x || ^4.7.1 || ^5@beta || ^5.0"
},
- "require-dev": {
- "composer/semver": "^3.2.1",
- "ergebnis/data-provider": "^1.3.0",
- "ergebnis/license": "^2.1.0",
- "ergebnis/php-cs-fixer-config": "^5.3.1",
- "fakerphp/faker": "^1.21.0",
- "infection/infection": "~0.26.19",
- "phpunit/phpunit": "^9.6.3",
- "psalm/plugin-phpunit": "~0.18.4",
- "rector/rector": "~0.15.18",
- "symfony/filesystem": "^6.0.19",
- "symfony/finder": "^6.0.19",
- "vimeo/psalm": "^5.7.7"
+ "conflict": {
+ "phpunit/phpunit": "<7.5"
},
- "suggest": {
- "composer/semver": "If you want to use ComposerJsonNormalizer or VersionConstraintNormalizer"
+ "require-dev": {
+ "codeception/codeception": "^4.0.3",
+ "php": "^7.3 || ^8.0",
+ "phpunit/phpunit": "^7.5 || ^8.0 || ^9.0",
+ "squizlabs/php_codesniffer": "^3.3.1",
+ "weirdan/codeception-psalm-module": "^0.11.0",
+ "weirdan/prophecy-shim": "^1.0 || ^2.0"
+ },
+ "type": "psalm-plugin",
+ "extra": {
+ "psalm": {
+ "pluginClass": "Psalm\\PhpUnitPlugin\\Plugin"
+ }
},
- "type": "library",
"autoload": {
"psr-4": {
- "Ergebnis\\Json\\Normalizer\\": "src/"
+ "Psalm\\PhpUnitPlugin\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -889,60 +2698,43 @@
],
"authors": [
{
- "name": "Andreas Möller",
- "email": "am@localheinz.com"
+ "name": "Matt Brown",
+ "email": "github@muglug.com"
}
],
- "description": "Provides generic and vendor-specific normalizers for normalizing JSON documents.",
- "homepage": "https://github.com/ergebnis/json-normalizer",
- "keywords": [
- "json",
- "normalizer"
- ],
+ "description": "Psalm plugin for PHPUnit",
"support": {
- "issues": "https://github.com/ergebnis/json-normalizer/issues",
- "source": "https://github.com/ergebnis/json-normalizer"
+ "issues": "https://github.com/psalm/psalm-plugin-phpunit/issues",
+ "source": "https://github.com/psalm/psalm-plugin-phpunit/tree/0.18.4"
},
- "time": "2023-02-26T10:58:43+00:00"
+ "time": "2022-12-03T07:47:07+00:00"
},
{
- "name": "ergebnis/json-pointer",
- "version": "3.2.0",
+ "name": "psr/cache",
+ "version": "3.0.0",
"source": {
"type": "git",
- "url": "https://github.com/ergebnis/json-pointer.git",
- "reference": "861516ff5afa1aa8905fdf3361315909523a1bf8"
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/861516ff5afa1aa8905fdf3361315909523a1bf8",
- "reference": "861516ff5afa1aa8905fdf3361315909523a1bf8",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
"shasum": ""
},
"require": {
- "php": "^8.0"
- },
- "require-dev": {
- "ergebnis/composer-normalize": "^2.28.3",
- "ergebnis/data-provider": "^1.2.0",
- "ergebnis/license": "^2.1.0",
- "ergebnis/php-cs-fixer-config": "^5.0.0",
- "fakerphp/faker": "^1.20.0",
- "infection/infection": "~0.26.16",
- "phpunit/phpunit": "^9.5.26",
- "psalm/plugin-phpunit": "~0.18.3",
- "vimeo/psalm": "^4.30"
+ "php": ">=8.0.0"
},
"type": "library",
"extra": {
- "composer-normalize": {
- "indent-size": 2,
- "indent-style": "space"
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
- "Ergebnis\\Json\\Pointer\\": "src/"
+ "Psr\\Cache\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -951,55 +2743,47 @@
],
"authors": [
{
- "name": "Andreas Möller",
- "email": "am@localheinz.com"
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
}
],
- "description": "Provides JSON pointer as a value object.",
- "homepage": "https://github.com/ergebnis/json-pointer",
+ "description": "Common interface for caching libraries",
"keywords": [
- "RFC6901",
- "json",
- "pointer"
+ "cache",
+ "psr",
+ "psr-6"
],
"support": {
- "issues": "https://github.com/ergebnis/json-pointer/issues",
- "source": "https://github.com/ergebnis/json-pointer"
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
},
- "time": "2022-11-28T17:03:31+00:00"
+ "time": "2021-02-03T23:26:27+00:00"
},
{
- "name": "ergebnis/json-printer",
- "version": "3.3.0",
+ "name": "psr/container",
+ "version": "2.0.2",
"source": {
"type": "git",
- "url": "https://github.com/ergebnis/json-printer.git",
- "reference": "18920367473b099633f644f0ca6dc8794345148f"
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/18920367473b099633f644f0ca6dc8794345148f",
- "reference": "18920367473b099633f644f0ca6dc8794345148f",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
"shasum": ""
},
"require": {
- "ext-json": "*",
- "ext-mbstring": "*",
- "php": "^8.0"
- },
- "require-dev": {
- "ergebnis/license": "^2.0.0",
- "ergebnis/php-cs-fixer-config": "^4.11.0",
- "fakerphp/faker": "^1.20.0",
- "infection/infection": "~0.26.6",
- "phpunit/phpunit": "^9.5.26",
- "psalm/plugin-phpunit": "~0.18.3",
- "vimeo/psalm": "^4.30.0"
+ "php": ">=7.4.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
"autoload": {
"psr-4": {
- "Ergebnis\\Json\\Printer\\": "src/"
+ "Psr\\Container\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1008,65 +2792,51 @@
],
"authors": [
{
- "name": "Andreas Möller",
- "email": "am@localheinz.com"
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
}
],
- "description": "Provides a JSON printer, allowing for flexible indentation.",
- "homepage": "https://github.com/ergebnis/json-printer",
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
"keywords": [
- "formatter",
- "json",
- "printer"
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
],
"support": {
- "issues": "https://github.com/ergebnis/json-printer/issues",
- "source": "https://github.com/ergebnis/json-printer"
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
},
- "time": "2022-11-28T10:27:43+00:00"
+ "time": "2021-11-05T16:47:00+00:00"
},
{
- "name": "ergebnis/json-schema-validator",
- "version": "4.0.0",
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
"source": {
"type": "git",
- "url": "https://github.com/ergebnis/json-schema-validator.git",
- "reference": "a6166272ac5691a9bc791f185841e5f92a6d4723"
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/a6166272ac5691a9bc791f185841e5f92a6d4723",
- "reference": "a6166272ac5691a9bc791f185841e5f92a6d4723",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
"shasum": ""
},
"require": {
- "ergebnis/json": "^1.0.0",
- "ergebnis/json-pointer": "^3.2.0",
- "ext-json": "*",
- "justinrainbow/json-schema": "^5.2.12",
- "php": "^8.0"
- },
- "require-dev": {
- "ergebnis/composer-normalize": "^2.21.0",
- "ergebnis/data-provider": "^1.2.0",
- "ergebnis/license": "^2.1.0",
- "ergebnis/php-cs-fixer-config": "~5.0.0",
- "fakerphp/faker": "^1.20.0",
- "infection/infection": "~0.26.16",
- "phpunit/phpunit": "~9.5.27",
- "psalm/plugin-phpunit": "~0.18.4",
- "vimeo/psalm": "^5.1.0"
+ "php": ">=7.2.0"
},
"type": "library",
"extra": {
- "composer-normalize": {
- "indent-size": 2,
- "indent-style": "space"
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
- "Ergebnis\\Json\\SchemaValidator\\": "src/"
+ "Psr\\EventDispatcher\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1075,367 +2845,340 @@
],
"authors": [
{
- "name": "Andreas Möller",
- "email": "am@localheinz.com"
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
}
],
- "description": "Provides a JSON schema validator, building on top of justinrainbow/json-schema.",
- "homepage": "https://github.com/ergebnis/json-schema-validator",
+ "description": "Standard interfaces for event handling.",
"keywords": [
- "json",
- "schema",
- "validator"
+ "events",
+ "psr",
+ "psr-14"
],
"support": {
- "issues": "https://github.com/ergebnis/json-schema-validator/issues",
- "source": "https://github.com/ergebnis/json-schema-validator"
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
},
- "time": "2022-12-10T14:50:15+00:00"
+ "time": "2019-01-08T18:20:26+00:00"
},
{
- "name": "felixfbecker/advanced-json-rpc",
- "version": "v3.2.1",
+ "name": "psr/log",
+ "version": "3.0.0",
"source": {
"type": "git",
- "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git",
- "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447"
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447",
- "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
+ "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
"shasum": ""
},
"require": {
- "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
- "php": "^7.1 || ^8.0",
- "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^7.0 || ^8.0"
+ "php": ">=8.0.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
"autoload": {
"psr-4": {
- "AdvancedJsonRpc\\": "lib/"
+ "Psr\\Log\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "ISC"
+ "MIT"
],
"authors": [
{
- "name": "Felix Becker",
- "email": "felix.b@outlook.com"
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
}
],
- "description": "A more advanced JSONRPC implementation",
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
"support": {
- "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues",
- "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1"
+ "source": "https://github.com/php-fig/log/tree/3.0.0"
},
- "time": "2021-06-11T22:34:44+00:00"
+ "time": "2021-07-14T16:46:02+00:00"
},
{
- "name": "felixfbecker/language-server-protocol",
- "version": "v1.5.2",
+ "name": "sebastian/cli-parser",
+ "version": "1.0.1",
"source": {
"type": "git",
- "url": "https://github.com/felixfbecker/php-language-server-protocol.git",
- "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842"
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842",
- "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.3"
},
"require-dev": {
- "phpstan/phpstan": "*",
- "squizlabs/php_codesniffer": "^3.1",
- "vimeo/psalm": "^4.0"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.x-dev"
+ "dev-master": "1.0-dev"
}
},
"autoload": {
- "psr-4": {
- "LanguageServerProtocol\\": "src/"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "ISC"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Felix Becker",
- "email": "felix.b@outlook.com"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "PHP classes for the Language Server Protocol",
- "keywords": [
- "language",
- "microsoft",
- "php",
- "server"
- ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": {
- "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues",
- "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2"
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
},
- "time": "2022-03-02T22:36:06+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:08:49+00:00"
},
{
- "name": "fidry/cpu-core-counter",
- "version": "0.5.1",
+ "name": "sebastian/code-unit",
+ "version": "1.0.8",
"source": {
"type": "git",
- "url": "https://github.com/theofidry/cpu-core-counter.git",
- "reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623"
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/b58e5a3933e541dc286cc91fc4f3898bbc6f1623",
- "reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0"
+ "php": ">=7.3"
},
"require-dev": {
- "fidry/makefile": "^0.2.0",
- "phpstan/extension-installer": "^1.2.0",
- "phpstan/phpstan": "^1.9.2",
- "phpstan/phpstan-deprecation-rules": "^1.0.0",
- "phpstan/phpstan-phpunit": "^1.2.2",
- "phpstan/phpstan-strict-rules": "^1.4.4",
- "phpunit/phpunit": "^9.5.26 || ^8.5.31",
- "theofidry/php-cs-fixer-config": "^1.0",
- "webmozarts/strict-phpunit": "^7.5"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
- "autoload": {
- "psr-4": {
- "Fidry\\CpuCoreCounter\\": "src/"
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
}
},
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Théo FIDRY",
- "email": "theo.fidry@gmail.com"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Tiny utility to get the number of CPU cores.",
- "keywords": [
- "CPU",
- "core"
- ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
"support": {
- "issues": "https://github.com/theofidry/cpu-core-counter/issues",
- "source": "https://github.com/theofidry/cpu-core-counter/tree/0.5.1"
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
},
"funding": [
{
- "url": "https://github.com/theofidry",
+ "url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
- "time": "2022-12-24T12:35:10+00:00"
+ "time": "2020-10-26T13:08:54+00:00"
},
{
- "name": "friendsofphp/php-cs-fixer",
- "version": "v3.14.4",
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "2.0.3",
"source": {
"type": "git",
- "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
- "reference": "1b3d9dba63d93b8a202c31e824748218781eae6b"
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/1b3d9dba63d93b8a202c31e824748218781eae6b",
- "reference": "1b3d9dba63d93b8a202c31e824748218781eae6b",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
"shasum": ""
},
"require": {
- "composer/semver": "^3.3",
- "composer/xdebug-handler": "^3.0.3",
- "doctrine/annotations": "^2",
- "doctrine/lexer": "^2 || ^3",
- "ext-json": "*",
- "ext-tokenizer": "*",
- "php": "^7.4 || ^8.0",
- "sebastian/diff": "^4.0 || ^5.0",
- "symfony/console": "^5.4 || ^6.0",
- "symfony/event-dispatcher": "^5.4 || ^6.0",
- "symfony/filesystem": "^5.4 || ^6.0",
- "symfony/finder": "^5.4 || ^6.0",
- "symfony/options-resolver": "^5.4 || ^6.0",
- "symfony/polyfill-mbstring": "^1.27",
- "symfony/polyfill-php80": "^1.27",
- "symfony/polyfill-php81": "^1.27",
- "symfony/process": "^5.4 || ^6.0",
- "symfony/stopwatch": "^5.4 || ^6.0"
+ "php": ">=7.3"
},
"require-dev": {
- "justinrainbow/json-schema": "^5.2",
- "keradus/cli-executor": "^2.0",
- "mikey179/vfsstream": "^1.6.11",
- "php-coveralls/php-coveralls": "^2.5.3",
- "php-cs-fixer/accessible-object": "^1.1",
- "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2",
- "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1",
- "phpspec/prophecy": "^1.16",
- "phpspec/prophecy-phpunit": "^2.0",
- "phpunit/phpunit": "^9.5",
- "phpunitgoodpractices/polyfill": "^1.6",
- "phpunitgoodpractices/traits": "^1.9.2",
- "symfony/phpunit-bridge": "^6.2.3",
- "symfony/yaml": "^5.4 || ^6.0"
+ "phpunit/phpunit": "^9.3"
},
- "suggest": {
- "ext-dom": "For handling output formats in XML",
- "ext-mbstring": "For handling non-UTF8 characters."
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
},
- "bin": [
- "php-cs-fixer"
- ],
- "type": "application",
"autoload": {
- "psr-4": {
- "PhpCsFixer\\": "src/"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Dariusz Rumiński",
- "email": "dariusz.ruminski@gmail.com"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
}
],
- "description": "A tool to automatically fix PHP code style",
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"support": {
- "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
- "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.14.4"
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
},
"funding": [
{
- "url": "https://github.com/keradus",
+ "url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
- "time": "2023-02-09T21:49:13+00:00"
+ "time": "2020-09-28T05:30:19+00:00"
},
{
- "name": "justinrainbow/json-schema",
- "version": "5.2.12",
+ "name": "sebastian/comparator",
+ "version": "4.0.8",
"source": {
"type": "git",
- "url": "https://github.com/justinrainbow/json-schema.git",
- "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60"
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "fa0f136dd2334583309d32b62544682ee972b51a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60",
- "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
+ "reference": "fa0f136dd2334583309d32b62544682ee972b51a",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.3",
+ "sebastian/diff": "^4.0",
+ "sebastian/exporter": "^4.0"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
- "json-schema/json-schema-test-suite": "1.2.0",
- "phpunit/phpunit": "^4.8.35"
+ "phpunit/phpunit": "^9.3"
},
- "bin": [
- "bin/validate-json"
- ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.0.x-dev"
+ "dev-master": "4.0-dev"
}
},
"autoload": {
- "psr-4": {
- "JsonSchema\\": "src/JsonSchema/"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Bruno Prieto Reis",
- "email": "bruno.p.reis@gmail.com"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
},
{
- "name": "Justin Rainbow",
- "email": "justin.rainbow@gmail.com"
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
},
{
- "name": "Igor Wiedler",
- "email": "igor@wiedler.ch"
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
},
{
- "name": "Robert Schönthal",
- "email": "seroscho@googlemail.com"
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
}
],
- "description": "A library to validate a json schema.",
- "homepage": "https://github.com/justinrainbow/json-schema",
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
"keywords": [
- "json",
- "schema"
+ "comparator",
+ "compare",
+ "equality"
],
"support": {
- "issues": "https://github.com/justinrainbow/json-schema/issues",
- "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12"
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
},
- "time": "2022-04-13T08:02:27+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-14T12:41:17+00:00"
},
{
- "name": "localheinz/diff",
- "version": "1.1.1",
+ "name": "sebastian/complexity",
+ "version": "2.0.2",
"source": {
"type": "git",
- "url": "https://github.com/localheinz/diff.git",
- "reference": "851bb20ea8358c86f677f5f111c4ab031b1c764c"
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/localheinz/diff/zipball/851bb20ea8358c86f677f5f111c4ab031b1c764c",
- "reference": "851bb20ea8358c86f677f5f111c4ab031b1c764c",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
+ "nikic/php-parser": "^4.7",
+ "php": ">=7.3"
},
"require-dev": {
- "phpunit/phpunit": "^7.5 || ^8.0",
- "symfony/process": "^4.2 || ^5"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
"autoload": {
"classmap": [
"src/"
@@ -1448,23 +3191,15 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- },
- {
- "name": "Kore Nordmann",
- "email": "mail@kore-nordmann.de"
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Fork of sebastian/diff for use with ergebnis/composer-normalize",
- "homepage": "https://github.com/localheinz/diff",
- "keywords": [
- "diff",
- "udiff",
- "unidiff",
- "unified diff"
- ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
"support": {
- "source": "https://github.com/localheinz/diff/tree/main"
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
},
"funding": [
{
@@ -1472,94 +3207,107 @@
"type": "github"
}
],
- "time": "2020-07-06T04:49:32+00:00"
+ "time": "2020-10-26T15:52:27+00:00"
},
{
- "name": "netresearch/jsonmapper",
- "version": "v4.1.0",
+ "name": "sebastian/diff",
+ "version": "4.0.4",
"source": {
"type": "git",
- "url": "https://github.com/cweiske/jsonmapper.git",
- "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f"
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/cfa81ea1d35294d64adb9c68aa4cb9e92400e53f",
- "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
"shasum": ""
},
"require": {
- "ext-json": "*",
- "ext-pcre": "*",
- "ext-reflection": "*",
- "ext-spl": "*",
- "php": ">=7.1"
+ "php": ">=7.3"
},
"require-dev": {
- "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0",
- "squizlabs/php_codesniffer": "~3.5"
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
},
"type": "library",
- "autoload": {
- "psr-0": {
- "JsonMapper": "src/"
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
}
},
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
"notification-url": "https://packagist.org/downloads/",
"license": [
- "OSL-3.0"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Christian Weiske",
- "email": "cweiske@cweiske.de",
- "homepage": "http://github.com/cweiske/jsonmapper/",
- "role": "Developer"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
}
],
- "description": "Map nested JSON structures onto PHP classes",
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
"support": {
- "email": "cweiske@cweiske.de",
- "issues": "https://github.com/cweiske/jsonmapper/issues",
- "source": "https://github.com/cweiske/jsonmapper/tree/v4.1.0"
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
},
- "time": "2022-12-08T20:46:14+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:10:38+00:00"
},
{
- "name": "nikic/php-parser",
- "version": "v4.15.3",
+ "name": "sebastian/environment",
+ "version": "5.1.5",
"source": {
"type": "git",
- "url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039"
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039",
- "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
"shasum": ""
},
"require": {
- "ext-tokenizer": "*",
- "php": ">=7.0"
+ "php": ">=7.3"
},
"require-dev": {
- "ircmaxell/php-yacc": "^0.0.7",
- "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-posix": "*"
},
- "bin": [
- "bin/php-parse"
- ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.9-dev"
+ "dev-master": "5.1-dev"
}
},
"autoload": {
- "psr-4": {
- "PhpParser\\": "lib/PhpParser"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -1567,456 +3315,534 @@
],
"authors": [
{
- "name": "Nikita Popov"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
}
],
- "description": "A PHP parser written in PHP",
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
"keywords": [
- "parser",
- "php"
+ "Xdebug",
+ "environment",
+ "hhvm"
],
"support": {
- "issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3"
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5"
},
- "time": "2023-01-16T22:05:37+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:03:51+00:00"
},
{
- "name": "phpdocumentor/reflection-common",
- "version": "2.2.0",
+ "name": "sebastian/exporter",
+ "version": "4.0.5",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
- "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
- "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
+ "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0"
+ "php": ">=7.3",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-2.x": "2.x-dev"
+ "dev-master": "4.0-dev"
}
},
"autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src/"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Jaap van Otterdijk",
- "email": "opensource@ijaap.nl"
+ "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": "Common reflection classes used by phpdocumentor to reflect the code structure",
- "homepage": "http://www.phpdoc.org",
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
"keywords": [
- "FQSEN",
- "phpDocumentor",
- "phpdoc",
- "reflection",
- "static analysis"
+ "export",
+ "exporter"
],
"support": {
- "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
- "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
},
- "time": "2020-06-27T09:03:43+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-14T06:03:37+00:00"
},
{
- "name": "phpdocumentor/reflection-docblock",
- "version": "5.3.0",
+ "name": "sebastian/global-state",
+ "version": "5.0.5",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
- "reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2",
+ "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2",
"shasum": ""
},
"require": {
- "ext-filter": "*",
- "php": "^7.2 || ^8.0",
- "phpdocumentor/reflection-common": "^2.2",
- "phpdocumentor/type-resolver": "^1.3",
- "webmozart/assert": "^1.9.1"
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
},
"require-dev": {
- "mockery/mockery": "~1.3.2",
- "psalm/phar": "^4.8"
+ "ext-dom": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-uopz": "*"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.x-dev"
+ "dev-master": "5.0-dev"
}
},
"autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
- },
- {
- "name": "Jaap van Otterdijk",
- "email": "account@ijaap.nl"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
}
],
- "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
"support": {
- "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
- "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5"
},
- "time": "2021-10-19T17:43:47+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-02-14T08:28:10+00:00"
},
{
- "name": "phpdocumentor/type-resolver",
- "version": "1.6.2",
+ "name": "sebastian/lines-of-code",
+ "version": "1.0.3",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d"
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d",
- "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
"shasum": ""
},
"require": {
- "php": "^7.4 || ^8.0",
- "phpdocumentor/reflection-common": "^2.0"
+ "nikic/php-parser": "^4.6",
+ "php": ">=7.3"
},
"require-dev": {
- "ext-tokenizer": "*",
- "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"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-1.x": "1.x-dev"
+ "dev-master": "1.0-dev"
}
},
"autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "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/phpDocumentor/TypeResolver/issues",
- "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2"
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
},
- "time": "2022-10-14T12:47:21+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-28T06:42:11+00:00"
},
{
- "name": "phpyh/coding-standard",
- "version": "2.0.0",
+ "name": "sebastian/object-enumerator",
+ "version": "4.0.4",
"source": {
"type": "git",
- "url": "https://github.com/phpyh/coding-standard.git",
- "reference": "243b86ddb6357e944cdcdacbcb9efd2b7894c036"
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpyh/coding-standard/zipball/243b86ddb6357e944cdcdacbcb9efd2b7894c036",
- "reference": "243b86ddb6357e944cdcdacbcb9efd2b7894c036",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
"shasum": ""
},
"require": {
- "friendsofphp/php-cs-fixer": "^3.14.3",
- "php": "^8.1"
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
},
"require-dev": {
- "vimeo/psalm": "^5.6"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
- "autoload": {
- "psr-4": {
- "PHPyh\\CodingStandard\\": "src/"
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
}
},
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Valentin Udaltsov",
- "email": "udaltsov.valentin@gmail.com"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
}
],
- "description": "PHPyh Coding Standard For PHP CS Fixer",
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"support": {
- "issues": "https://github.com/phpyh/coding-standard/issues",
- "source": "https://github.com/phpyh/coding-standard/tree/2.0.0"
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
},
- "time": "2023-02-25T04:52:27+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:12:34+00:00"
},
{
- "name": "psr/cache",
- "version": "3.0.0",
+ "name": "sebastian/object-reflector",
+ "version": "2.0.4",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/cache.git",
- "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
- "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
"shasum": ""
},
"require": {
- "php": ">=8.0.0"
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "2.0-dev"
}
},
"autoload": {
- "psr-4": {
- "Psr\\Cache\\": "src/"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
}
],
- "description": "Common interface for caching libraries",
- "keywords": [
- "cache",
- "psr",
- "psr-6"
- ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
"support": {
- "source": "https://github.com/php-fig/cache/tree/3.0.0"
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
},
- "time": "2021-02-03T23:26:27+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:14:26+00:00"
},
{
- "name": "psr/container",
- "version": "2.0.2",
+ "name": "sebastian/recursion-context",
+ "version": "4.0.5",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/container.git",
- "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
- "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
"shasum": ""
},
"require": {
- "php": ">=7.4.0"
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-master": "4.0-dev"
}
},
"autoload": {
- "psr-4": {
- "Psr\\Container\\": "src/"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
}
],
- "description": "Common Container Interface (PHP FIG PSR-11)",
- "homepage": "https://github.com/php-fig/container",
- "keywords": [
- "PSR-11",
- "container",
- "container-interface",
- "container-interop",
- "psr"
- ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
"support": {
- "issues": "https://github.com/php-fig/container/issues",
- "source": "https://github.com/php-fig/container/tree/2.0.2"
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5"
},
- "time": "2021-11-05T16:47:00+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:07:39+00:00"
},
{
- "name": "psr/event-dispatcher",
- "version": "1.0.0",
+ "name": "sebastian/resource-operations",
+ "version": "3.0.3",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/event-dispatcher.git",
- "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
- "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
"shasum": ""
},
"require": {
- "php": ">=7.2.0"
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "3.0-dev"
}
},
"autoload": {
- "psr-4": {
- "Psr\\EventDispatcher\\": "src/"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
}
],
- "description": "Standard interfaces for event handling.",
- "keywords": [
- "events",
- "psr",
- "psr-14"
- ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
"support": {
- "issues": "https://github.com/php-fig/event-dispatcher/issues",
- "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
},
- "time": "2019-01-08T18:20:26+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:45:17+00:00"
},
{
- "name": "psr/log",
- "version": "3.0.0",
+ "name": "sebastian/type",
+ "version": "3.2.1",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
- "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
"shasum": ""
},
"require": {
- "php": ">=8.0.0"
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.x-dev"
+ "dev-master": "3.2-dev"
}
},
"autoload": {
- "psr-4": {
- "Psr\\Log\\": "src"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Common interface for logging libraries",
- "homepage": "https://github.com/php-fig/log",
- "keywords": [
- "log",
- "psr",
- "psr-3"
- ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
"support": {
- "source": "https://github.com/php-fig/log/tree/3.0.0"
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/3.2.1"
},
- "time": "2021-07-14T16:46:02+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:13:03+00:00"
},
{
- "name": "sebastian/diff",
- "version": "5.0.0",
+ "name": "sebastian/version",
+ "version": "3.0.2",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "70dd1b20bc198da394ad542e988381b44e64e39f"
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/70dd1b20bc198da394ad542e988381b44e64e39f",
- "reference": "70dd1b20bc198da394ad542e988381b44e64e39f",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
"shasum": ""
},
"require": {
- "php": ">=8.1"
- },
- "require-dev": {
- "phpunit/phpunit": "^10.0",
- "symfony/process": "^4.2 || ^5"
+ "php": ">=7.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "5.0-dev"
+ "dev-master": "3.0-dev"
}
},
"autoload": {
@@ -2031,24 +3857,15 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- },
- {
- "name": "Kore Nordmann",
- "email": "mail@kore-nordmann.de"
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Diff implementation",
- "homepage": "https://github.com/sebastianbergmann/diff",
- "keywords": [
- "diff",
- "udiff",
- "unidiff",
- "unified diff"
- ],
+ "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/diff/issues",
- "source": "https://github.com/sebastianbergmann/diff/tree/5.0.0"
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
},
"funding": [
{
@@ -2056,7 +3873,7 @@
"type": "github"
}
],
- "time": "2023-02-03T07:00:31+00:00"
+ "time": "2020-09-28T06:39:44+00:00"
},
{
"name": "spatie/array-to-xml",
@@ -2123,16 +3940,16 @@
},
{
"name": "symfony/console",
- "version": "v6.2.5",
+ "version": "v6.2.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "3e294254f2191762c1d137aed4b94e966965e985"
+ "reference": "cbad09eb8925b6ad4fb721c7a179344dc4a19d45"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/3e294254f2191762c1d137aed4b94e966965e985",
- "reference": "3e294254f2191762c1d137aed4b94e966965e985",
+ "url": "https://api.github.com/repos/symfony/console/zipball/cbad09eb8925b6ad4fb721c7a179344dc4a19d45",
+ "reference": "cbad09eb8925b6ad4fb721c7a179344dc4a19d45",
"shasum": ""
},
"require": {
@@ -2199,7 +4016,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v6.2.5"
+ "source": "https://github.com/symfony/console/tree/v6.2.7"
},
"funding": [
{
@@ -2215,20 +4032,20 @@
"type": "tidelift"
}
],
- "time": "2023-01-01T08:38:09+00:00"
+ "time": "2023-02-25T17:00:03+00:00"
},
{
"name": "symfony/deprecation-contracts",
- "version": "v3.2.0",
+ "version": "v3.2.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3"
+ "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3",
- "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e",
+ "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e",
"shasum": ""
},
"require": {
@@ -2266,7 +4083,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0"
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1"
},
"funding": [
{
@@ -2282,20 +4099,20 @@
"type": "tidelift"
}
],
- "time": "2022-11-25T10:21:52+00:00"
+ "time": "2023-03-01T10:25:55+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v6.2.5",
+ "version": "v6.2.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68"
+ "reference": "404b307de426c1c488e5afad64403e5f145e82a5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68",
- "reference": "f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/404b307de426c1c488e5afad64403e5f145e82a5",
+ "reference": "404b307de426c1c488e5afad64403e5f145e82a5",
"shasum": ""
},
"require": {
@@ -2349,7 +4166,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.5"
+ "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.7"
},
"funding": [
{
@@ -2365,20 +4182,20 @@
"type": "tidelift"
}
],
- "time": "2023-01-01T08:38:09+00:00"
+ "time": "2023-02-14T08:44:56+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
- "version": "v3.2.0",
+ "version": "v3.2.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
- "reference": "0782b0b52a737a05b4383d0df35a474303cabdae"
+ "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0782b0b52a737a05b4383d0df35a474303cabdae",
- "reference": "0782b0b52a737a05b4383d0df35a474303cabdae",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ad3b6f1e4e2da5690fefe075cd53a238646d8dd",
+ "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd",
"shasum": ""
},
"require": {
@@ -2428,7 +4245,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.0"
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.1"
},
"funding": [
{
@@ -2444,20 +4261,20 @@
"type": "tidelift"
}
],
- "time": "2022-11-25T10:21:52+00:00"
+ "time": "2023-03-01T10:32:47+00:00"
},
{
"name": "symfony/filesystem",
- "version": "v6.2.5",
+ "version": "v6.2.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "e59e8a4006afd7f5654786a83b4fcb8da98f4593"
+ "reference": "82b6c62b959f642d000456f08c6d219d749215b3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/e59e8a4006afd7f5654786a83b4fcb8da98f4593",
- "reference": "e59e8a4006afd7f5654786a83b4fcb8da98f4593",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/82b6c62b959f642d000456f08c6d219d749215b3",
+ "reference": "82b6c62b959f642d000456f08c6d219d749215b3",
"shasum": ""
},
"require": {
@@ -2491,7 +4308,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v6.2.5"
+ "source": "https://github.com/symfony/filesystem/tree/v6.2.7"
},
"funding": [
{
@@ -2507,20 +4324,20 @@
"type": "tidelift"
}
],
- "time": "2023-01-20T17:45:48+00:00"
+ "time": "2023-02-14T08:44:56+00:00"
},
{
"name": "symfony/finder",
- "version": "v6.2.5",
+ "version": "v6.2.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "c90dc446976a612e3312a97a6ec0069ab0c2099c"
+ "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/c90dc446976a612e3312a97a6ec0069ab0c2099c",
- "reference": "c90dc446976a612e3312a97a6ec0069ab0c2099c",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/20808dc6631aecafbe67c186af5dcb370be3a0eb",
+ "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb",
"shasum": ""
},
"require": {
@@ -2555,7 +4372,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v6.2.5"
+ "source": "https://github.com/symfony/finder/tree/v6.2.7"
},
"funding": [
{
@@ -2571,20 +4388,20 @@
"type": "tidelift"
}
],
- "time": "2023-01-20T17:45:48+00:00"
+ "time": "2023-02-16T09:57:23+00:00"
},
{
"name": "symfony/options-resolver",
- "version": "v6.2.5",
+ "version": "v6.2.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/options-resolver.git",
- "reference": "e8324d44f5af99ec2ccec849934a242f64458f86"
+ "reference": "aa0e85b53bbb2b4951960efd61d295907eacd629"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/options-resolver/zipball/e8324d44f5af99ec2ccec849934a242f64458f86",
- "reference": "e8324d44f5af99ec2ccec849934a242f64458f86",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/aa0e85b53bbb2b4951960efd61d295907eacd629",
+ "reference": "aa0e85b53bbb2b4951960efd61d295907eacd629",
"shasum": ""
},
"require": {
@@ -2622,7 +4439,7 @@
"options"
],
"support": {
- "source": "https://github.com/symfony/options-resolver/tree/v6.2.5"
+ "source": "https://github.com/symfony/options-resolver/tree/v6.2.7"
},
"funding": [
{
@@ -2638,7 +4455,7 @@
"type": "tidelift"
}
],
- "time": "2023-01-01T08:38:09+00:00"
+ "time": "2023-02-14T08:44:56+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -3134,16 +4951,16 @@
},
{
"name": "symfony/process",
- "version": "v6.2.5",
+ "version": "v6.2.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "9ead139f63dfa38c4e4a9049cc64a8b2748c83b7"
+ "reference": "680e8a2ea6b3f87aecc07a6a65a203ae573d1902"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/9ead139f63dfa38c4e4a9049cc64a8b2748c83b7",
- "reference": "9ead139f63dfa38c4e4a9049cc64a8b2748c83b7",
+ "url": "https://api.github.com/repos/symfony/process/zipball/680e8a2ea6b3f87aecc07a6a65a203ae573d1902",
+ "reference": "680e8a2ea6b3f87aecc07a6a65a203ae573d1902",
"shasum": ""
},
"require": {
@@ -3175,7 +4992,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v6.2.5"
+ "source": "https://github.com/symfony/process/tree/v6.2.7"
},
"funding": [
{
@@ -3191,20 +5008,20 @@
"type": "tidelift"
}
],
- "time": "2023-01-01T08:38:09+00:00"
+ "time": "2023-02-24T10:42:00+00:00"
},
{
"name": "symfony/service-contracts",
- "version": "v3.2.0",
+ "version": "v3.2.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
- "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75"
+ "reference": "a8c9cedf55f314f3a186041d19537303766df09a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75",
- "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a",
+ "reference": "a8c9cedf55f314f3a186041d19537303766df09a",
"shasum": ""
},
"require": {
@@ -3260,7 +5077,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/service-contracts/tree/v3.2.0"
+ "source": "https://github.com/symfony/service-contracts/tree/v3.2.1"
},
"funding": [
{
@@ -3276,20 +5093,20 @@
"type": "tidelift"
}
],
- "time": "2022-11-25T10:21:52+00:00"
+ "time": "2023-03-01T10:32:47+00:00"
},
{
"name": "symfony/stopwatch",
- "version": "v6.2.5",
+ "version": "v6.2.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/stopwatch.git",
- "reference": "00b6ac156aacffc53487c930e0ab14587a6607f6"
+ "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/stopwatch/zipball/00b6ac156aacffc53487c930e0ab14587a6607f6",
- "reference": "00b6ac156aacffc53487c930e0ab14587a6607f6",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f3adc98c1061875dd2edcd45e5b04e63d0e29f8f",
+ "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f",
"shasum": ""
},
"require": {
@@ -3322,7 +5139,7 @@
"description": "Provides a way to profile code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/stopwatch/tree/v6.2.5"
+ "source": "https://github.com/symfony/stopwatch/tree/v6.2.7"
},
"funding": [
{
@@ -3338,20 +5155,20 @@
"type": "tidelift"
}
],
- "time": "2023-01-01T08:36:55+00:00"
+ "time": "2023-02-14T08:44:56+00:00"
},
{
"name": "symfony/string",
- "version": "v6.2.5",
+ "version": "v6.2.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0"
+ "reference": "67b8c1eec78296b85dc1c7d9743830160218993d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0",
- "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0",
+ "url": "https://api.github.com/repos/symfony/string/zipball/67b8c1eec78296b85dc1c7d9743830160218993d",
+ "reference": "67b8c1eec78296b85dc1c7d9743830160218993d",
"shasum": ""
},
"require": {
@@ -3408,7 +5225,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v6.2.5"
+ "source": "https://github.com/symfony/string/tree/v6.2.7"
},
"funding": [
{
@@ -3424,7 +5241,57 @@
"type": "tidelift"
}
],
- "time": "2023-01-01T08:38:09+00:00"
+ "time": "2023-02-24T10:42:00+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "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"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2021-07-28T10:34:58+00:00"
},
{
"name": "vimeo/psalm",
@@ -3530,70 +5397,13 @@
"source": "https://github.com/vimeo/psalm/tree/5.7.7"
},
"time": "2023-02-25T01:05:07+00:00"
- },
- {
- "name": "webmozart/assert",
- "version": "1.11.0",
- "source": {
- "type": "git",
- "url": "https://github.com/webmozarts/assert.git",
- "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
- "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
- "shasum": ""
- },
- "require": {
- "ext-ctype": "*",
- "php": "^7.2 || ^8.0"
- },
- "conflict": {
- "phpstan/phpstan": "<0.12.20",
- "vimeo/psalm": "<4.6.1 || 4.6.2"
- },
- "require-dev": {
- "phpunit/phpunit": "^8.5.13"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.10-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Webmozart\\Assert\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Bernhard Schussek",
- "email": "bschussek@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/1.11.0"
- },
- "time": "2022-06-03T18:03:27+00:00"
}
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {
- "php-extended-type-system/type": 20
+ "extended-type-system/type": 20,
+ "extended-type-system/type-stringifier": 20
},
"prefer-stable": false,
"prefer-lowest": false,
diff --git a/psalm.xml.dist b/psalm.xml.dist
index ac04132..270f7dd 100644
--- a/psalm.xml.dist
+++ b/psalm.xml.dist
@@ -21,6 +21,10 @@
+
+
+
+
@@ -28,4 +32,9 @@
+
+
+
+
+
diff --git a/src/Metadata/ClassMetadata.php b/src/Metadata/ClassMetadata.php
new file mode 100644
index 0000000..865bf6b
--- /dev/null
+++ b/src/Metadata/ClassMetadata.php
@@ -0,0 +1,69 @@
+static = $final ? $class : new StaticT($class);
+ parent::__construct($phpDocTags);
+ }
+
+ public function resolveName(string $name): string|StaticT
+ {
+ if ($name === 'self') {
+ return $this->class;
+ }
+
+ if ($name === 'parent') {
+ return $this->parent ?? throw new \LogicException(sprintf(
+ 'Failed to resolve parent type: scope class %s does not have a parent.',
+ $this->class,
+ ));
+ }
+
+ if ($name === 'static') {
+ return $this->static;
+ }
+
+ return $this->nameResolver->resolveName($name);
+ }
+
+ public function tryReflectTemplateT(string $name): ?TemplateT
+ {
+ foreach ($this->phpDocTags->findTagValues(TemplateTagValueNode::class) as $tagValue) {
+ if ($tagValue->name === $name) {
+ return new TemplateT($name, new AtClass($this->class));
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/src/Metadata/FromStringMetadata.php b/src/Metadata/FromStringMetadata.php
new file mode 100644
index 0000000..aee2af5
--- /dev/null
+++ b/src/Metadata/FromStringMetadata.php
@@ -0,0 +1,33 @@
+classMetadata?->resolveName($name) ?? $name;
+ }
+
+ public function tryReflectTemplateT(string $name): ?TemplateT
+ {
+ return $this->classMetadata?->tryReflectTemplateT($name);
+ }
+}
diff --git a/src/Metadata/FunctionMetadata.php b/src/Metadata/FunctionMetadata.php
new file mode 100644
index 0000000..78307e1
--- /dev/null
+++ b/src/Metadata/FunctionMetadata.php
@@ -0,0 +1,66 @@
+at = $function === null ? null : new AtFunction($function);
+ parent::__construct($phpDocTags);
+ }
+
+ public function resolveName(string $name): string|StaticT
+ {
+ if (\in_array($name, ['self', 'static', 'parent'], true)) {
+ return $this->scopeClass()?->resolveName($name) ?? throw new \LogicException(sprintf(
+ 'Cannot resolve %s type outside of a class scope.',
+ $name,
+ ));
+ }
+
+ return $this->nameResolver->resolveName($name);
+ }
+
+ public function tryReflectTemplateT(string $name): ?TemplateT
+ {
+ if ($this->at === null) {
+ return null;
+ }
+
+ foreach ($this->phpDocTags->findTagValues(TemplateTagValueNode::class) as $tagValue) {
+ if ($tagValue->name === $name) {
+ return new TemplateT($name, $this->at);
+ }
+ }
+
+ return null;
+ }
+
+ public function scopeClass(): ?ClassMetadata
+ {
+ return $this->scopeClass;
+ }
+}
diff --git a/src/Metadata/Metadata.php b/src/Metadata/Metadata.php
new file mode 100644
index 0000000..7ae59d5
--- /dev/null
+++ b/src/Metadata/Metadata.php
@@ -0,0 +1,28 @@
+
+ */
+ private \WeakMap $closureMetadata;
+
+ public function __construct(
+ private readonly LRUMemoizer $memoizer = new LRUMemoizer(),
+ private readonly PHPDocParser $phpDocParser = new PHPDocParser(),
+ private readonly NameResolverFactory $nameResolverFactory = new NameResolverFactory(),
+ ) {
+ /** @var \WeakMap<\Closure, FunctionMetadata> */
+ $this->closureMetadata = new \WeakMap();
+ }
+
+ /**
+ * @param ?class-string $scopeClass
+ */
+ public function fromStringMetadata(string $phpDoc, ?string $scopeClass = null): FromStringMetadata
+ {
+ return $this->memoizer->get($phpDoc, fn (): FromStringMetadata => new FromStringMetadata(
+ classMetadata: $scopeClass === null ? null : $this->classMetadata($scopeClass),
+ phpDocTags: $this->phpDocParser->parsePhpDoc($phpDoc),
+ ));
+ }
+
+ /**
+ * @param callable-string|\Closure $function
+ */
+ public function functionMetadata(string|\Closure $function): FunctionMetadata
+ {
+ $metadataFactory = function () use ($function): FunctionMetadata {
+ $reflectionFunction = new \ReflectionFunction($function);
+ $scopeClass = $reflectionFunction->getClosureScopeClass()?->name;
+
+ return new FunctionMetadata(
+ function: \is_string($function) ? $function : null,
+ scopeClass: $scopeClass === null ? null : $this->classMetadata($scopeClass),
+ nameResolver: $this->nameResolverFactory->create(
+ file: $reflectionFunction->getFileName(),
+ namespace: $reflectionFunction->getNamespaceName(),
+ ),
+ phpDocTags: $this->phpDocParser->parsePhpDoc($reflectionFunction->getDocComment()),
+ );
+ };
+
+ if (\is_string($function)) {
+ return $this->memoizer->get($function, $metadataFactory);
+ }
+
+ return $this->closureMetadata[$function] ??= $metadataFactory();
+ }
+
+ /**
+ * @param class-string $class
+ */
+ public function classMetadata(string $class): ClassMetadata
+ {
+ return $this->memoizer->get($class, function () use ($class): ClassMetadata {
+ $reflectionClass = new \ReflectionClass($class);
+
+ return new ClassMetadata(
+ class: $reflectionClass->name,
+ parent: ($reflectionClass->getParentClass() ?: null)?->name,
+ final: $reflectionClass->isFinal(),
+ nameResolver: $this->nameResolverFactory->create(
+ file: $reflectionClass->getFileName(),
+ namespace: $reflectionClass->getNamespaceName(),
+ ),
+ phpDocTags: $this->phpDocParser->parsePhpDoc($reflectionClass->getDocComment()),
+ );
+ });
+ }
+
+ /**
+ * @param class-string $class
+ */
+ public function propertyMetadata(string $class, string $property): PropertyMetadata
+ {
+ $reflectionProperty = new \ReflectionProperty($class, $property);
+
+ return $this->memoizer->get($reflectionProperty->class.'::$'.$property, function () use ($reflectionProperty): PropertyMetadata {
+ return new PropertyMetadata(
+ static: $reflectionProperty->isStatic(),
+ promoted: $reflectionProperty->isPromoted(),
+ class: $this->classMetadata($reflectionProperty->class),
+ phpDocTags: $this->phpDocParser->parsePhpDoc($reflectionProperty->getDocComment()),
+ );
+ });
+ }
+
+ /**
+ * @param class-string $class
+ */
+ public function methodMetadata(string $class, string $method): MethodMetadata
+ {
+ $reflectionMethod = new \ReflectionMethod($class, $method);
+
+ return $this->memoizer->get($reflectionMethod->class.'::'.$method, function () use ($reflectionMethod): MethodMetadata {
+ return new MethodMetadata(
+ method: $reflectionMethod->getName(),
+ static: $reflectionMethod->isStatic(),
+ class: $this->classMetadata($reflectionMethod->class),
+ phpDocTags: $this->phpDocParser->parsePhpDoc($reflectionMethod->getDocComment()),
+ );
+ });
+ }
+}
diff --git a/src/Metadata/MethodMetadata.php b/src/Metadata/MethodMetadata.php
new file mode 100644
index 0000000..3830f21
--- /dev/null
+++ b/src/Metadata/MethodMetadata.php
@@ -0,0 +1,54 @@
+at = new AtMethod($class->class, $method);
+
+ parent::__construct($phpDocTags);
+ }
+
+ public function resolveName(string $name): string|StaticT
+ {
+ return $this->class->resolveName($name);
+ }
+
+ public function tryReflectTemplateT(string $name): ?TemplateT
+ {
+ foreach ($this->phpDocTags->findTagValues(TemplateTagValueNode::class) as $tagValue) {
+ if ($tagValue->name === $name) {
+ return new TemplateT($name, $this->at);
+ }
+ }
+
+ if ($this->static) {
+ return null;
+ }
+
+ return $this->class->tryReflectTemplateT($name);
+ }
+}
diff --git a/src/Metadata/PropertyMetadata.php b/src/Metadata/PropertyMetadata.php
new file mode 100644
index 0000000..b7a0900
--- /dev/null
+++ b/src/Metadata/PropertyMetadata.php
@@ -0,0 +1,39 @@
+class->resolveName($name);
+ }
+
+ public function tryReflectTemplateT(string $name): ?TemplateT
+ {
+ if ($this->static) {
+ return null;
+ }
+
+ return $this->class->tryReflectTemplateT($name);
+ }
+}
diff --git a/src/NameResolution/NameResolver.php b/src/NameResolution/NameResolver.php
new file mode 100644
index 0000000..a6cde35
--- /dev/null
+++ b/src/NameResolution/NameResolver.php
@@ -0,0 +1,26 @@
+fqsenResolver->resolve($name, $this->context);
+ }
+}
diff --git a/src/NameResolution/NameResolverFactory.php b/src/NameResolution/NameResolverFactory.php
new file mode 100644
index 0000000..4de52c9
--- /dev/null
+++ b/src/NameResolution/NameResolverFactory.php
@@ -0,0 +1,43 @@
+fqsenResolver, new Context(''));
+ }
+
+ $contents = @file_get_contents($file);
+
+ if ($contents === false) {
+ return new NameResolver($this->fqsenResolver, new Context(''));
+ }
+
+ return new NameResolver(
+ fqsenResolver: $this->fqsenResolver,
+ context: $this->contextFactory->createForNamespace(
+ namespace: $namespace,
+ fileContents: $contents,
+ ),
+ );
+ }
+}
diff --git a/src/NullTemplateReflector.php b/src/NullTemplateReflector.php
deleted file mode 100644
index 9546cc4..0000000
--- a/src/NullTemplateReflector.php
+++ /dev/null
@@ -1,38 +0,0 @@
-lexer->tokenize($phpDoc);
+ $tags = $this->parser->parse(new TokenIterator($tokens))->getTags();
+ usort(
+ $tags,
+ fn (PhpDocTagNode $a, PhpDocTagNode $b): int => $this->prioritizer->priorityFor($b->name) <=> $this->prioritizer->priorityFor($a->name),
+ );
+
+ return new PHPDocTags($tags);
+ }
+}
diff --git a/src/Parser/PHPDocTags.php b/src/Parser/PHPDocTags.php
new file mode 100644
index 0000000..a1f6f66
--- /dev/null
+++ b/src/Parser/PHPDocTags.php
@@ -0,0 +1,51 @@
+ $tags
+ */
+ public function __construct(
+ private readonly array $tags,
+ ) {
+ }
+
+ /**
+ * @template TTagValue of PhpDocTagValueNode
+ * @param class-string $class
+ * @return \Generator
+ */
+ public function findTagValues(string $class): \Generator
+ {
+ foreach ($this->tags as $tag) {
+ if ($tag->value instanceof $class) {
+ yield $tag->name => $tag->value;
+ }
+ }
+ }
+
+ /**
+ * @template TTagValue of PhpDocTagValueNode
+ * @param class-string $class
+ * @return ?TTagValue
+ */
+ public function findTagValue(string $class): ?PhpDocTagValueNode
+ {
+ foreach ($this->findTagValues($class) as $tag) {
+ return $tag;
+ }
+
+ return null;
+ }
+}
diff --git a/src/TagPrioritizer.php b/src/TagPrioritizer.php
new file mode 100644
index 0000000..315e37c
--- /dev/null
+++ b/src/TagPrioritizer.php
@@ -0,0 +1,15 @@
+ $index
+ * @param non-empty-string $name
+ */
public function __construct(
+ public readonly int $index,
public readonly string $name,
public readonly Type $constraint = new MixedT(),
public readonly Variance $variance = Variance::INVARIANT,
diff --git a/src/TemplateReflector.php b/src/TemplateReflector.php
deleted file mode 100644
index 6d2f170..0000000
--- a/src/TemplateReflector.php
+++ /dev/null
@@ -1,43 +0,0 @@
-
- */
- public function reflectFunctionTemplates(string $function): array;
-
- /**
- * @param class-string $class
- * @return list
- */
- public function reflectClassTemplates(string $class): array;
-
- /**
- * @param class-string $class
- * @return ?NamedObjectT
- */
- public function reflectClassTemplateExtends(string $class): ?NamedObjectT;
-
- /**
- * @param class-string $class
- * @return list
- */
- public function reflectClassTemplateImplements(string $class): array;
-
- /**
- * @param class-string $class
- * @return list
- */
- public function reflectMethodTemplates(string $class, string $method): array;
-}
diff --git a/src/TypeReflector.php b/src/TypeReflector.php
index 0f3e128..4e9c978 100644
--- a/src/TypeReflector.php
+++ b/src/TypeReflector.php
@@ -2,42 +2,542 @@
declare(strict_types=1);
-namespace PHP\ExtendedTypeSystem\TypeReflection;
+namespace ExtendedTypeSystem;
-use PHP\ExtendedTypeSystem\Type\Type;
+use ExtendedTypeSystem\Metadata\Metadata;
+use ExtendedTypeSystem\Metadata\MetadataFactory;
+use ExtendedTypeSystem\NameResolution\NameResolverFactory;
+use ExtendedTypeSystem\Parser\PHPDocParser;
+use ExtendedTypeSystem\Type\ArrayKeyT;
+use ExtendedTypeSystem\Type\ArrayShapeItem;
+use ExtendedTypeSystem\Type\ArrayShapeT;
+use ExtendedTypeSystem\Type\ArrayT;
+use ExtendedTypeSystem\Type\BoolT;
+use ExtendedTypeSystem\Type\CallableT;
+use ExtendedTypeSystem\Type\FalseT;
+use ExtendedTypeSystem\Type\FloatLiteralT;
+use ExtendedTypeSystem\Type\FloatT;
+use ExtendedTypeSystem\Type\IntersectionT;
+use ExtendedTypeSystem\Type\IntLiteralT;
+use ExtendedTypeSystem\Type\IntT;
+use ExtendedTypeSystem\Type\IterableT;
+use ExtendedTypeSystem\Type\ListT;
+use ExtendedTypeSystem\Type\MixedT;
+use ExtendedTypeSystem\Type\NamedObjectT;
+use ExtendedTypeSystem\Type\NeverT;
+use ExtendedTypeSystem\Type\NonEmptyArrayT;
+use ExtendedTypeSystem\Type\NonEmptyListT;
+use ExtendedTypeSystem\Type\NonEmptyStringT;
+use ExtendedTypeSystem\Type\NullableT;
+use ExtendedTypeSystem\Type\NullT;
+use ExtendedTypeSystem\Type\NumericStringT;
+use ExtendedTypeSystem\Type\NumericT;
+use ExtendedTypeSystem\Type\ObjectT;
+use ExtendedTypeSystem\Type\PositiveIntT;
+use ExtendedTypeSystem\Type\ScalarT;
+use ExtendedTypeSystem\Type\StaticT;
+use ExtendedTypeSystem\Type\StringLiteralT;
+use ExtendedTypeSystem\Type\StringT;
+use ExtendedTypeSystem\Type\TrueT;
+use ExtendedTypeSystem\Type\UnionT;
+use ExtendedTypeSystem\Type\VoidT;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\Types\ContextFactory;
+use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprFloatNode;
+use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode;
+use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode;
+use PHPStan\PhpDocParser\Ast\PhpDoc\ExtendsTagValueNode;
+use PHPStan\PhpDocParser\Ast\PhpDoc\ImplementsTagValueNode;
+use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
+use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
+use PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode;
+use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode;
+use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode;
+use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode;
+use PHPStan\PhpDocParser\Ast\Type\ConstTypeNode;
+use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
+use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
+use PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode;
+use PHPStan\PhpDocParser\Ast\Type\NullableTypeNode;
+use PHPStan\PhpDocParser\Ast\Type\TypeNode;
+use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode;
+use PHPStan\PhpDocParser\Lexer\Lexer;
+use PHPStan\PhpDocParser\Parser\ConstExprParser;
+use PHPStan\PhpDocParser\Parser\PhpDocParser as PHPStanPhpDocParser;
+use PHPStan\PhpDocParser\Parser\TypeParser;
+use PHPyh\LRUMemoizer\LRUMemoizer;
/**
* @psalm-api
*/
-interface TypeReflector
+final class TypeReflector
{
+ private readonly MetadataFactory $metadataFactory;
+
+ public function __construct(
+ TagPrioritizer $tagPrioritizer = new PHPStanOverPsalmOverOtherTagsPrioritizer(),
+ LRUMemoizer $memoizer = new LRUMemoizer(),
+ PHPStanPhpDocParser $phpDocParser = new PHPStanPhpDocParser(new TypeParser(new ConstExprParser()), new ConstExprParser()),
+ Lexer $phpDocLexer = new Lexer(),
+ ContextFactory $contextFactory = new ContextFactory(),
+ FqsenResolver $fqsenResolver = new FqsenResolver(),
+ ) {
+ $this->metadataFactory = new MetadataFactory(
+ memoizer: $memoizer,
+ phpDocParser: new PHPDocParser(
+ parser: $phpDocParser,
+ lexer: $phpDocLexer,
+ prioritizer: $tagPrioritizer,
+ ),
+ nameResolverFactory: new NameResolverFactory(
+ contextFactory: $contextFactory,
+ fqsenResolver: $fqsenResolver,
+ ),
+ );
+ }
+
/**
+ * @param non-empty-string $type
* @param ?class-string $scopeClass
*/
- public function reflectTypeFromString(string $type, ?string $scopeClass = null): ?Type;
+ public function reflectTypeFromString(string $type, ?string $scopeClass = null): ?Type
+ {
+ $metadata = $this->metadataFactory->fromStringMetadata("/** @var {$type} */", $scopeClass);
+ $tagValue = $metadata->phpDocTags->findTagValue(VarTagValueNode::class);
+
+ if ($tagValue === null) {
+ // todo
+ return null;
+ }
+
+ return $this->reflectTypeNodeType(metadata: $metadata, typeNode: $tagValue->type);
+ }
/**
* @param callable-string|\Closure $function
+ * @param non-empty-string $parameter
*/
- public function reflectFunctionParameterType(string|\Closure $function, string $parameter): ?Type;
+ public function reflectFunctionParameterType(string|\Closure $function, string $parameter): ?Type
+ {
+ $metadata = $this->metadataFactory->functionMetadata($function);
+
+ foreach ($metadata->phpDocTags->findTagValues(ParamTagValueNode::class) as $tagValue) {
+ if ($tagValue->parameterName === '$'.$parameter) {
+ return $this->reflectTypeNodeType($metadata, $tagValue->type);
+ }
+ }
+
+ return $this->reflectReflectionType($metadata, (new \ReflectionParameter($function, $parameter))->getType());
+ }
/**
* @param callable-string|\Closure $function
*/
- public function reflectFunctionReturnType(string|\Closure $function): ?Type;
+ public function reflectFunctionReturnType(string|\Closure $function): ?Type
+ {
+ $metadata = $this->metadataFactory->functionMetadata($function);
+ $tagValue = $metadata->phpDocTags->findTagValue(ReturnTagValueNode::class);
+
+ if ($tagValue !== null) {
+ return $this->reflectTypeNodeType($metadata, $tagValue->type);
+ }
+
+ return $this->reflectReflectionType($metadata, (new \ReflectionFunction($function))->getReturnType());
+ }
+
+ /**
+ * @param class-string $class
+ * @param non-empty-string $property
+ */
+ public function reflectPropertyType(string $class, string $property): ?Type
+ {
+ $metadata = $this->metadataFactory->propertyMetadata($class, $property);
+ $tagValue = $metadata->phpDocTags->findTagValue(VarTagValueNode::class);
+
+ if ($tagValue !== null) {
+ return $this->reflectTypeNodeType($metadata, $tagValue->type);
+ }
+
+ if ($metadata->promoted) {
+ return $this->reflectMethodParameterType(class: $class, method: '__construct', parameter: $property);
+ }
+
+ return $this->reflectReflectionType($metadata, (new \ReflectionProperty($class, $property))->getType());
+ }
+
+ /**
+ * @param class-string $class
+ * @param non-empty-string $method
+ * @param non-empty-string $parameter
+ */
+ public function reflectMethodParameterType(string $class, string $method, string $parameter): ?Type
+ {
+ $metadata = $this->metadataFactory->methodMetadata($class, $method);
+
+ foreach ($metadata->phpDocTags->findTagValues(ParamTagValueNode::class) as $tagValue) {
+ if ($tagValue->parameterName === '$'.$parameter) {
+ return $this->reflectTypeNodeType($metadata, $tagValue->type);
+ }
+ }
+
+ return $this->reflectReflectionType($metadata, (new \ReflectionParameter([$class, $method], $parameter))->getType());
+ }
+
+ /**
+ * @param class-string $class
+ * @param non-empty-string $method
+ */
+ public function reflectMethodReturnType(string $class, string $method): ?Type
+ {
+ $metadata = $this->metadataFactory->methodMetadata($class, $method);
+ $tagValue = $metadata->phpDocTags->findTagValue(ReturnTagValueNode::class);
+
+ if ($tagValue !== null) {
+ return $this->reflectTypeNodeType($metadata, $tagValue->type);
+ }
+
+ return $this->reflectReflectionType($metadata, (new \ReflectionMethod($class, $method))->getReturnType());
+ }
+
+ /**
+ * @param callable-string $function
+ * @return list
+ */
+ public function reflectFunctionTemplates(string $function): array
+ {
+ return $this->reflectTemplates($this->metadataFactory->functionMetadata($function));
+ }
/**
* @param class-string $class
+ * @return list
*/
- public function reflectPropertyType(string $class, string $property): ?Type;
+ public function reflectClassTemplates(string $class): array
+ {
+ return $this->reflectTemplates($this->metadataFactory->classMetadata($class));
+ }
/**
* @param class-string $class
*/
- public function reflectMethodParameterType(string $class, string $method, string $parameter): ?Type;
+ public function reflectClassTemplateExtends(string $class): ?NamedObjectT
+ {
+ $metadata = $this->metadataFactory->classMetadata($class);
+ $tagValue = $metadata->phpDocTags->findTagValue(ExtendsTagValueNode::class);
+
+ if ($tagValue === null) {
+ return null;
+ }
+
+ $type = $this->reflectTypeNodeType($metadata, $tagValue->type);
+
+ if (!$type instanceof NamedObjectT) {
+ throw new \LogicException(sprintf(
+ '%s of %s must have been reflected to NamedObjectT.',
+ (string) $tagValue->type,
+ $class,
+ ));
+ }
+
+ return $type;
+ }
+
+ /**
+ * @param class-string $class
+ * @return list
+ */
+ public function reflectClassTemplateImplements(string $class): array
+ {
+ $metadata = $this->metadataFactory->classMetadata($class);
+ $types = [];
+
+ foreach ($metadata->phpDocTags->findTagValues(ImplementsTagValueNode::class) as $tagValue) {
+ $type = $this->reflectTypeNodeType($metadata, $tagValue->type);
+
+ if (!$type instanceof NamedObjectT) {
+ throw new \LogicException(sprintf(
+ '%s of %s must have been reflected to NamedObjectT.',
+ (string) $tagValue->type,
+ $class,
+ ));
+ }
+
+ $types[] = $type;
+ }
+
+ return $types;
+ }
/**
* @param class-string $class
+ * @param non-empty-string $method
*/
- public function reflectMethodReturnType(string $class, string $method): ?Type;
+ public function reflectMethodTemplates(string $class, string $method): array
+ {
+ return $this->reflectTemplates($this->metadataFactory->methodMetadata($class, $method));
+ }
+
+ /**
+ * @return list
+ */
+ private function reflectTemplates(Metadata $metadata): array
+ {
+ $index = 0;
+ $templates = [];
+
+ foreach ($metadata->phpDocTags->findTagValues(TemplateTagValueNode::class) as $tagName => $tagValue) {
+ $templates[] = new Template(
+ index: $index,
+ name: $tagValue->name ?: throw new \LogicException('Tag cannot have empty name.'),
+ constraint: $this->reflectTypeNodeType($metadata, $tagValue->bound) ?? new MixedT(),
+ variance: match (true) {
+ str_ends_with($tagName, 'covariant') => Variance::COVARIANT,
+ str_ends_with($tagName, 'contravariant') => Variance::CONTRAVARIANT,
+ default => Variance::INVARIANT,
+ },
+ );
+ ++$index;
+ }
+
+ return $templates;
+ }
+
+ /**
+ * @return ($typeNode is null ? null : Type)
+ */
+ private function reflectTypeNodeType(Metadata $metadata, ?TypeNode $typeNode): ?Type
+ {
+ if ($typeNode === null) {
+ return null;
+ }
+
+ if ($typeNode instanceof NullableTypeNode) {
+ return new NullableT($this->reflectTypeNodeType($metadata, $typeNode->type));
+ }
+
+ if ($typeNode instanceof ArrayTypeNode) {
+ return new ArrayT(valueType: $this->reflectTypeNodeType($metadata, $typeNode->type));
+ }
+
+ if ($typeNode instanceof ArrayShapeNode) {
+ return $this->reflectArrayShapeNodeType($metadata, $typeNode);
+ }
+
+ if ($typeNode instanceof UnionTypeNode) {
+ if ($typeNode->types === []) {
+ return new MixedT();
+ }
+
+ return new UnionT(...array_values(array_map(
+ fn (TypeNode $node): Type => $this->reflectTypeNodeType($metadata, $node),
+ $typeNode->types,
+ )));
+ }
+
+ if ($typeNode instanceof IntersectionTypeNode) {
+ if ($typeNode->types === []) {
+ return new MixedT();
+ }
+
+ return new IntersectionT(...array_values(array_map(
+ fn (TypeNode $node): Type => $this->reflectTypeNodeType($metadata, $node),
+ $typeNode->types,
+ )));
+ }
+
+ if ($typeNode instanceof ConstTypeNode) {
+ $exprNode = $typeNode->constExpr;
+
+ if ($exprNode instanceof ConstExprIntegerNode) {
+ return new IntLiteralT((int) $exprNode->value);
+ }
+
+ if ($exprNode instanceof ConstExprFloatNode) {
+ return new FloatLiteralT((float) $exprNode->value);
+ }
+
+ if ($exprNode instanceof ConstExprStringNode) {
+ /** @var literal-string $literalString */
+ $literalString = $exprNode->value;
+
+ return new StringLiteralT($literalString);
+ }
+ }
+
+ if ($typeNode instanceof GenericTypeNode) {
+ return $this->reflectIdentifierType(
+ $metadata,
+ $typeNode->type->name,
+ array_values(array_map(
+ fn (TypeNode $typeNode): Type => $this->reflectTypeNodeType($metadata, $typeNode),
+ $typeNode->genericTypes,
+ )),
+ );
+ }
+
+ if ($typeNode instanceof IdentifierTypeNode) {
+ return $this->reflectIdentifierType($metadata, $typeNode->name);
+ }
+
+ throw new \LogicException(sprintf('%s is not supported by %s.', $typeNode::class, self::class));
+ }
+
+ private function reflectArrayShapeNodeType(Metadata $metadata, ArrayShapeNode $node): ArrayShapeT
+ {
+ $items = [];
+
+ foreach ($node->items as $item) {
+ $type = new ArrayShapeItem(
+ type: $this->reflectTypeNodeType($metadata, $item->valueType),
+ optional: $item->optional,
+ );
+
+ if ($item->keyName === null) {
+ $items[] = $type;
+
+ continue;
+ }
+
+ $keyName = $item->keyName;
+
+ $key = match ($keyName::class) {
+ ConstExprIntegerNode::class => (int) $keyName->value,
+ ConstExprStringNode::class => $keyName->value,
+ IdentifierTypeNode::class => $keyName->name,
+ default => throw new \LogicException(sprintf('%s is not supported by %s.', $keyName::class, self::class)),
+ };
+
+ $items[$key] = $type;
+ }
+
+ return new ArrayShapeT($items);
+ }
+
+ /**
+ * @return ($reflectionType is null ? null : Type)
+ */
+ private function reflectReflectionType(Metadata $metadata, ?\ReflectionType $reflectionType): ?Type
+ {
+ if ($reflectionType === null) {
+ return null;
+ }
+
+ if ($reflectionType instanceof \ReflectionNamedType) {
+ $type = $this->reflectIdentifierType($metadata, $reflectionType->getName());
+
+ if ($reflectionType->allowsNull() && !$type instanceof NullT && !$type instanceof MixedT) {
+ return new NullableT($type);
+ }
+
+ return $type;
+ }
+
+ if ($reflectionType instanceof \ReflectionUnionType) {
+ return new UnionT(...array_map(
+ fn (\ReflectionType $typePart): Type => $this->reflectReflectionType($metadata, $typePart),
+ $reflectionType->getTypes(),
+ ));
+ }
+
+ if ($reflectionType instanceof \ReflectionIntersectionType) {
+ return new IntersectionT(...array_map(
+ fn (\ReflectionType $typePart): Type => $this->reflectReflectionType($metadata, $typePart),
+ $reflectionType->getTypes(),
+ ));
+ }
+
+ throw new \LogicException(sprintf('%s is not supported by %s.', $reflectionType::class, self::class));
+ }
+
+ /**
+ * @param list $templateArguments
+ */
+ private function reflectIdentifierType(Metadata $metadata, string $name, array $templateArguments = []): Type
+ {
+ if ($name === 'list') {
+ return new ListT($templateArguments[0] ?? new MixedT());
+ }
+
+ if ($name === 'non-empty-list') {
+ return new NonEmptyListT($templateArguments[0] ?? new MixedT());
+ }
+
+ if ($name === 'array') {
+ return new ArrayT(...$this->resolveArrayTemplateArguments($templateArguments));
+ }
+
+ if ($name === 'non-empty-array') {
+ return new NonEmptyArrayT(...$this->resolveArrayTemplateArguments($templateArguments));
+ }
+
+ if ($name === 'iterable') {
+ if (\count($templateArguments) <= 1) {
+ return new IterableT(valueType: $templateArguments[0] ?? new MixedT());
+ }
+
+ return new IterableT($templateArguments[0], $templateArguments[1]);
+ }
+
+ return match ($name) {
+ '' => throw new \LogicException('Name cannot be empty.'),
+ 'null' => new NullT(),
+ 'true' => new TrueT(),
+ 'false' => new FalseT(),
+ 'bool' => new BoolT(),
+ 'float' => new FloatT(),
+ 'int' => new IntT(),
+ 'positive-int' => new PositiveIntT(),
+ 'numeric' => new NumericT(),
+ 'string' => new StringT(),
+ 'non-empty-string' => new NonEmptyStringT(),
+ 'numeric-string' => new NumericStringT(),
+ 'scalar' => new ScalarT(),
+ 'object' => new ObjectT(),
+ 'callable' => new CallableT(),
+ 'mixed' => new MixedT(),
+ 'void' => new VoidT(),
+ 'never' => new NeverT(),
+ default => $metadata->tryReflectTemplateT($name)
+ ?? $this->tryReflectClassType($metadata, $name, $templateArguments)
+ ?? throw new \LogicException(sprintf('Failed to resolve name %s.', $name)),
+ };
+ }
+
+ /**
+ * @param list $templateArguments
+ * @return array{Type, Type}
+ */
+ private function resolveArrayTemplateArguments(array $templateArguments): array
+ {
+ if (\count($templateArguments) <= 1) {
+ return [new ArrayKeyT(), $templateArguments[0] ?? new MixedT()];
+ }
+
+ $keyType = $templateArguments[0];
+
+ if (!($keyType instanceof ArrayKeyT || $keyType instanceof IntT || $keyType instanceof StringT)) {
+ throw new \LogicException(sprintf('Invalid array key type %s.', TypeStringifier::stringify($keyType)));
+ }
+
+ /** @var array{Type, Type} */
+ return [$keyType, $templateArguments[1]];
+ }
+
+ /**
+ * @param list $templateArguments
+ */
+ private function tryReflectClassType(Metadata $metadata, string $name, array $templateArguments): null|NamedObjectT|StaticT
+ {
+ $resolvedName = $metadata->resolveName($name);
+
+ if ($resolvedName instanceof StaticT) {
+ return new StaticT($resolvedName->class, ...$templateArguments);
+ }
+
+ if (class_exists($resolvedName) || interface_exists($resolvedName)) {
+ return new NamedObjectT(ltrim($resolvedName, '\\'), ...$templateArguments);
+ }
+
+ return null;
+ }
}
diff --git a/src/TypeReflectorChain.php b/src/TypeReflectorChain.php
deleted file mode 100644
index f07e815..0000000
--- a/src/TypeReflectorChain.php
+++ /dev/null
@@ -1,99 +0,0 @@
- $typeReflectors
- */
- public function __construct(
- private readonly iterable $typeReflectors,
- ) {
- }
-
- public function reflectTypeFromString(string $type, ?string $scopeClass = null): ?Type
- {
- foreach ($this->typeReflectors as $typeReflector) {
- $reflectedType = $typeReflector->reflectTypeFromString($type, $scopeClass);
-
- if ($reflectedType !== null) {
- return $reflectedType;
- }
- }
-
- return null;
- }
-
- public function reflectFunctionParameterType(string|\Closure $function, string $parameter): ?Type
- {
- foreach ($this->typeReflectors as $typeReflector) {
- $type = $typeReflector->reflectFunctionParameterType($function, $parameter);
-
- if ($type !== null) {
- return $type;
- }
- }
-
- return null;
- }
-
- public function reflectFunctionReturnType(string|\Closure $function): ?Type
- {
- foreach ($this->typeReflectors as $typeReflector) {
- $type = $typeReflector->reflectFunctionReturnType($function);
-
- if ($type !== null) {
- return $type;
- }
- }
-
- return null;
- }
-
- public function reflectPropertyType(string $class, string $property): ?Type
- {
- foreach ($this->typeReflectors as $typeReflector) {
- $type = $typeReflector->reflectPropertyType($class, $property);
-
- if ($type !== null) {
- return $type;
- }
- }
-
- return null;
- }
-
- public function reflectMethodParameterType(string $class, string $method, string $parameter): ?Type
- {
- foreach ($this->typeReflectors as $typeReflector) {
- $type = $typeReflector->reflectMethodParameterType($class, $method, $parameter);
-
- if ($type !== null) {
- return $type;
- }
- }
-
- return null;
- }
-
- public function reflectMethodReturnType(string $class, string $method): ?Type
- {
- foreach ($this->typeReflectors as $typeReflector) {
- $type = $typeReflector->reflectMethodReturnType($class, $method);
-
- if ($type !== null) {
- return $type;
- }
- }
-
- return null;
- }
-}
diff --git a/src/Variance.php b/src/Variance.php
index e9d03ae..0dfbc06 100644
--- a/src/Variance.php
+++ b/src/Variance.php
@@ -2,7 +2,7 @@
declare(strict_types=1);
-namespace PHP\ExtendedTypeSystem\TypeReflection;
+namespace ExtendedTypeSystem;
/**
* @psalm-api
diff --git a/tests/NativeTypeReflectorTest.php b/tests/NativeTypeReflectorTest.php
new file mode 100644
index 0000000..e47aa7d
--- /dev/null
+++ b/tests/NativeTypeReflectorTest.php
@@ -0,0 +1,543 @@
+remove(self::STUBS_DIR);
+ }
+
+ public static function tearDownAfterClass(): void
+ {
+ (new Filesystem())->remove(self::STUBS_DIR);
+ }
+
+ /**
+ * @return callable-string
+ */
+ private static function generateFunctionName(): string
+ {
+ /** @var callable-string */
+ return uniqid('function_');
+ }
+
+ /**
+ * @return class-string
+ */
+ private static function generateClassName(): string
+ {
+ /** @var class-string */
+ return uniqid('class_');
+ }
+
+ private static function require(string $code): void
+ {
+ $file = self::STUBS_DIR.'/'.uniqid(more_entropy: true).'.php';
+ (new Filesystem())->dumpFile($file, "reflectTypeFromString($type);
+
+ assertEquals($expectedType, $reflectedType);
+ }
+
+ public function testItReflectsSelfTypeFromString(): void
+ {
+ $reflector = new TypeReflector();
+
+ $reflectedType = $reflector->reflectTypeFromString('self', self::class);
+
+ assertEquals(new NamedObjectT(self::class), $reflectedType);
+ }
+
+ public function testItReflectsParentTypeFromString(): void
+ {
+ $reflector = new TypeReflector();
+
+ $reflectedType = $reflector->reflectTypeFromString('parent', self::class);
+
+ assertEquals(new NamedObjectT(parent::class), $reflectedType);
+ }
+
+ public function testItReflectsStaticTypeFromString(): void
+ {
+ $reflector = new TypeReflector();
+
+ $reflectedType = $reflector->reflectTypeFromString('static', self::class);
+
+ assertEquals(new NamedObjectT(self::class), $reflectedType);
+ }
+
+ /**
+ * @dataProvider types
+ * @dataProvider callableType
+ */
+ public function testItReflectsFunctionParameterType(string $type, ?Type $expectedType): void
+ {
+ $function = self::generateFunctionName();
+ self::require(
+ <<reflectFunctionParameterType($function, 'test');
+
+ assertEquals($expectedType, $reflectedType);
+ }
+
+ /**
+ * @dataProvider types
+ * @dataProvider callableType
+ * @dataProvider voidType
+ * @dataProvider neverType
+ */
+ public function testItReflectsFunctionReturnType(string $type, ?Type $expectedType): void
+ {
+ $typeDeclaration = $type === '' ? '' : ': '.$type;
+ $function = self::generateFunctionName();
+ self::require(
+ <<reflectFunctionReturnType($function);
+
+ assertEquals($expectedType, $reflectedType);
+ }
+
+ /**
+ * @dataProvider types
+ */
+ public function testItReflectsPropertyType(string $type, ?Type $expectedType): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals($expectedType, $reflectedType);
+ }
+
+ public function testItReflectsPropertySelfType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals(new NamedObjectT($class), $reflectedType);
+ }
+
+ public function testItReflectsPropertyParentType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ public function testItReflectsPropertyInheritedParentType(): void
+ {
+ $baseClass = self::generateClassName();
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ /**
+ * @dataProvider types
+ */
+ public function testItReflectsPromotedPropertyType(string $type, ?Type $expectedType): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals($expectedType, $reflectedType);
+ }
+
+ public function testItReflectsPromotedPropertySelfType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals(new NamedObjectT($class), $reflectedType);
+ }
+
+ public function testItReflectsPromotedPropertyParentType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ public function testItReflectsPromotedPropertyInheritedParentType(): void
+ {
+ $baseClass = self::generateClassName();
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ /**
+ * @dataProvider types
+ * @dataProvider callableType
+ */
+ public function testItReflectsMethodParameterType(string $type, ?Type $expectedType): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodParameterType($class, 'test', 'test');
+
+ assertEquals($expectedType, $reflectedType);
+ }
+
+ public function testItReflectsMethodSelfParameterType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodParameterType($class, 'test', 'test');
+
+ assertEquals(new NamedObjectT($class), $reflectedType);
+ }
+
+ public function testItReflectsMethodParentParameterType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodParameterType($class, 'test', 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ public function testItReflectsMethodInheritedParentParameterType(): void
+ {
+ $baseClass = self::generateClassName();
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodParameterType($class, 'test', 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ /**
+ * @dataProvider types
+ * @dataProvider callableType
+ */
+ public function testItReflectsMethodReturnType(string $type, ?Type $expectedType): void
+ {
+ $typeDeclaration = $type === '' ? '' : ': '.$type;
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodReturnType($class, 'test');
+
+ assertEquals($expectedType, $reflectedType);
+ }
+
+ public function testItReflectsMethodSelfReturnType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodReturnType($class, 'test');
+
+ assertEquals(new NamedObjectT($class), $reflectedType);
+ }
+
+ public function testItReflectsMethodParentReturnType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodReturnType($class, 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ public function testItReflectsMethodInheritedParentReturnType(): void
+ {
+ $baseClass = self::generateClassName();
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodReturnType($class, 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ public function testItReflectsMethodStaticReturnType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodReturnType($class, 'test');
+
+ assertEquals(new StaticT($class), $reflectedType);
+ }
+
+ public function testItReflectsMethodInheritedStaticReturnType(): void
+ {
+ $baseClass = self::generateClassName();
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodReturnType($class, 'test');
+
+ assertEquals(new StaticT($baseClass), $reflectedType);
+ }
+
+ /**
+ * @return \Generator
+ */
+ public function types(): \Generator
+ {
+ yield 'no type' => ['', null];
+ yield 'bool' => ['bool', new BoolT()];
+ yield 'int' => ['int', new IntT()];
+ yield 'float' => ['float', new FloatT()];
+ yield 'string' => ['string', new StringT()];
+ yield 'array' => ['array', new ArrayT()];
+ yield 'iterable' => ['iterable', new IterableT()];
+ yield 'object' => ['object', new ObjectT()];
+ yield 'mixed' => ['mixed', new MixedT()];
+ yield '\Closure' => ['\Closure', new NamedObjectT(\Closure::class)];
+ yield 'string|int|null' => ['string|int|null', new UnionT(new StringT(), new IntT(), new NullT())];
+ yield 'string|false' => ['string|false', new UnionT(new StringT(), new FalseT())];
+ yield '\Countable&\Traversable' => ['\Countable&\Traversable', new IntersectionT(new NamedObjectT(\Countable::class), new NamedObjectT(\Traversable::class))];
+ yield '?int' => ['?int', new NullableT(new IntT())];
+
+ if (\PHP_VERSION_ID >= 80200) {
+ yield 'null' => ['null', new NullT()];
+ yield 'true' => ['true', new TrueT()];
+ yield 'false' => ['false', new FalseT()];
+ yield '(\Countable&\Traversable)|string' => ['(\Countable&\Traversable)|string', new UnionT(
+ new IntersectionT(new NamedObjectT(\Countable::class), new NamedObjectT(\Traversable::class)),
+ new StringT(),
+ )];
+ }
+ }
+
+ /**
+ * @return \Generator
+ */
+ public function callableType(): \Generator
+ {
+ yield 'callable' => ['callable', new CallableT()];
+ }
+
+ /**
+ * @return \Generator
+ */
+ public function voidType(): \Generator
+ {
+ yield 'void' => ['void', new VoidT()];
+ }
+
+ /**
+ * @return \Generator
+ */
+ public function neverType(): \Generator
+ {
+ yield 'never' => ['never', new NeverT()];
+ }
+}
diff --git a/tests/PHPDocTypeReflectorTest.php b/tests/PHPDocTypeReflectorTest.php
new file mode 100644
index 0000000..8e1fb6a
--- /dev/null
+++ b/tests/PHPDocTypeReflectorTest.php
@@ -0,0 +1,577 @@
+remove(self::STUBS_DIR);
+ }
+
+ public static function tearDownAfterClass(): void
+ {
+ (new Filesystem())->remove(self::STUBS_DIR);
+ }
+
+ /**
+ * @return callable-string
+ */
+ private static function generateFunctionName(): string
+ {
+ /** @var callable-string */
+ return uniqid('function_');
+ }
+
+ /**
+ * @return class-string
+ */
+ private static function generateClassName(): string
+ {
+ /** @var class-string */
+ return uniqid('class_');
+ }
+
+ private static function require(string $code): void
+ {
+ $file = self::STUBS_DIR.'/'.uniqid(more_entropy: true).'.php';
+ (new Filesystem())->dumpFile($file, "reflectTypeFromString($type);
+
+ assertEquals($expectedType, $reflectedType);
+ }
+
+ public function testItReflectsSelfTypeFromString(): void
+ {
+ $reflector = new TypeReflector();
+
+ $reflectedType = $reflector->reflectTypeFromString('self', self::class);
+
+ assertEquals(new NamedObjectT(self::class), $reflectedType);
+ }
+
+ public function testItReflectsParentTypeFromString(): void
+ {
+ $reflector = new TypeReflector();
+
+ $reflectedType = $reflector->reflectTypeFromString('parent', self::class);
+
+ assertEquals(new NamedObjectT(parent::class), $reflectedType);
+ }
+
+ public function testItReflectsStaticTypeFromString(): void
+ {
+ $reflector = new TypeReflector();
+
+ $reflectedType = $reflector->reflectTypeFromString('static', self::class);
+
+ assertEquals(new NamedObjectT(static::class), $reflectedType);
+ }
+
+ /**
+ * @dataProvider types
+ * @dataProvider callableType
+ */
+ public function testItReflectsFunctionParameterType(string $type, ?Type $expectedType): void
+ {
+ $function = self::generateFunctionName();
+ self::require(
+ <<reflectFunctionParameterType($function, 'test');
+
+ assertEquals($expectedType, $reflectedType);
+ }
+
+ /**
+ * @dataProvider types
+ * @dataProvider callableType
+ * @dataProvider voidType
+ * @dataProvider neverType
+ */
+ public function testItReflectsFunctionReturnType(string $type, ?Type $expectedType): void
+ {
+ $function = self::generateFunctionName();
+ self::require(
+ <<reflectFunctionReturnType($function);
+
+ assertEquals($expectedType, $reflectedType);
+ }
+
+ /**
+ * @dataProvider types
+ */
+ public function testItReflectsPropertyType(string $type, ?Type $expectedType): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals($expectedType, $reflectedType);
+ }
+
+ public function testItReflectsPropertySelfType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals(new NamedObjectT($class), $reflectedType);
+ }
+
+ public function testItReflectsPropertyParentType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ public function testItReflectsPropertyInheritedParentType(): void
+ {
+ $baseClass = self::generateClassName();
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ /**
+ * @dataProvider types
+ */
+ public function testItReflectsPromotedPropertyType(string $type, ?Type $expectedType): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals($expectedType, $reflectedType);
+ }
+
+ public function testItReflectsPromotedPropertySelfType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals(new NamedObjectT($class), $reflectedType);
+ }
+
+ public function testItReflectsPromotedPropertyParentType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ public function testItReflectsPromotedPropertyInheritedParentType(): void
+ {
+ $baseClass = self::generateClassName();
+ $class = self::generateClassName();
+ self::require(
+ <<reflectPropertyType($class, 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ /**
+ * @dataProvider types
+ * @dataProvider callableType
+ */
+ public function testItReflectsMethodParameterType(string $type, ?Type $expectedType): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodParameterType($class, 'test', 'test');
+
+ assertEquals($expectedType, $reflectedType);
+ }
+
+ public function testItReflectsMethodSelfParameterType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodParameterType($class, 'test', 'test');
+
+ assertEquals(new NamedObjectT($class), $reflectedType);
+ }
+
+ public function testItReflectsMethodParentParameterType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodParameterType($class, 'test', 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ public function testItReflectsMethodInheritedParentParameterType(): void
+ {
+ $baseClass = self::generateClassName();
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodParameterType($class, 'test', 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ /**
+ * @dataProvider types
+ * @dataProvider callableType
+ */
+ public function testItReflectsMethodReturnType(string $type, ?Type $expectedType): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodReturnType($class, 'test');
+
+ assertEquals($expectedType, $reflectedType);
+ }
+
+ public function testItReflectsMethodSelfReturnType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodReturnType($class, 'test');
+
+ assertEquals(new NamedObjectT($class), $reflectedType);
+ }
+
+ public function testItReflectsMethodParentReturnType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodReturnType($class, 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ public function testItReflectsMethodInheritedParentReturnType(): void
+ {
+ $baseClass = self::generateClassName();
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodReturnType($class, 'test');
+
+ assertEquals(new NamedObjectT(\ArrayObject::class), $reflectedType);
+ }
+
+ public function testItReflectsMethodStaticReturnType(): void
+ {
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodReturnType($class, 'test');
+
+ assertEquals(new StaticT($class), $reflectedType);
+ }
+
+ public function testItReflectsMethodInheritedStaticReturnType(): void
+ {
+ $baseClass = self::generateClassName();
+ $class = self::generateClassName();
+ self::require(
+ <<reflectMethodReturnType($class, 'test');
+
+ assertEquals(new StaticT($baseClass), $reflectedType);
+ }
+
+ /**
+ * @return \Generator
+ */
+ public function types(): \Generator
+ {
+ yield 'no type' => ['', null];
+ yield 'bool' => ['bool', new BoolT()];
+ yield 'int' => ['int', new IntT()];
+ yield 'float' => ['float', new FloatT()];
+ yield 'string' => ['string', new StringT()];
+ yield 'array' => ['array', new ArrayT()];
+ yield 'iterable' => ['iterable', new IterableT()];
+ yield 'object' => ['object', new ObjectT()];
+ yield 'mixed' => ['mixed', new MixedT()];
+ yield '\Closure' => ['\Closure', new NamedObjectT(\Closure::class)];
+ yield 'string|int|null' => ['string|int|null', new UnionT(new StringT(), new IntT(), new NullT())];
+ yield 'string|false' => ['string|false', new UnionT(new StringT(), new FalseT())];
+ yield '\Countable&\Traversable' => ['\Countable&\Traversable', new IntersectionT(new NamedObjectT(\Countable::class), new NamedObjectT(\Traversable::class))];
+ yield '?int' => ['?int', new NullableT(new IntT())];
+
+ if (\PHP_VERSION_ID >= 80200) {
+ yield 'null' => ['null', new NullT()];
+ yield 'true' => ['true', new TrueT()];
+ yield 'false' => ['false', new FalseT()];
+ yield '(\Countable&\Traversable)|string' => ['(\Countable&\Traversable)|string', new UnionT(
+ new IntersectionT(new NamedObjectT(\Countable::class), new NamedObjectT(\Traversable::class)),
+ new StringT(),
+ )];
+ }
+ }
+
+ /**
+ * @return \Generator
+ */
+ public function callableType(): \Generator
+ {
+ yield 'callable' => ['callable', new CallableT()];
+ }
+
+ /**
+ * @return \Generator
+ */
+ public function voidType(): \Generator
+ {
+ yield 'void' => ['void', new VoidT()];
+ }
+
+ /**
+ * @return \Generator
+ */
+ public function neverType(): \Generator
+ {
+ yield 'never' => ['never', new NeverT()];
+ }
+}
diff --git a/tests/PHPStanOverPsalmOverOtherTagsPrioritizerTest.php b/tests/PHPStanOverPsalmOverOtherTagsPrioritizerTest.php
new file mode 100644
index 0000000..7922458
--- /dev/null
+++ b/tests/PHPStanOverPsalmOverOtherTagsPrioritizerTest.php
@@ -0,0 +1,34 @@
+priorityFor('@phpstan-var');
+ $psalmPriority = $prioritizer->priorityFor('@psalm-var');
+
+ self::assertGreaterThan($psalmPriority, $phpStanPriority);
+ }
+
+ public function testPsalmTagHasHigherPriorityOverStandardTag(): void
+ {
+ $prioritizer = new PHPStanOverPsalmOverOtherTagsPrioritizer();
+
+ $psalmPriority = $prioritizer->priorityFor('@psalm-var');
+ $standardTagPriority = $prioritizer->priorityFor('@var');
+
+ self::assertGreaterThan($standardTagPriority, $psalmPriority);
+ }
+}