PK K VK8%
LICENSE.mdnu ٘ Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
- Neither the name of Laminas Foundation nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PK K VF[ [ COPYRIGHT.mdnu ٘ Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC. (https://getlaminas.org/)
PK K Vje .laminas-ci.jsonnu ٘ {
"ignore_php_platform_requirements": {
"8.2": true
},
"extensions": [
"apcu"
],
"ini": [
"apc.enabled=1",
"apc.enable_cli=1"
]
}
PK K VTNg g
composer.locknu ٘ {
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "bc9e65f41e16af18591824fe5e0565e1",
"packages": [
{
"name": "laminas/laminas-cache-storage-adapter-memory",
"version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-cache-storage-adapter-memory.git",
"reference": "e002c7d3fa0d4723589b550d7ab4586befa72366"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-cache-storage-adapter-memory/zipball/e002c7d3fa0d4723589b550d7ab4586befa72366",
"reference": "e002c7d3fa0d4723589b550d7ab4586befa72366",
"shasum": ""
},
"require": {
"laminas/laminas-cache": "^3.0",
"php": "~8.0.0 || ~8.1.0 || ~8.2.0"
},
"conflict": {
"laminas/laminas-servicemanager": "<3.11"
},
"provide": {
"laminas/laminas-cache-storage-implementation": "1.0"
},
"require-dev": {
"laminas/laminas-cache-storage-adapter-benchmark": "^1.0",
"laminas/laminas-cache-storage-adapter-test": "^2.0",
"laminas/laminas-coding-standard": "~2.4.0",
"psalm/plugin-phpunit": "^0.17.0",
"vimeo/psalm": "^4.9"
},
"type": "library",
"extra": {
"laminas": {
"config-provider": "Laminas\\Cache\\Storage\\Adapter\\Memory\\ConfigProvider",
"module": "Laminas\\Cache\\Storage\\Adapter\\Memory"
}
},
"autoload": {
"psr-4": {
"Laminas\\Cache\\Storage\\Adapter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Laminas cache adapter for memory",
"keywords": [
"cache",
"laminas"
],
"support": {
"docs": "https://docs.laminas.dev/laminas-cache-storage-adapter-memory/",
"forum": "https://discourse.laminas.dev/",
"issues": "https://github.com/laminas/laminas-cache-storage-adapter-memory/issues",
"rss": "https://github.com/laminas/laminas-cache-storage-adapter-memory/releases.atom",
"source": "https://github.com/laminas/laminas-cache-storage-adapter-memory"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2022-10-22T14:38:52+00:00"
},
{
"name": "laminas/laminas-eventmanager",
"version": "3.10.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-eventmanager.git",
"reference": "5a5114ab2d3fa4424faa46a2fb0a4e49a61f6eba"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/5a5114ab2d3fa4424faa46a2fb0a4e49a61f6eba",
"reference": "5a5114ab2d3fa4424faa46a2fb0a4e49a61f6eba",
"shasum": ""
},
"require": {
"php": "~8.0.0 || ~8.1.0 || ~8.2.0"
},
"conflict": {
"container-interop/container-interop": "<1.2",
"zendframework/zend-eventmanager": "*"
},
"require-dev": {
"laminas/laminas-coding-standard": "~2.5.0",
"laminas/laminas-stdlib": "^3.15",
"phpbench/phpbench": "^1.2.7",
"phpunit/phpunit": "^9.5.26",
"psalm/plugin-phpunit": "^0.18.0",
"psr/container": "^1.1.2 || ^2.0.2",
"vimeo/psalm": "^5.0.0"
},
"suggest": {
"laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature",
"psr/container": "^1.1.2 || ^2.0.2, to use the lazy listeners feature"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\EventManager\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Trigger and listen to events within a PHP application",
"homepage": "https://laminas.dev",
"keywords": [
"event",
"eventmanager",
"events",
"laminas"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-eventmanager/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-eventmanager/issues",
"rss": "https://github.com/laminas/laminas-eventmanager/releases.atom",
"source": "https://github.com/laminas/laminas-eventmanager"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2023-01-11T19:52:45+00:00"
},
{
"name": "laminas/laminas-servicemanager",
"version": "3.20.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-servicemanager.git",
"reference": "bc2c2cbe2dd90db8b9d16b0618f542692b76ab59"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-servicemanager/zipball/bc2c2cbe2dd90db8b9d16b0618f542692b76ab59",
"reference": "bc2c2cbe2dd90db8b9d16b0618f542692b76ab59",
"shasum": ""
},
"require": {
"laminas/laminas-stdlib": "^3.2.1",
"php": "~8.0.0 || ~8.1.0 || ~8.2.0",
"psr/container": "^1.0"
},
"conflict": {
"ext-psr": "*",
"laminas/laminas-code": "<3.3.1",
"zendframework/zend-code": "<3.3.1",
"zendframework/zend-servicemanager": "*"
},
"provide": {
"psr/container-implementation": "^1.0"
},
"replace": {
"container-interop/container-interop": "^1.2.0"
},
"require-dev": {
"composer/package-versions-deprecated": "^1.11.99.5",
"laminas/laminas-coding-standard": "~2.4.0",
"laminas/laminas-container-config-test": "^0.8",
"laminas/laminas-dependency-plugin": "^2.2",
"mikey179/vfsstream": "^1.6.11@alpha",
"ocramius/proxy-manager": "^2.14.1",
"phpbench/phpbench": "^1.2.7",
"phpunit/phpunit": "^9.5.26",
"psalm/plugin-phpunit": "^0.18.0",
"vimeo/psalm": "^5.0.0"
},
"suggest": {
"ocramius/proxy-manager": "ProxyManager ^2.1.1 to handle lazy initialization of services"
},
"bin": [
"bin/generate-deps-for-config-factory",
"bin/generate-factory-for-class"
],
"type": "library",
"autoload": {
"files": [
"src/autoload.php"
],
"psr-4": {
"Laminas\\ServiceManager\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Factory-Driven Dependency Injection Container",
"homepage": "https://laminas.dev",
"keywords": [
"PSR-11",
"dependency-injection",
"di",
"dic",
"laminas",
"service-manager",
"servicemanager"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-servicemanager/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-servicemanager/issues",
"rss": "https://github.com/laminas/laminas-servicemanager/releases.atom",
"source": "https://github.com/laminas/laminas-servicemanager"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2022-12-01T17:03:38+00:00"
},
{
"name": "laminas/laminas-stdlib",
"version": "3.16.1",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-stdlib.git",
"reference": "f4f773641807c7ccee59b758bfe4ac4ba33ecb17"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/f4f773641807c7ccee59b758bfe4ac4ba33ecb17",
"reference": "f4f773641807c7ccee59b758bfe4ac4ba33ecb17",
"shasum": ""
},
"require": {
"php": "~8.0.0 || ~8.1.0 || ~8.2.0"
},
"conflict": {
"zendframework/zend-stdlib": "*"
},
"require-dev": {
"laminas/laminas-coding-standard": "^2.4.0",
"phpbench/phpbench": "^1.2.7",
"phpunit/phpunit": "^9.5.26",
"psalm/plugin-phpunit": "^0.18.0",
"vimeo/psalm": "^5.0.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\Stdlib\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "SPL extensions, array utilities, error handlers, and more",
"homepage": "https://laminas.dev",
"keywords": [
"laminas",
"stdlib"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-stdlib/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-stdlib/issues",
"rss": "https://github.com/laminas/laminas-stdlib/releases.atom",
"source": "https://github.com/laminas/laminas-stdlib"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2022-12-03T18:48:01+00:00"
},
{
"name": "psr/cache",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/cache.git",
"reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
"reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Cache\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interface for caching libraries",
"keywords": [
"cache",
"psr",
"psr-6"
],
"support": {
"source": "https://github.com/php-fig/cache/tree/master"
},
"time": "2016-08-06T20:24:11+00:00"
},
{
"name": "psr/clock",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/clock.git",
"reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
"reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
"shasum": ""
},
"require": {
"php": "^7.0 || ^8.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Psr\\Clock\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for reading the clock.",
"homepage": "https://github.com/php-fig/clock",
"keywords": [
"clock",
"now",
"psr",
"psr-20",
"time"
],
"support": {
"issues": "https://github.com/php-fig/clock/issues",
"source": "https://github.com/php-fig/clock/tree/1.0.0"
},
"time": "2022-11-25T14:36:26+00:00"
},
{
"name": "psr/container",
"version": "1.1.2",
"source": {
"type": "git",
"url": "https://github.com/php-fig/container.git",
"reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
"reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
"shasum": ""
},
"require": {
"php": ">=7.4.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Psr\\Container\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common Container Interface (PHP FIG PSR-11)",
"homepage": "https://github.com/php-fig/container",
"keywords": [
"PSR-11",
"container",
"container-interface",
"container-interop",
"psr"
],
"support": {
"issues": "https://github.com/php-fig/container/issues",
"source": "https://github.com/php-fig/container/tree/1.1.2"
},
"time": "2021-11-05T16:50:12+00:00"
},
{
"name": "psr/simple-cache",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/simple-cache.git",
"reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
"reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\SimpleCache\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interfaces for simple caching",
"keywords": [
"cache",
"caching",
"psr",
"psr-16",
"simple-cache"
],
"support": {
"source": "https://github.com/php-fig/simple-cache/tree/master"
},
"time": "2017-10-23T01:57:42+00:00"
},
{
"name": "stella-maris/clock",
"version": "0.1.7",
"source": {
"type": "git",
"url": "https://github.com/stella-maris-solutions/clock.git",
"reference": "fa23ce16019289a18bb3446fdecd45befcdd94f8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/stella-maris-solutions/clock/zipball/fa23ce16019289a18bb3446fdecd45befcdd94f8",
"reference": "fa23ce16019289a18bb3446fdecd45befcdd94f8",
"shasum": ""
},
"require": {
"php": "^7.0|^8.0",
"psr/clock": "^1.0"
},
"type": "library",
"autoload": {
"psr-4": {
"StellaMaris\\Clock\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Andreas Heigl",
"role": "Maintainer"
}
],
"description": "A pre-release of the proposed PSR-20 Clock-Interface",
"homepage": "https://gitlab.com/stella-maris/clock",
"keywords": [
"clock",
"datetime",
"point in time",
"psr20"
],
"support": {
"source": "https://github.com/stella-maris-solutions/clock/tree/0.1.7"
},
"time": "2022-11-25T16:15:06+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": "brick/varexporter",
"version": "0.3.7",
"source": {
"type": "git",
"url": "https://github.com/brick/varexporter.git",
"reference": "3e263cd718d242594c52963760fee2059fd5833c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/brick/varexporter/zipball/3e263cd718d242594c52963760fee2059fd5833c",
"reference": "3e263cd718d242594c52963760fee2059fd5833c",
"shasum": ""
},
"require": {
"nikic/php-parser": "^4.0",
"php": "^7.2 || ^8.0"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.2",
"phpunit/phpunit": "^8.5 || ^9.0",
"vimeo/psalm": "4.23.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Brick\\VarExporter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "A powerful alternative to var_export(), which can export closures and objects without __set_state()",
"keywords": [
"var_export"
],
"support": {
"issues": "https://github.com/brick/varexporter/issues",
"source": "https://github.com/brick/varexporter/tree/0.3.7"
},
"funding": [
{
"url": "https://github.com/BenMorel",
"type": "github"
}
],
"time": "2022-06-29T23:37:57+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": "dealerdirect/phpcodesniffer-composer-installer",
"version": "v0.7.2",
"source": {
"type": "git",
"url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git",
"reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db",
"reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db",
"shasum": ""
},
"require": {
"composer-plugin-api": "^1.0 || ^2.0",
"php": ">=5.3",
"squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0"
},
"require-dev": {
"composer/composer": "*",
"php-parallel-lint/php-parallel-lint": "^1.3.1",
"phpcompatibility/php-compatibility": "^9.0"
},
"type": "composer-plugin",
"extra": {
"class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
},
"autoload": {
"psr-4": {
"Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Franck Nijhof",
"email": "franck.nijhof@dealerdirect.com",
"homepage": "http://www.frenck.nl",
"role": "Developer / IT Manager"
},
{
"name": "Contributors",
"homepage": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer/graphs/contributors"
}
],
"description": "PHP_CodeSniffer Standards Composer Installer Plugin",
"homepage": "http://www.dealerdirect.com",
"keywords": [
"PHPCodeSniffer",
"PHP_CodeSniffer",
"code quality",
"codesniffer",
"composer",
"installer",
"phpcbf",
"phpcs",
"plugin",
"qa",
"quality",
"standard",
"standards",
"style guide",
"stylecheck",
"tests"
],
"support": {
"issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues",
"source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer"
},
"time": "2022-02-04T12:51:07+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": "1.14.2",
"source": {
"type": "git",
"url": "https://github.com/doctrine/annotations.git",
"reference": "ad785217c1e9555a7d6c6c8c9f406395a5e2882b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/annotations/zipball/ad785217c1e9555a7d6c6c8c9f406395a5e2882b",
"reference": "ad785217c1e9555a7d6c6c8c9f406395a5e2882b",
"shasum": ""
},
"require": {
"doctrine/lexer": "^1 || ^2",
"ext-tokenizer": "*",
"php": "^7.1 || ^8.0",
"psr/cache": "^1 || ^2 || ^3"
},
"require-dev": {
"doctrine/cache": "^1.11 || ^2.0",
"doctrine/coding-standard": "^9 || ^10",
"phpstan/phpstan": "~1.4.10 || ^1.8.0",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"symfony/cache": "^4.4 || ^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/1.14.2"
},
"time": "2022-12-15T06:48:22+00:00"
},
{
"name": "doctrine/deprecations",
"version": "v1.0.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/deprecations.git",
"reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de",
"reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de",
"shasum": ""
},
"require": {
"php": "^7.1|^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^9",
"phpunit/phpunit": "^7.5|^8.5|^9.5",
"psr/log": "^1|^2|^3"
},
"suggest": {
"psr/log": "Allows logging deprecations via PSR-3 logger implementation"
},
"type": "library",
"autoload": {
"psr-4": {
"Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
"homepage": "https://www.doctrine-project.org/",
"support": {
"issues": "https://github.com/doctrine/deprecations/issues",
"source": "https://github.com/doctrine/deprecations/tree/v1.0.0"
},
"time": "2022-05-02T15:47:09+00:00"
},
{
"name": "doctrine/instantiator",
"version": "1.5.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/instantiator.git",
"reference": "0a0fa9780f5d4e507415a065172d26a98d02047b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b",
"reference": "0a0fa9780f5d4e507415a065172d26a98d02047b",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^9 || ^11",
"ext-pdo": "*",
"ext-phar": "*",
"phpbench/phpbench": "^0.16 || ^1",
"phpstan/phpstan": "^1.4",
"phpstan/phpstan-phpunit": "^1",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"vimeo/psalm": "^4.30 || ^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/1.5.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:15:36+00:00"
},
{
"name": "doctrine/lexer",
"version": "2.1.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/lexer.git",
"reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124",
"reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124",
"shasum": ""
},
"require": {
"doctrine/deprecations": "^1.0",
"php": "^7.1 || ^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^9 || ^10",
"phpstan/phpstan": "^1.3",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"psalm/plugin-phpunit": "^0.18.3",
"vimeo/psalm": "^4.11 || ^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/2.1.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-14T08:49:07+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.4.1",
"source": {
"type": "git",
"url": "https://github.com/theofidry/cpu-core-counter.git",
"reference": "79261cc280aded96d098e1b0e0ba0c4881b432c2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/79261cc280aded96d098e1b0e0ba0c4881b432c2",
"reference": "79261cc280aded96d098e1b0e0ba0c4881b432c2",
"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.4.1"
},
"funding": [
{
"url": "https://github.com/theofidry",
"type": "github"
}
],
"time": "2022-12-16T22:01:02+00:00"
},
{
"name": "laminas/laminas-cache-storage-adapter-apcu",
"version": "2.4.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-cache-storage-adapter-apcu.git",
"reference": "89561dee942fbdb76647ec939f0dfa6a1db6f9f4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-cache-storage-adapter-apcu/zipball/89561dee942fbdb76647ec939f0dfa6a1db6f9f4",
"reference": "89561dee942fbdb76647ec939f0dfa6a1db6f9f4",
"shasum": ""
},
"require": {
"ext-apcu": "^5.1.10",
"laminas/laminas-cache": "^3.0",
"php": "~8.0.0 || ~8.1.0 || ~8.2.0"
},
"provide": {
"laminas/laminas-cache-storage-implementation": "1.0"
},
"require-dev": {
"laminas/laminas-cache-storage-adapter-test": "^2.0",
"laminas/laminas-coding-standard": "~2.4.0",
"psalm/plugin-phpunit": "^0.18.0",
"vimeo/psalm": "^5.0.0"
},
"type": "library",
"extra": {
"laminas": {
"config-provider": "Laminas\\Cache\\Storage\\Adapter\\Apcu\\ConfigProvider",
"module": "Laminas\\Cache\\Storage\\Adapter\\Apcu"
}
},
"autoload": {
"psr-4": {
"Laminas\\Cache\\Storage\\Adapter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Laminas cache adapter for apcu",
"keywords": [
"cache",
"laminas"
],
"support": {
"docs": "https://docs.laminas.dev/laminas-cache-storage-adapter-apcu/",
"forum": "https://discourse.laminas.dev/",
"issues": "https://github.com/laminas/laminas-cache-storage-adapter-apcu/issues",
"rss": "https://github.com/laminas/laminas-cache-storage-adapter-apcu/releases.atom",
"source": "https://github.com/laminas/laminas-cache-storage-adapter-apcu"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2022-12-05T11:22:35+00:00"
},
{
"name": "laminas/laminas-cache-storage-adapter-blackhole",
"version": "2.3.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-cache-storage-adapter-blackhole.git",
"reference": "8730402201904784e6b28a1014908c6123c12d02"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-cache-storage-adapter-blackhole/zipball/8730402201904784e6b28a1014908c6123c12d02",
"reference": "8730402201904784e6b28a1014908c6123c12d02",
"shasum": ""
},
"require": {
"laminas/laminas-cache": "^3.0",
"php": "~8.0.0 || ~8.1.0 || ~8.2.0"
},
"conflict": {
"laminas/laminas-servicemanager": "<3.11"
},
"provide": {
"laminas/laminas-cache-storage-implementation": "1.0"
},
"require-dev": {
"laminas/laminas-cache-storage-adapter-test": "^2.4",
"laminas/laminas-coding-standard": "~2.4.0",
"psalm/plugin-phpunit": "^0.18.4",
"vimeo/psalm": "^5.2"
},
"type": "library",
"extra": {
"laminas": {
"config-provider": "Laminas\\Cache\\Storage\\Adapter\\BlackHole\\ConfigProvider",
"module": "Laminas\\Cache\\Storage\\Adapter\\BlackHole"
}
},
"autoload": {
"psr-4": {
"Laminas\\Cache\\Storage\\Adapter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Laminas cache adapter for blackhole",
"keywords": [
"cache",
"laminas"
],
"support": {
"docs": "https://docs.laminas.dev/laminas-cache-storage-adapter-blackhole/",
"forum": "https://discourse.laminas.dev/",
"issues": "https://github.com/laminas/laminas-cache-storage-adapter-blackhole/issues",
"rss": "https://github.com/laminas/laminas-cache-storage-adapter-blackhole/releases.atom",
"source": "https://github.com/laminas/laminas-cache-storage-adapter-blackhole"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2022-12-31T16:03:12+00:00"
},
{
"name": "laminas/laminas-cache-storage-adapter-filesystem",
"version": "2.3.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-cache-storage-adapter-filesystem.git",
"reference": "9881529cacc26823dc1530e8b850fd9e467ccd05"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-cache-storage-adapter-filesystem/zipball/9881529cacc26823dc1530e8b850fd9e467ccd05",
"reference": "9881529cacc26823dc1530e8b850fd9e467ccd05",
"shasum": ""
},
"require": {
"laminas/laminas-cache": "^3.0",
"php": "~8.0.0 || ~8.1.0 || ~8.2.0"
},
"provide": {
"laminas/laminas-cache-storage-implementation": "1.0"
},
"require-dev": {
"ext-pcntl": "*",
"ext-posix": "*",
"laminas/laminas-cache-storage-adapter-benchmark": "^1.0",
"laminas/laminas-cache-storage-adapter-test": "^2.0 || 2.0.x-dev",
"laminas/laminas-coding-standard": "~2.4",
"laminas/laminas-serializer": "^2.14.0",
"phpunit/phpunit": "^9.5.25",
"psalm/plugin-phpunit": "^0.17.0",
"vimeo/psalm": "^4.29.0"
},
"type": "library",
"extra": {
"laminas": {
"config-provider": "Laminas\\Cache\\Storage\\Adapter\\Filesystem\\ConfigProvider",
"module": "Laminas\\Cache\\Storage\\Adapter\\Filesystem"
}
},
"autoload": {
"psr-4": {
"Laminas\\Cache\\Storage\\Adapter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Laminas cache adapter for filesystem",
"keywords": [
"cache",
"laminas"
],
"support": {
"docs": "https://docs.laminas.dev/laminas-cache-storage-adapter-filesystem/",
"forum": "https://discourse.laminas.dev/",
"issues": "https://github.com/laminas/laminas-cache-storage-adapter-filesystem/issues",
"rss": "https://github.com/laminas/laminas-cache-storage-adapter-filesystem/releases.atom",
"source": "https://github.com/laminas/laminas-cache-storage-adapter-filesystem"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2022-10-22T15:00:05+00:00"
},
{
"name": "laminas/laminas-cache-storage-adapter-test",
"version": "2.4.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-cache-storage-adapter-test.git",
"reference": "cf8dbad341f93fa1bee326cdaca488182fc68e96"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-cache-storage-adapter-test/zipball/cf8dbad341f93fa1bee326cdaca488182fc68e96",
"reference": "cf8dbad341f93fa1bee326cdaca488182fc68e96",
"shasum": ""
},
"require": {
"container-interop/container-interop": "^1.2",
"laminas/laminas-cache": "^3.1",
"php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0",
"phpunit/phpunit": "^9.5.20",
"psr/cache": "^1.0 || ^2.0 || ^3.0",
"psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
},
"require-dev": {
"laminas/laminas-cache-storage-adapter-apcu": "^2.0",
"laminas/laminas-cache-storage-adapter-memory": "^2.0",
"laminas/laminas-coding-standard": "~2.4.0",
"psalm/plugin-phpunit": "^0.18.0",
"vimeo/psalm": "^5.0.0"
},
"type": "library",
"autoload": {
"psr-4": {
"LaminasTest\\Cache\\Storage\\Adapter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Laminas cache storage adapter shared test dependency",
"keywords": [
"cache",
"laminas",
"test"
],
"support": {
"forum": "https://discourse.laminas.dev/",
"issues": "https://github.com/laminas/laminas-cache-storage-adapter-test/issues",
"rss": "https://github.com/laminas/laminas-cache-storage-adapter-test/releases.atom",
"source": "https://github.com/laminas/laminas-cache-storage-adapter-test"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2022-12-09T09:20:01+00:00"
},
{
"name": "laminas/laminas-cli",
"version": "1.7.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-cli.git",
"reference": "8476ca735f788cddc456ad660a29d9c8349554b0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-cli/zipball/8476ca735f788cddc456ad660a29d9c8349554b0",
"reference": "8476ca735f788cddc456ad660a29d9c8349554b0",
"shasum": ""
},
"require": {
"composer-runtime-api": "^2.0.0",
"php": "~8.0.0 || ~8.1.0 || ~8.2.0",
"psr/container": "^1.0 || ^2.0",
"symfony/console": "^5.3.7 || ^6.0",
"symfony/event-dispatcher": "^5.0 || ^6.0",
"symfony/polyfill-php80": "^1.17",
"webmozart/assert": "^1.10"
},
"require-dev": {
"laminas/laminas-coding-standard": "~2.4.0",
"laminas/laminas-mvc": "^3.3.5",
"laminas/laminas-servicemanager": "^3.19",
"mikey179/vfsstream": "2.0.x-dev",
"phpunit/phpunit": "^9.5.25",
"psalm/plugin-phpunit": "^0.17.0",
"vimeo/psalm": "^4.29"
},
"bin": [
"bin/laminas"
],
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\Cli\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Command-line interface for Laminas projects",
"keywords": [
"cli",
"command",
"console",
"laminas"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-cli/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/mezzio/laminas-cli/issues",
"rss": "https://github.com/mezzio/laminas-cli/releases.atom",
"source": "https://github.com/mezzio/laminas-cli"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2022-10-13T22:36:07+00:00"
},
{
"name": "laminas/laminas-coding-standard",
"version": "2.5.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-coding-standard.git",
"reference": "c1aaa18a7c860c6932677a3e4ec13161f9fc7d61"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-coding-standard/zipball/c1aaa18a7c860c6932677a3e4ec13161f9fc7d61",
"reference": "c1aaa18a7c860c6932677a3e4ec13161f9fc7d61",
"shasum": ""
},
"require": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.0",
"php": "^7.4 || ^8.0",
"slevomat/coding-standard": "^7.0",
"squizlabs/php_codesniffer": "^3.6",
"webimpress/coding-standard": "^1.2"
},
"conflict": {
"phpstan/phpdoc-parser": ">=1.6.0"
},
"type": "phpcodesniffer-standard",
"autoload": {
"psr-4": {
"LaminasCodingStandard\\": "src/LaminasCodingStandard/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Laminas Coding Standard",
"homepage": "https://laminas.dev",
"keywords": [
"Coding Standard",
"laminas"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-coding-standard/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-coding-standard/issues",
"rss": "https://github.com/laminas/laminas-coding-standard/releases.atom",
"source": "https://github.com/laminas/laminas-coding-standard"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2023-01-05T15:53:40+00:00"
},
{
"name": "laminas/laminas-config-aggregator",
"version": "1.13.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-config-aggregator.git",
"reference": "5c445bbe9afabb7fd7c38382f27930f11632dd90"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-config-aggregator/zipball/5c445bbe9afabb7fd7c38382f27930f11632dd90",
"reference": "5c445bbe9afabb7fd7c38382f27930f11632dd90",
"shasum": ""
},
"require": {
"brick/varexporter": "^0.3.7",
"laminas/laminas-stdlib": "^3.10.1",
"php": "~8.0.0 || ~8.1.0 || ~8.2.0",
"webimpress/safe-writer": "^2.2.0"
},
"conflict": {
"nikic/php-parser": "<4.12",
"zendframework/zend-config-aggregator": "*"
},
"require-dev": {
"laminas/laminas-coding-standard": "~2.4.0",
"laminas/laminas-config": "^3.8.0",
"laminas/laminas-servicemanager": "^3.19",
"phpunit/phpunit": "^9.5.26",
"psalm/plugin-phpunit": "^0.18.0",
"vimeo/psalm": "^5.0"
},
"suggest": {
"laminas/laminas-config": "Allows loading configuration from XML, INI, YAML, and JSON files",
"laminas/laminas-config-aggregator-modulemanager": "Allows loading configuration from laminas-mvc Module classes",
"laminas/laminas-config-aggregator-parameters": "Allows usage of templated parameters within your configuration"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\ConfigAggregator\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Lightweight library for collecting and merging configuration from different sources",
"homepage": "https://laminas.dev",
"keywords": [
"config-aggregator",
"laminas"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-config-aggregator/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-config-aggregator/issues",
"rss": "https://github.com/laminas/laminas-config-aggregator/releases.atom",
"source": "https://github.com/laminas/laminas-config-aggregator"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2022-12-03T21:22:49+00:00"
},
{
"name": "laminas/laminas-escaper",
"version": "2.12.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-escaper.git",
"reference": "ee7a4c37bf3d0e8c03635d5bddb5bb3184ead490"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/ee7a4c37bf3d0e8c03635d5bddb5bb3184ead490",
"reference": "ee7a4c37bf3d0e8c03635d5bddb5bb3184ead490",
"shasum": ""
},
"require": {
"ext-ctype": "*",
"ext-mbstring": "*",
"php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0"
},
"conflict": {
"zendframework/zend-escaper": "*"
},
"require-dev": {
"infection/infection": "^0.26.6",
"laminas/laminas-coding-standard": "~2.4.0",
"maglnet/composer-require-checker": "^3.8.0",
"phpunit/phpunit": "^9.5.18",
"psalm/plugin-phpunit": "^0.17.0",
"vimeo/psalm": "^4.22.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\Escaper\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs",
"homepage": "https://laminas.dev",
"keywords": [
"escaper",
"laminas"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-escaper/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-escaper/issues",
"rss": "https://github.com/laminas/laminas-escaper/releases.atom",
"source": "https://github.com/laminas/laminas-escaper"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2022-10-10T10:11:09+00:00"
},
{
"name": "laminas/laminas-feed",
"version": "2.20.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-feed.git",
"reference": "508ebef6e622f2f2ce3dd0559739ffd0dfa3b938"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-feed/zipball/508ebef6e622f2f2ce3dd0559739ffd0dfa3b938",
"reference": "508ebef6e622f2f2ce3dd0559739ffd0dfa3b938",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"laminas/laminas-escaper": "^2.9",
"laminas/laminas-servicemanager": "^3.14.0",
"laminas/laminas-stdlib": "^3.6",
"php": "~8.0.0 || ~8.1.0 || ~8.2.0"
},
"conflict": {
"laminas/laminas-servicemanager": "<3.3",
"zendframework/zend-feed": "*"
},
"require-dev": {
"laminas/laminas-cache": "^2.13.2 || ^3.6",
"laminas/laminas-cache-storage-adapter-memory": "^1.1.0 || ^2.1",
"laminas/laminas-coding-standard": "~2.4.0",
"laminas/laminas-db": "^2.15",
"laminas/laminas-http": "^2.17.0",
"laminas/laminas-validator": "^2.26",
"phpunit/phpunit": "^9.5.25",
"psalm/plugin-phpunit": "^0.18.0",
"psr/http-message": "^1.0.1",
"vimeo/psalm": "^5.1.0"
},
"suggest": {
"laminas/laminas-cache": "Laminas\\Cache component, for optionally caching feeds between requests",
"laminas/laminas-db": "Laminas\\Db component, for use with PubSubHubbub",
"laminas/laminas-http": "Laminas\\Http for PubSubHubbub, and optionally for use with Laminas\\Feed\\Reader",
"laminas/laminas-servicemanager": "Laminas\\ServiceManager component, for easily extending ExtensionManager implementations",
"laminas/laminas-validator": "Laminas\\Validator component, for validating email addresses used in Atom feeds and entries when using the Writer subcomponent",
"psr/http-message": "PSR-7 ^1.0.1, if you wish to use Laminas\\Feed\\Reader\\Http\\Psr7ResponseDecorator"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\Feed\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "provides functionality for creating and consuming RSS and Atom feeds",
"homepage": "https://laminas.dev",
"keywords": [
"atom",
"feed",
"laminas",
"rss"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-feed/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-feed/issues",
"rss": "https://github.com/laminas/laminas-feed/releases.atom",
"source": "https://github.com/laminas/laminas-feed"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2022-12-03T19:40:30+00:00"
},
{
"name": "laminas/laminas-json",
"version": "3.5.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-json.git",
"reference": "7a8a1d7bf2d05dd6c1fbd7c0868d3848cf2b57ec"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-json/zipball/7a8a1d7bf2d05dd6c1fbd7c0868d3848cf2b57ec",
"reference": "7a8a1d7bf2d05dd6c1fbd7c0868d3848cf2b57ec",
"shasum": ""
},
"require": {
"php": "~8.0.0 || ~8.1.0 || ~8.2.0"
},
"conflict": {
"zendframework/zend-json": "*"
},
"require-dev": {
"laminas/laminas-coding-standard": "~2.4.0",
"laminas/laminas-stdlib": "^2.7.7 || ^3.1",
"phpunit/phpunit": "^9.5.25"
},
"suggest": {
"laminas/laminas-json-server": "For implementing JSON-RPC servers",
"laminas/laminas-xml2json": "For converting XML documents to JSON"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\Json\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP",
"homepage": "https://laminas.dev",
"keywords": [
"json",
"laminas"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-json/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-json/issues",
"rss": "https://github.com/laminas/laminas-json/releases.atom",
"source": "https://github.com/laminas/laminas-json"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2022-10-17T04:06:45+00:00"
},
{
"name": "laminas/laminas-serializer",
"version": "2.14.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-serializer.git",
"reference": "c4ceeb080f8d080006616072d2926949b3e5b9ea"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-serializer/zipball/c4ceeb080f8d080006616072d2926949b3e5b9ea",
"reference": "c4ceeb080f8d080006616072d2926949b3e5b9ea",
"shasum": ""
},
"require": {
"laminas/laminas-json": "^3.1",
"laminas/laminas-stdlib": "^3.2",
"php": "~8.0.0 || ~8.1.0 || ~8.2.0"
},
"conflict": {
"zendframework/zend-serializer": "*"
},
"require-dev": {
"laminas/laminas-coding-standard": "~2.4.0",
"laminas/laminas-math": "~3.6.0",
"laminas/laminas-servicemanager": "~3.19.0",
"phpunit/phpunit": "~9.5.25"
},
"suggest": {
"laminas/laminas-math": "(^3.3) To support Python Pickle serialization",
"laminas/laminas-servicemanager": "(^3.6) To support plugin manager support"
},
"type": "library",
"extra": {
"laminas": {
"component": "Laminas\\Serializer",
"config-provider": "Laminas\\Serializer\\ConfigProvider"
}
},
"autoload": {
"psr-4": {
"Laminas\\Serializer\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Serialize and deserialize PHP structures to a variety of representations",
"homepage": "https://laminas.dev",
"keywords": [
"laminas",
"serializer"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-serializer/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-serializer/issues",
"rss": "https://github.com/laminas/laminas-serializer/releases.atom",
"source": "https://github.com/laminas/laminas-serializer"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2022-10-16T14:51:10+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"
}
],
"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": "nikic/php-parser",
"version": "v4.15.2",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc",
"reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
"php": ">=7.0"
},
"require-dev": {
"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-master": "4.9-dev"
}
},
"autoload": {
"psr-4": {
"PhpParser\\": "lib/PhpParser"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Nikita Popov"
}
],
"description": "A PHP parser written in PHP",
"keywords": [
"parser",
"php"
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2"
},
"time": "2022-11-12T15:38:23+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": "Sebastian Heuer",
"email": "sebastian@phpeople.de",
"role": "Developer"
},
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "Developer"
}
],
"description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
"support": {
"issues": "https://github.com/phar-io/manifest/issues",
"source": "https://github.com/phar-io/manifest/tree/2.0.3"
},
"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": [
{
"name": "Arne Blankerts",
"email": "arne@blankerts.de",
"role": "Developer"
},
{
"name": "Sebastian Heuer",
"email": "sebastian@phpeople.de",
"role": "Developer"
},
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "Developer"
}
],
"description": "Library for handling version information and constraints",
"support": {
"issues": "https://github.com/phar-io/version/issues",
"source": "https://github.com/phar-io/version/tree/3.2.1"
},
"time": "2022-02-21T01:04:05+00:00"
},
{
"name": "phpbench/container",
"version": "2.2.1",
"source": {
"type": "git",
"url": "https://github.com/phpbench/container.git",
"reference": "6d555ff7174fca13f9b1ec0b4a089ed41d0ab392"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpbench/container/zipball/6d555ff7174fca13f9b1ec0b4a089ed41d0ab392",
"reference": "6d555ff7174fca13f9b1ec0b4a089ed41d0ab392",
"shasum": ""
},
"require": {
"psr/container": "^1.0|^2.0",
"symfony/options-resolver": "^4.2 || ^5.0 || ^6.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.16",
"phpstan/phpstan": "^0.12.52",
"phpunit/phpunit": "^8"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.x-dev"
}
},
"autoload": {
"psr-4": {
"PhpBench\\DependencyInjection\\": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Daniel Leech",
"email": "daniel@dantleech.com"
}
],
"description": "Simple, configurable, service container.",
"support": {
"issues": "https://github.com/phpbench/container/issues",
"source": "https://github.com/phpbench/container/tree/2.2.1"
},
"time": "2022-01-25T10:17:35+00:00"
},
{
"name": "phpbench/dom",
"version": "0.3.2",
"source": {
"type": "git",
"url": "https://github.com/phpbench/dom.git",
"reference": "b013b717832ddbaadf2a40984b04bc66af9a7110"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpbench/dom/zipball/b013b717832ddbaadf2a40984b04bc66af9a7110",
"reference": "b013b717832ddbaadf2a40984b04bc66af9a7110",
"shasum": ""
},
"require": {
"ext-dom": "*",
"php": "^7.2||^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.18",
"phpstan/phpstan": "^0.12.83",
"phpunit/phpunit": "^8.0||^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"psr-4": {
"PhpBench\\Dom\\": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Daniel Leech",
"email": "daniel@dantleech.com"
}
],
"description": "DOM wrapper to simplify working with the PHP DOM implementation",
"support": {
"issues": "https://github.com/phpbench/dom/issues",
"source": "https://github.com/phpbench/dom/tree/0.3.2"
},
"time": "2021-09-24T15:26:07+00:00"
},
{
"name": "phpbench/phpbench",
"version": "1.2.7",
"source": {
"type": "git",
"url": "https://github.com/phpbench/phpbench.git",
"reference": "dce145304abbb16c8d9af69c19d96f47e9d0e670"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpbench/phpbench/zipball/dce145304abbb16c8d9af69c19d96f47e9d0e670",
"reference": "dce145304abbb16c8d9af69c19d96f47e9d0e670",
"shasum": ""
},
"require": {
"doctrine/annotations": "^1.13",
"ext-dom": "*",
"ext-json": "*",
"ext-pcre": "*",
"ext-reflection": "*",
"ext-spl": "*",
"ext-tokenizer": "*",
"php": "^7.3 || ^8.0",
"phpbench/container": "^2.1",
"phpbench/dom": "~0.3.1",
"psr/log": "^1.1 || ^2.0 || ^3.0",
"seld/jsonlint": "^1.1",
"symfony/console": "^4.2 || ^5.0 || ^6.0",
"symfony/filesystem": "^4.2 || ^5.0 || ^6.0",
"symfony/finder": "^4.2 || ^5.0 || ^6.0",
"symfony/options-resolver": "^4.2 || ^5.0 || ^6.0",
"symfony/process": "^4.2 || ^5.0 || ^6.0",
"webmozart/glob": "^4.6"
},
"require-dev": {
"dantleech/invoke": "^2.0",
"friendsofphp/php-cs-fixer": "^3.0",
"jangregor/phpstan-prophecy": "^1.0",
"phpspec/prophecy": "^1.12",
"phpstan/extension-installer": "^1.1",
"phpstan/phpstan": "^1.0",
"phpstan/phpstan-phpunit": "^1.0",
"phpunit/phpunit": "^8.5.8 || ^9.0",
"symfony/error-handler": "^5.2 || ^6.0",
"symfony/var-dumper": "^4.0 || ^5.0 || ^6.0"
},
"suggest": {
"ext-xdebug": "For Xdebug profiling extension."
},
"bin": [
"bin/phpbench"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.2-dev"
}
},
"autoload": {
"files": [
"lib/Report/Func/functions.php"
],
"psr-4": {
"PhpBench\\": "lib/",
"PhpBench\\Extensions\\XDebug\\": "extensions/xdebug/lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Daniel Leech",
"email": "daniel@dantleech.com"
}
],
"description": "PHP Benchmarking Framework",
"support": {
"issues": "https://github.com/phpbench/phpbench/issues",
"source": "https://github.com/phpbench/phpbench/tree/1.2.7"
},
"funding": [
{
"url": "https://github.com/dantleech",
"type": "github"
}
],
"time": "2022-10-15T09:57:51+00:00"
},
{
"name": "phpdocumentor/reflection-common",
"version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionCommon.git",
"reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
"reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-2.x": "2.x-dev"
}
},
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jaap van Otterdijk",
"email": "opensource@ijaap.nl"
}
],
"description": "Common reflection classes used by phpdocumentor to reflect the code structure",
"homepage": "http://www.phpdoc.org",
"keywords": [
"FQSEN",
"phpDocumentor",
"phpdoc",
"reflection",
"static analysis"
],
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
"source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
},
"time": "2020-06-27T09:03:43+00:00"
},
{
"name": "phpdocumentor/reflection-docblock",
"version": "5.3.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
"reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
"reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
"shasum": ""
},
"require": {
"ext-filter": "*",
"php": "^7.2 || ^8.0",
"phpdocumentor/reflection-common": "^2.2",
"phpdocumentor/type-resolver": "^1.3",
"webmozart/assert": "^1.9.1"
},
"require-dev": {
"mockery/mockery": "~1.3.2",
"psalm/phar": "^4.8"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.x-dev"
}
},
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mike van Riel",
"email": "me@mikevanriel.com"
},
{
"name": "Jaap van Otterdijk",
"email": "account@ijaap.nl"
}
],
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
},
"time": "2021-10-19T17:43:47+00:00"
},
{
"name": "phpdocumentor/type-resolver",
"version": "1.6.2",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
"reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d",
"reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0",
"phpdocumentor/reflection-common": "^2.0"
},
"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"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-1.x": "1.x-dev"
}
},
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mike van Riel",
"email": "me@mikevanriel.com"
}
],
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
"support": {
"issues": "https://github.com/phpDocumentor/TypeResolver/issues",
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2"
},
"time": "2022-10-14T12:47:21+00:00"
},
{
"name": "phpstan/phpdoc-parser",
"version": "1.5.1",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
"reference": "981cc368a216c988e862a75e526b6076987d1b50"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/981cc368a216c988e862a75e526b6076987d1b50",
"reference": "981cc368a216c988e862a75e526b6076987d1b50",
"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-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.5.1"
},
"time": "2022-05-05T11:32:40+00:00"
},
{
"name": "phpunit/php-code-coverage",
"version": "9.2.23",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c",
"reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
"nikic/php-parser": "^4.14",
"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": {
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-pcov": "*",
"ext-xdebug": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "9.2-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
"homepage": "https://github.com/sebastianbergmann/php-code-coverage",
"keywords": [
"coverage",
"testing",
"xunit"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.23"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2022-12-28T12:41:10+00:00"
},
{
"name": "phpunit/php-file-iterator",
"version": "3.0.6",
"source": {
"type": "git",
"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/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
"reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"ext-pcntl": "*",
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-pcntl": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.1-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Invoke callables with a timeout",
"homepage": "https://github.com/sebastianbergmann/php-invoker/",
"keywords": [
"process"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-invoker/issues",
"source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T05:58:55+00:00"
},
{
"name": "phpunit/php-text-template",
"version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-text-template.git",
"reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
"reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Simple template engine.",
"homepage": "https://github.com/sebastianbergmann/php-text-template/",
"keywords": [
"template"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-text-template/issues",
"source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T05:33:50+00:00"
},
{
"name": "phpunit/php-timer",
"version": "5.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
"reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
"reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Utility class for timing",
"homepage": "https://github.com/sebastianbergmann/php-timer/",
"keywords": [
"timer"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-timer/issues",
"source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:16:10+00:00"
},
{
"name": "phpunit/phpunit",
"version": "9.5.27",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "a2bc7ffdca99f92d959b3f2270529334030bba38"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a2bc7ffdca99f92d959b3f2270529334030bba38",
"reference": "a2bc7ffdca99f92d959b3f2270529334030bba38",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.3.1",
"ext-dom": "*",
"ext-json": "*",
"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"
},
"suggest": {
"ext-soap": "*",
"ext-xdebug": "*"
},
"bin": [
"phpunit"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "9.5-dev"
}
},
"autoload": {
"files": [
"src/Framework/Assert/Functions.php"
],
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "The PHP Unit Testing framework.",
"homepage": "https://phpunit.de/",
"keywords": [
"phpunit",
"testing",
"xunit"
],
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.27"
},
"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": "2022-12-09T07:31:23+00:00"
},
{
"name": "psalm/plugin-phpunit",
"version": "0.18.4",
"source": {
"type": "git",
"url": "https://github.com/psalm/psalm-plugin-phpunit.git",
"reference": "e4ab3096653d9eb6f6d0ea5f4461898d59ae4dbc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/psalm/psalm-plugin-phpunit/zipball/e4ab3096653d9eb6f6d0ea5f4461898d59ae4dbc",
"reference": "e4ab3096653d9eb6f6d0ea5f4461898d59ae4dbc",
"shasum": ""
},
"require": {
"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"
},
"conflict": {
"phpunit/phpunit": "<7.5"
},
"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"
}
},
"autoload": {
"psr-4": {
"Psalm\\PhpUnitPlugin\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Matt Brown",
"email": "github@muglug.com"
}
],
"description": "Psalm plugin for PHPUnit",
"support": {
"issues": "https://github.com/psalm/psalm-plugin-phpunit/issues",
"source": "https://github.com/psalm/psalm-plugin-phpunit/tree/0.18.4"
},
"time": "2022-12-03T07:47:07+00:00"
},
{
"name": "psr/event-dispatcher",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/event-dispatcher.git",
"reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
"reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
"shasum": ""
},
"require": {
"php": ">=7.2.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\EventDispatcher\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Standard interfaces for event handling.",
"keywords": [
"events",
"psr",
"psr-14"
],
"support": {
"issues": "https://github.com/php-fig/event-dispatcher/issues",
"source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
},
"time": "2019-01-08T18:20:26+00:00"
},
{
"name": "psr/log",
"version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
"reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
"reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
"shasum": ""
},
"require": {
"php": ">=8.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Log\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for logging libraries",
"homepage": "https://github.com/php-fig/log",
"keywords": [
"log",
"psr",
"psr-3"
],
"support": {
"source": "https://github.com/php-fig/log/tree/3.0.0"
},
"time": "2021-07-14T16:46:02+00:00"
},
{
"name": "sebastian/cli-parser",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git",
"reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
"reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library for parsing CLI options",
"homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": {
"issues": "https://github.com/sebastianbergmann/cli-parser/issues",
"source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T06:08:49+00:00"
},
{
"name": "sebastian/code-unit",
"version": "1.0.8",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit.git",
"reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
"reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Collection of value objects that represent the PHP code units",
"homepage": "https://github.com/sebastianbergmann/code-unit",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit/issues",
"source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:08:54+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
"version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
"reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
"reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Looks up which function or method a line of code belongs to",
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
"source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T05:30:19+00:00"
},
{
"name": "sebastian/comparator",
"version": "4.0.8",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "fa0f136dd2334583309d32b62544682ee972b51a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
"reference": "fa0f136dd2334583309d32b62544682ee972b51a",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/diff": "^4.0",
"sebastian/exporter": "^4.0"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
},
{
"name": "Volker Dusch",
"email": "github@wallbash.com"
},
{
"name": "Bernhard Schussek",
"email": "bschussek@2bepublished.at"
}
],
"description": "Provides the functionality to compare PHP values for equality",
"homepage": "https://github.com/sebastianbergmann/comparator",
"keywords": [
"comparator",
"compare",
"equality"
],
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
"source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2022-09-14T12:41:17+00:00"
},
{
"name": "sebastian/complexity",
"version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git",
"reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
"reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
"shasum": ""
},
"require": {
"nikic/php-parser": "^4.7",
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library for calculating the complexity of PHP code units",
"homepage": "https://github.com/sebastianbergmann/complexity",
"support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues",
"source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T15:52:27+00:00"
},
{
"name": "sebastian/diff",
"version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
"reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
"reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3",
"symfony/process": "^4.2 || ^5"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Kore Nordmann",
"email": "mail@kore-nordmann.de"
}
],
"description": "Diff implementation",
"homepage": "https://github.com/sebastianbergmann/diff",
"keywords": [
"diff",
"udiff",
"unidiff",
"unified diff"
],
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:10:38+00:00"
},
{
"name": "sebastian/environment",
"version": "5.1.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
"reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7",
"reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-posix": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.1-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Provides functionality to handle HHVM/PHP environments",
"homepage": "http://www.github.com/sebastianbergmann/environment",
"keywords": [
"Xdebug",
"environment",
"hhvm"
],
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
"source": "https://github.com/sebastianbergmann/environment/tree/5.1.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2022-04-03T09:37:03+00:00"
},
{
"name": "sebastian/exporter",
"version": "4.0.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
"reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
"reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/recursion-context": "^4.0"
},
"require-dev": {
"ext-mbstring": "*",
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
},
{
"name": "Volker Dusch",
"email": "github@wallbash.com"
},
{
"name": "Adam Harvey",
"email": "aharvey@php.net"
},
{
"name": "Bernhard Schussek",
"email": "bschussek@gmail.com"
}
],
"description": "Provides the functionality to export PHP variables for visualization",
"homepage": "https://www.github.com/sebastianbergmann/exporter",
"keywords": [
"export",
"exporter"
],
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
"source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2022-09-14T06:03:37+00:00"
},
{
"name": "sebastian/global-state",
"version": "5.0.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
"reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2",
"reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/object-reflector": "^2.0",
"sebastian/recursion-context": "^4.0"
},
"require-dev": {
"ext-dom": "*",
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-uopz": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Snapshotting of global state",
"homepage": "http://www.github.com/sebastianbergmann/global-state",
"keywords": [
"global state"
],
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
"source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2022-02-14T08:28:10+00:00"
},
{
"name": "sebastian/lines-of-code",
"version": "1.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
"reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
"reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
"shasum": ""
},
"require": {
"nikic/php-parser": "^4.6",
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library for counting the lines of code in PHP source code",
"homepage": "https://github.com/sebastianbergmann/lines-of-code",
"support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
"source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-11-28T06:42:11+00:00"
},
{
"name": "sebastian/object-enumerator",
"version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
"reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
"reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/object-reflector": "^2.0",
"sebastian/recursion-context": "^4.0"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Traverses array structures and object graphs to enumerate all referenced objects",
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
"source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:12:34+00:00"
},
{
"name": "sebastian/object-reflector",
"version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-reflector.git",
"reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
"reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Allows reflection of object attributes, including inherited and non-public ones",
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-reflector/issues",
"source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:14:26+00:00"
},
{
"name": "sebastian/recursion-context",
"version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
"reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
"reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
},
{
"name": "Adam Harvey",
"email": "aharvey@php.net"
}
],
"description": "Provides functionality to recursively process PHP variables",
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
"support": {
"issues": "https://github.com/sebastianbergmann/recursion-context/issues",
"source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:17:30+00:00"
},
{
"name": "sebastian/resource-operations",
"version": "3.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/resource-operations.git",
"reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
"reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.0"
},
"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"
}
],
"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/sebastianbergmann/resource-operations/issues",
"source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T06:45:17+00:00"
},
{
"name": "sebastian/type",
"version": "3.2.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
"reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
"reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.5"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.2-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Collection of value objects that represent the types of the PHP type system",
"homepage": "https://github.com/sebastianbergmann/type",
"support": {
"issues": "https://github.com/sebastianbergmann/type/issues",
"source": "https://github.com/sebastianbergmann/type/tree/3.2.0"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2022-09-12T14:47:03+00:00"
},
{
"name": "sebastian/version",
"version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/version.git",
"reference": "c6c1022351a901512170118436c764e473f6de8c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
"reference": "c6c1022351a901512170118436c764e473f6de8c",
"shasum": ""
},
"require": {
"php": ">=7.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": "Library that helps with managing the version number of Git-hosted PHP projects",
"homepage": "https://github.com/sebastianbergmann/version",
"support": {
"issues": "https://github.com/sebastianbergmann/version/issues",
"source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T06:39:44+00:00"
},
{
"name": "seld/jsonlint",
"version": "1.9.0",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/jsonlint.git",
"reference": "4211420d25eba80712bff236a98960ef68b866b7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7",
"reference": "4211420d25eba80712bff236a98960ef68b866b7",
"shasum": ""
},
"require": {
"php": "^5.3 || ^7.0 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "^1.5",
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13"
},
"bin": [
"bin/jsonlint"
],
"type": "library",
"autoload": {
"psr-4": {
"Seld\\JsonLint\\": "src/Seld/JsonLint/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be"
}
],
"description": "JSON Linter",
"keywords": [
"json",
"linter",
"parser",
"validator"
],
"support": {
"issues": "https://github.com/Seldaek/jsonlint/issues",
"source": "https://github.com/Seldaek/jsonlint/tree/1.9.0"
},
"funding": [
{
"url": "https://github.com/Seldaek",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/seld/jsonlint",
"type": "tidelift"
}
],
"time": "2022-04-01T13:37:23+00:00"
},
{
"name": "slevomat/coding-standard",
"version": "7.2.1",
"source": {
"type": "git",
"url": "https://github.com/slevomat/coding-standard.git",
"reference": "aff06ae7a84e4534bf6f821dc982a93a5d477c90"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/slevomat/coding-standard/zipball/aff06ae7a84e4534bf6f821dc982a93a5d477c90",
"reference": "aff06ae7a84e4534bf6f821dc982a93a5d477c90",
"shasum": ""
},
"require": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7",
"php": "^7.2 || ^8.0",
"phpstan/phpdoc-parser": "^1.5.1",
"squizlabs/php_codesniffer": "^3.6.2"
},
"require-dev": {
"phing/phing": "2.17.3",
"php-parallel-lint/php-parallel-lint": "1.3.2",
"phpstan/phpstan": "1.4.10|1.7.1",
"phpstan/phpstan-deprecation-rules": "1.0.0",
"phpstan/phpstan-phpunit": "1.0.0|1.1.1",
"phpstan/phpstan-strict-rules": "1.2.3",
"phpunit/phpunit": "7.5.20|8.5.21|9.5.20"
},
"type": "phpcodesniffer-standard",
"extra": {
"branch-alias": {
"dev-master": "7.x-dev"
}
},
"autoload": {
"psr-4": {
"SlevomatCodingStandard\\": "SlevomatCodingStandard"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.",
"support": {
"issues": "https://github.com/slevomat/coding-standard/issues",
"source": "https://github.com/slevomat/coding-standard/tree/7.2.1"
},
"funding": [
{
"url": "https://github.com/kukulich",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard",
"type": "tidelift"
}
],
"time": "2022-05-25T10:58:12+00:00"
},
{
"name": "spatie/array-to-xml",
"version": "2.17.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/array-to-xml.git",
"reference": "5cbec9c6ab17e320c58a259f0cebe88bde4a7c46"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/array-to-xml/zipball/5cbec9c6ab17e320c58a259f0cebe88bde4a7c46",
"reference": "5cbec9c6ab17e320c58a259f0cebe88bde4a7c46",
"shasum": ""
},
"require": {
"ext-dom": "*",
"php": "^7.4|^8.0"
},
"require-dev": {
"mockery/mockery": "^1.2",
"pestphp/pest": "^1.21",
"phpunit/phpunit": "^9.0",
"spatie/pest-plugin-snapshots": "^1.1"
},
"type": "library",
"autoload": {
"psr-4": {
"Spatie\\ArrayToXml\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Freek Van der Herten",
"email": "freek@spatie.be",
"homepage": "https://freek.dev",
"role": "Developer"
}
],
"description": "Convert an array to xml",
"homepage": "https://github.com/spatie/array-to-xml",
"keywords": [
"array",
"convert",
"xml"
],
"support": {
"source": "https://github.com/spatie/array-to-xml/tree/2.17.1"
},
"funding": [
{
"url": "https://spatie.be/open-source/support-us",
"type": "custom"
},
{
"url": "https://github.com/spatie",
"type": "github"
}
],
"time": "2022-12-26T08:22:07+00:00"
},
{
"name": "squizlabs/php_codesniffer",
"version": "3.7.1",
"source": {
"type": "git",
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
"reference": "1359e176e9307e906dc3d890bcc9603ff6d90619"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619",
"reference": "1359e176e9307e906dc3d890bcc9603ff6d90619",
"shasum": ""
},
"require": {
"ext-simplexml": "*",
"ext-tokenizer": "*",
"ext-xmlwriter": "*",
"php": ">=5.4.0"
},
"require-dev": {
"phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
},
"bin": [
"bin/phpcs",
"bin/phpcbf"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.x-dev"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Greg Sherwood",
"role": "lead"
}
],
"description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
"homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
"keywords": [
"phpcs",
"standards"
],
"support": {
"issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
"source": "https://github.com/squizlabs/PHP_CodeSniffer",
"wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
},
"time": "2022-06-18T07:21:10+00:00"
},
{
"name": "symfony/console",
"version": "v6.0.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "2ab307342a7233b9a260edd5ef94087aaca57d18"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/2ab307342a7233b9a260edd5ef94087aaca57d18",
"reference": "2ab307342a7233b9a260edd5ef94087aaca57d18",
"shasum": ""
},
"require": {
"php": ">=8.0.2",
"symfony/polyfill-mbstring": "~1.0",
"symfony/service-contracts": "^1.1|^2|^3",
"symfony/string": "^5.4|^6.0"
},
"conflict": {
"symfony/dependency-injection": "<5.4",
"symfony/dotenv": "<5.4",
"symfony/event-dispatcher": "<5.4",
"symfony/lock": "<5.4",
"symfony/process": "<5.4"
},
"provide": {
"psr/log-implementation": "1.0|2.0|3.0"
},
"require-dev": {
"psr/log": "^1|^2|^3",
"symfony/config": "^5.4|^6.0",
"symfony/dependency-injection": "^5.4|^6.0",
"symfony/event-dispatcher": "^5.4|^6.0",
"symfony/lock": "^5.4|^6.0",
"symfony/process": "^5.4|^6.0",
"symfony/var-dumper": "^5.4|^6.0"
},
"suggest": {
"psr/log": "For using the console logger",
"symfony/event-dispatcher": "",
"symfony/lock": "",
"symfony/process": ""
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\Console\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Eases the creation of beautiful and testable command line interfaces",
"homepage": "https://symfony.com",
"keywords": [
"cli",
"command line",
"console",
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v6.0.17"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-12-28T14:21:34+00:00"
},
{
"name": "symfony/deprecation-contracts",
"version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
"reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
"shasum": ""
},
"require": {
"php": ">=8.0.2"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.0-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
}
},
"autoload": {
"files": [
"function.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-01-02T09:55:41+00:00"
},
{
"name": "symfony/event-dispatcher",
"version": "v6.0.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
"reference": "42b3985aa07837c9df36013ec5b965e9f2d480bc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/42b3985aa07837c9df36013ec5b965e9f2d480bc",
"reference": "42b3985aa07837c9df36013ec5b965e9f2d480bc",
"shasum": ""
},
"require": {
"php": ">=8.0.2",
"symfony/event-dispatcher-contracts": "^2|^3"
},
"conflict": {
"symfony/dependency-injection": "<5.4"
},
"provide": {
"psr/event-dispatcher-implementation": "1.0",
"symfony/event-dispatcher-implementation": "2.0|3.0"
},
"require-dev": {
"psr/log": "^1|^2|^3",
"symfony/config": "^5.4|^6.0",
"symfony/dependency-injection": "^5.4|^6.0",
"symfony/error-handler": "^5.4|^6.0",
"symfony/expression-language": "^5.4|^6.0",
"symfony/http-foundation": "^5.4|^6.0",
"symfony/service-contracts": "^1.1|^2|^3",
"symfony/stopwatch": "^5.4|^6.0"
},
"suggest": {
"symfony/dependency-injection": "",
"symfony/http-kernel": ""
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\EventDispatcher\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Provides 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.0.17"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-12-14T15:52:41+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
"version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
"reference": "7bc61cc2db649b4637d331240c5346dcc7708051"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7bc61cc2db649b4637d331240c5346dcc7708051",
"reference": "7bc61cc2db649b4637d331240c5346dcc7708051",
"shasum": ""
},
"require": {
"php": ">=8.0.2",
"psr/event-dispatcher": "^1"
},
"suggest": {
"symfony/event-dispatcher-implementation": ""
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.0-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
}
},
"autoload": {
"psr-4": {
"Symfony\\Contracts\\EventDispatcher\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Generic abstractions related to dispatching event",
"homepage": "https://symfony.com",
"keywords": [
"abstractions",
"contracts",
"decoupling",
"interfaces",
"interoperability",
"standards"
],
"support": {
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.2"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-01-02T09:55:41+00:00"
},
{
"name": "symfony/filesystem",
"version": "v6.0.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "3adca49133bd055ebe6011ed1e012be3c908af79"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/3adca49133bd055ebe6011ed1e012be3c908af79",
"reference": "3adca49133bd055ebe6011ed1e012be3c908af79",
"shasum": ""
},
"require": {
"php": ">=8.0.2",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.8"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\Filesystem\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/filesystem/tree/v6.0.13"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-09-21T20:25:27+00:00"
},
{
"name": "symfony/finder",
"version": "v6.0.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
"reference": "d467d625fc88f7cebf96f495e588a7196a669db1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/d467d625fc88f7cebf96f495e588a7196a669db1",
"reference": "d467d625fc88f7cebf96f495e588a7196a669db1",
"shasum": ""
},
"require": {
"php": ">=8.0.2"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\Finder\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/finder/tree/v6.0.17"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-12-22T17:53:58+00:00"
},
{
"name": "symfony/options-resolver",
"version": "v6.0.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/options-resolver.git",
"reference": "51f7006670febe4cbcbae177cbffe93ff833250d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/51f7006670febe4cbcbae177cbffe93ff833250d",
"reference": "51f7006670febe4cbcbae177cbffe93ff833250d",
"shasum": ""
},
"require": {
"php": ">=8.0.2",
"symfony/deprecation-contracts": "^2.1|^3"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\OptionsResolver\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Provides an improved replacement for the array_replace PHP function",
"homepage": "https://symfony.com",
"keywords": [
"config",
"configuration",
"options"
],
"support": {
"source": "https://github.com/symfony/options-resolver/tree/v6.0.3"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-01-02T09:55:41+00:00"
},
{
"name": "symfony/polyfill-ctype",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
"reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"provide": {
"ext-ctype": "*"
},
"suggest": {
"ext-ctype": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Ctype\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Gert de Pagter",
"email": "BackEndTea@gmail.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for ctype functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"ctype",
"polyfill",
"portable"
],
"support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
"reference": "511a08c03c1960e08a883f4cffcacd219b758354"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354",
"reference": "511a08c03c1960e08a883f4cffcacd219b758354",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Intl\\Grapheme\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for intl's grapheme_* functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"grapheme",
"intl",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
"reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Intl\\Normalizer\\": ""
},
"classmap": [
"Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for intl's Normalizer class and related functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"intl",
"normalizer",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"provide": {
"ext-mbstring": "*"
},
"suggest": {
"ext-mbstring": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Mbstring\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for the Mbstring extension",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"mbstring",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-php80",
"version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
"reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
"reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php80\\": ""
},
"classmap": [
"Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ion Bazan",
"email": "ion.bazan@gmail.com"
},
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/process",
"version": "v6.0.11",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
"reference": "44270a08ccb664143dede554ff1c00aaa2247a43"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/44270a08ccb664143dede554ff1c00aaa2247a43",
"reference": "44270a08ccb664143dede554ff1c00aaa2247a43",
"shasum": ""
},
"require": {
"php": ">=8.0.2"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\Process\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/process/tree/v6.0.11"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-06-27T17:10:44+00:00"
},
{
"name": "symfony/service-contracts",
"version": "v2.5.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
"reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
"reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"psr/container": "^1.1",
"symfony/deprecation-contracts": "^2.1|^3"
},
"conflict": {
"ext-psr": "<1.1|>=2"
},
"suggest": {
"symfony/service-implementation": ""
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
}
},
"autoload": {
"psr-4": {
"Symfony\\Contracts\\Service\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Generic abstractions related to writing services",
"homepage": "https://symfony.com",
"keywords": [
"abstractions",
"contracts",
"decoupling",
"interfaces",
"interoperability",
"standards"
],
"support": {
"source": "https://github.com/symfony/service-contracts/tree/v2.5.2"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-05-30T19:17:29+00:00"
},
{
"name": "symfony/string",
"version": "v6.0.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "3f57003dd8a67ed76870cc03092f8501db7788d9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/3f57003dd8a67ed76870cc03092f8501db7788d9",
"reference": "3f57003dd8a67ed76870cc03092f8501db7788d9",
"shasum": ""
},
"require": {
"php": ">=8.0.2",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-intl-grapheme": "~1.0",
"symfony/polyfill-intl-normalizer": "~1.0",
"symfony/polyfill-mbstring": "~1.0"
},
"conflict": {
"symfony/translation-contracts": "<2.0"
},
"require-dev": {
"symfony/error-handler": "^5.4|^6.0",
"symfony/http-client": "^5.4|^6.0",
"symfony/translation-contracts": "^2.0|^3.0",
"symfony/var-exporter": "^5.4|^6.0"
},
"type": "library",
"autoload": {
"files": [
"Resources/functions.php"
],
"psr-4": {
"Symfony\\Component\\String\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
"homepage": "https://symfony.com",
"keywords": [
"grapheme",
"i18n",
"string",
"unicode",
"utf-8",
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v6.0.17"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2022-12-14T15:52:41+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",
"version": "5.4.0",
"source": {
"type": "git",
"url": "https://github.com/vimeo/psalm.git",
"reference": "62db5d4f6a7ae0a20f7cc5a4952d730272fc0863"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/vimeo/psalm/zipball/62db5d4f6a7ae0a20f7cc5a4952d730272fc0863",
"reference": "62db5d4f6a7ae0a20f7cc5a4952d730272fc0863",
"shasum": ""
},
"require": {
"amphp/amp": "^2.4.2",
"amphp/byte-stream": "^1.5",
"composer/package-versions-deprecated": "^1.10.0",
"composer/semver": "^1.4 || ^2.0 || ^3.0",
"composer/xdebug-handler": "^2.0 || ^3.0",
"dnoegel/php-xdg-base-dir": "^0.1.1",
"ext-ctype": "*",
"ext-dom": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-simplexml": "*",
"ext-tokenizer": "*",
"felixfbecker/advanced-json-rpc": "^3.1",
"felixfbecker/language-server-protocol": "^1.5.2",
"fidry/cpu-core-counter": "^0.4.0",
"netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
"nikic/php-parser": "^4.13",
"php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0",
"sebastian/diff": "^4.0",
"spatie/array-to-xml": "^2.17.0",
"symfony/console": "^4.1.6 || ^5.0 || ^6.0",
"symfony/filesystem": "^5.4 || ^6.0",
"symfony/polyfill-php80": "^1.25"
},
"provide": {
"psalm/psalm": "self.version"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.4",
"brianium/paratest": "^6.0",
"ext-curl": "*",
"mockery/mockery": "^1.5",
"nunomaduro/mock-final-classes": "^1.1",
"php-parallel-lint/php-parallel-lint": "^1.2",
"phpstan/phpdoc-parser": "^1.6",
"phpunit/phpunit": "^9.5",
"psalm/plugin-mockery": "^1.1",
"psalm/plugin-phpunit": "^0.18",
"slevomat/coding-standard": "^8.4",
"squizlabs/php_codesniffer": "^3.6",
"symfony/process": "^4.4 || ^5.0 || ^6.0"
},
"suggest": {
"ext-curl": "In order to send data to shepherd",
"ext-igbinary": "^2.0.5 is required, used to serialize caching data"
},
"bin": [
"psalm",
"psalm-language-server",
"psalm-plugin",
"psalm-refactor",
"psalter"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.x-dev",
"dev-4.x": "4.x-dev",
"dev-3.x": "3.x-dev",
"dev-2.x": "2.x-dev",
"dev-1.x": "1.x-dev"
}
},
"autoload": {
"psr-4": {
"Psalm\\": "src/Psalm/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Matthew Brown"
}
],
"description": "A static analysis tool for finding errors in PHP applications",
"keywords": [
"code",
"inspection",
"php"
],
"support": {
"issues": "https://github.com/vimeo/psalm/issues",
"source": "https://github.com/vimeo/psalm/tree/5.4.0"
},
"time": "2022-12-19T21:31:12+00:00"
},
{
"name": "webimpress/coding-standard",
"version": "1.2.4",
"source": {
"type": "git",
"url": "https://github.com/webimpress/coding-standard.git",
"reference": "cd0c4b0b97440c337c1f7da17b524674ca2f9ca9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webimpress/coding-standard/zipball/cd0c4b0b97440c337c1f7da17b524674ca2f9ca9",
"reference": "cd0c4b0b97440c337c1f7da17b524674ca2f9ca9",
"shasum": ""
},
"require": {
"php": "^7.3 || ^8.0",
"squizlabs/php_codesniffer": "^3.6.2"
},
"require-dev": {
"phpunit/phpunit": "^9.5.13"
},
"type": "phpcodesniffer-standard",
"extra": {
"dev-master": "1.2.x-dev",
"dev-develop": "1.3.x-dev"
},
"autoload": {
"psr-4": {
"WebimpressCodingStandard\\": "src/WebimpressCodingStandard/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-2-Clause"
],
"description": "Webimpress Coding Standard",
"keywords": [
"Coding Standard",
"PSR-2",
"phpcs",
"psr-12",
"webimpress"
],
"support": {
"issues": "https://github.com/webimpress/coding-standard/issues",
"source": "https://github.com/webimpress/coding-standard/tree/1.2.4"
},
"funding": [
{
"url": "https://github.com/michalbundyra",
"type": "github"
}
],
"time": "2022-02-15T19:52:12+00:00"
},
{
"name": "webimpress/safe-writer",
"version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/webimpress/safe-writer.git",
"reference": "9d37cc8bee20f7cb2f58f6e23e05097eab5072e6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webimpress/safe-writer/zipball/9d37cc8bee20f7cb2f58f6e23e05097eab5072e6",
"reference": "9d37cc8bee20f7cb2f58f6e23e05097eab5072e6",
"shasum": ""
},
"require": {
"php": "^7.3 || ^8.0"
},
"require-dev": {
"phpunit/phpunit": "^9.5.4",
"vimeo/psalm": "^4.7",
"webimpress/coding-standard": "^1.2.2"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.2.x-dev",
"dev-develop": "2.3.x-dev",
"dev-release-1.0": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Webimpress\\SafeWriter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-2-Clause"
],
"description": "Tool to write files safely, to avoid race conditions",
"keywords": [
"concurrent write",
"file writer",
"race condition",
"safe writer",
"webimpress"
],
"support": {
"issues": "https://github.com/webimpress/safe-writer/issues",
"source": "https://github.com/webimpress/safe-writer/tree/2.2.0"
},
"funding": [
{
"url": "https://github.com/michalbundyra",
"type": "github"
}
],
"time": "2021-04-19T16:34:45+00:00"
},
{
"name": "webmozart/glob",
"version": "4.6.0",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/glob.git",
"reference": "3c17f7dec3d9d0e87b575026011f2e75a56ed655"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webmozarts/glob/zipball/3c17f7dec3d9d0e87b575026011f2e75a56ed655",
"reference": "3c17f7dec3d9d0e87b575026011f2e75a56ed655",
"shasum": ""
},
"require": {
"php": "^7.3 || ^8.0.0"
},
"require-dev": {
"phpunit/phpunit": "^9.5",
"symfony/filesystem": "^5.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.1-dev"
}
},
"autoload": {
"psr-4": {
"Webmozart\\Glob\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Bernhard Schussek",
"email": "bschussek@gmail.com"
}
],
"description": "A PHP implementation of Ant's glob.",
"support": {
"issues": "https://github.com/webmozarts/glob/issues",
"source": "https://github.com/webmozarts/glob/tree/4.6.0"
},
"time": "2022-05-24T19:45:58+00:00"
}
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": "~8.0.0 || ~8.1.0 || ~8.2.0"
},
"platform-dev": [],
"platform-overrides": {
"php": "8.0.99"
},
"plugin-api-version": "2.3.0"
}
PK K Vب] psalm-baseline.xmlnu ٘
$cacheConfiguration
$configuration
$cache
$cacheConfiguration
$caches
$caches
$configuration
$projectConfiguration
PatternOptions
$this->options
$function
$result
$result[1] ?? ''
$result[0]
$result[1]
$object
$result
$ret
$perm !== false
$perm !== false
decoct($perm)
$content
clearByGlob
set
$content
$perm
$perm
$perm
isFile
$publicDir
$perm
$perm !== false
decoct($perm)
$perm === false
0775
$perm === false
$perm === false
$method
$method
$callback[1]
$this->call('__set', [$name, $value])
$this->call('__unset', [$name])
$callback[1]
$property
$property
$property
$property
$property
$property
$property
$property
$value
bool
void
void
$method
$this->call('__isset', [$name])
$method
$method
$object
$object
$object
$object
$object
$object
$object
$object
$data
$key
$data
$key
(string) $key
$array
$dirPermission
$filePermission
$umask
(bool) $cacheOutput
(bool) $fileLocking
(bool) $objectCacheMagicProperties
(string) $indexFilename
(string) $objectKey
(string) $publicDir
is_array($result)
validateKey
validateKeys
validateStorage
$cleared
$key
$value
$value
flush
null === $ttl
$key
$key
$key
$key
$result
$result
$results[$key]
$value
$ttl
$ttl
null !== $this->storage->removeItem($key)
$pluginConfiguration
$pluginConfiguration['priority']
$container->get(AdapterPluginManager::class)
$container->get(StoragePluginFactoryInterface::class)
$container->get(PluginManager::class)
$plugin
$args['success']
$args['success']
'casToken'
'casToken'
'success'
'success'
'success'
'success'
bool
$args['key']
$args['key']
$args['key']
$args['key']
$handle
$keyValuePairs
$keyValuePairs
$keyValuePairs
$normalizedKey
$normalizedKey
$normalizedKey
$normalizedKey
$normalizedKey
$value
$value
$key
$normalizedKey
$normalizedKey
$normalizedKey
$normalizedKey
$normalizedKey
$handle
$normalizedKey
$normalizedKey
$normalizedKey
$normalizedKey
$normalizedKey
$normalizedKeyValuePairs[$key]
$oldValue
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result
$result[$normalizedKey]
$value
$value
$value
$value
$value
$value
$value
$value
AdapterOptions
Capabilities
array
array
array
array
array
array
array
array
array
array
array|bool
bool
bool
bool
bool
bool
bool
bool
int|bool
int|bool
int|bool
int|bool
setAdapter
$newValue
$newValue
$this->options
$this->triggerException(__FUNCTION__, $args, $keys, $e)
$this->triggerException(__FUNCTION__, $args, $keys, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerException(__FUNCTION__, $args, $result, $e)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$this->triggerPost(__FUNCTION__, $args, $result)
$success
$args['key']
$args['key']
$args['value']
$args['value']
$pluginRegistry
(bool) $flag
(int) $value
(int) $value
(string) $key
is_array($options)
$letters
$key
$letter
$letters
$array[$normalizedKey]
$key
$letter
$value
$this
(bool) $readable
(bool) $writable
(string) $keyPattern
(string) $namespace
(int) $mode
$instanceOf
is_string($name)
$name
$toType
$value
array
array
bool
bool
bool
float
int
int
int
int
string
$this->getCapability('lockOnExpire', 0)
$this->getCapability('maxKeyLength', self::UNKNOWN_KEY_LENGTH)
$this->getCapability('maxTtl', 0)
$this->getCapability('minTtl', 0)
$this->getCapability('namespaceIsPrefix', true)
$this->getCapability('namespaceSeparator', '')
$this->getCapability('staticTtl', false)
$this->getCapability('supportedMetadata', [])
$this->getCapability('ttlPrecision', 1)
$this->getCapability('useRequestTime', false)
(bool) $flag
(bool) $flag
(bool) $flag
(float) $ttlPrecision
(int) $maxKeyLength
(int) $maxTtl
(int) $minTtl
(int) $timeout
(string) $separator
Event
$target
$target
(bool) $flag
null === $this->options
$options
$options
$options
$options
$options
$this->serializer
SerializerAdapter
$this->serializerOptions
$serializer
(bool) $exitOnAbort
(bool) $throwExceptions
(int) $factor
$baseCapabilities
$baseCapabilities
$baseCapabilities->getAdapter()
$params['key']
$params['key']
$params['key']
$params['key']
$params['keyValuePairs']
$params['keyValuePairs']
$result
$value
$keyValuePairs[$failedKey]
$keyValuePairs[$failedKey]
$keyValuePairs[$key]
$keyValuePairs[$key]
$keyValuePairs[$key]
$keyValuePairs[$key]
$keyValuePairs[$key]
$keyValuePairs[$key]
$baseCapabilities
$failedKey
$failedKey
$key
$key
$keyValuePairs[$key]
$keyValuePairs[$key]
$keyValuePairs[$key]
$keyValuePairs[$key]
$newValue
$newValue
$oldValue
$oldValue
$result
$result
$result
$value
$value
$value
$value
$value
getAdapter
$keyValuePairs[$key]
$keyValuePairs[$key]
$oldValue
$oldValue
$params['value']
$oldValue
$oldValue
$plugin
$aliases
$factories
$instanceOf
$pattern
$pattern
$pattern
$pattern
$event
$key
$params['key']
$generatedKey
$key
$params
$return
$return
$usedKey
attach
getParams
call
call
call
call
call
call
generateKey
generateKey
getEventManager
setIndexFilename
$err['message']
$err['message']
$err['message']
set
set
$this->options
$this->options
$event
$params['key']
$generatedKey
$params
$return
$return
$usedKey
attach
getParams
$this->pattern->property
$this->pattern->property
$this->pattern->property
$this->pattern->property
$this->pattern->property
$this->pattern->unknownProperty
$this->options->getObject()->property
$this->options->getObject()->property
call
generateKey
getEventManager
getItem
setItem
end
start
start
start
emptyMethod
$keys
$keys
testDeleteItemInvalidKeyThrowsException
testGetItemInvalidKeyThrowsException
testHasItemInvalidKeyThrowsException
$item
$key
$key
$key
$item
$item
$item
get
get
get
get
get
getKey
isHit
isHit
isHit
isHit
isHit
isHit
isHit
set
'foo'
[]
testHasProxiesToStorage
testSetMultipleRaisesExceptionWhenTtlValueIsInvalid
testSetMultipleShouldRaisePsrInvalidArgumentExceptionForInvalidKeys
testSetMultipleShouldRemoveItemsFromCacheIfTtlIsBelow1
testSetMultipleShouldRemoveItemsFromCacheIfTtlIsBelow1AndStorageDoesNotSupportPerItemTtl
testSetRaisesExceptionWhenTtlValueIsInvalid
testSetShouldAcknowledgeStorageAdapterMaxKeyLengthWithPsrDecorator
testSetShouldRaisePsrInvalidArgumentExceptionForInvalidKeys
testSetShouldRemoveItemFromCacheIfTtlIsBelow1
testSetShouldRemoveItemFromCacheIfTtlIsBelow1AndStorageDoesNotSupportPerItemTtl
$ttl
$ttl
array
array
array
setCapabilities
TtlStorage
Generator
Generator
$event
static function ($event) use ($retVal) {
$success
$eventList[]
$eventList[]
$eventList[]
$result
$result
$rs
$v
array
getResult
stopPropagation
null
getNamespace
setKeyPattern
setKeyPattern
setKeyPattern
setNamespace
setNamespace
setReadable
setTtl
setTtl
setWritable
$success
$calledArgs
$calledArgs[0]
getKeyPattern
getTtl
setAdapter
setFromArray
setKeyPattern
setKeyPattern
setNamespace
setReadable
setTtl
setTtl
setWritable
addPlugin
testPluginAliasesResolve
testShareByDefaultAndSharedByDefault
'ArrayObject'
$eventArg
$em
$event
attach
getEventManager
getCommonPluginNamesProvider
testOptionObjectAvailable
testOptionsGetAndSetDefault
$this->adapter->getEventManager()
$this->adapter->getEventManager()
setMethods
$cb
$cb
$cb[0]
$cb[1]
clearExpiredByFactor
$this->adapter->getEventManager()
$this->adapter->getEventManager()
$cb
$cb
$cb[0]
$cb[1]
$exception
onException
onException
$this->adapter->getEventManager()
$this->adapter->getEventManager()
$cb
$cb
$cb[0]
$cb[1]
$this->adapter->getEventManager()
$this->adapter->getEventManager()
setMethods
$cb
$cb
$cb[0]
$cb[1]
optimizeByFactor
$events
$events
$events
$this->adapter->getEventManager()
$cb
$cb
$cb[0]
$cb[1]
$casToken
$casToken
$casToken
$success
$success
$success
$values
$values['key1']
$values['key2']
$values
onDecrementItemPre
onReadItemPost
onReadItemPost
onReadItemsPost
testShareByDefaultAndSharedByDefault
clearExpired
ClearExpiredMockAdapter
internalGetItem
internalRemoveItem
internalSetItem
MockAdapter
$options
$options instanceof Plugin\PluginOptions
optimize
OptimizableMockAdapter
PK K VW README.mdnu ٘ # laminas-cache
[![Build Status](https://github.com/laminas/laminas-cache/actions/workflows/continuous-integration.yml/badge.svg)](https://github.com/laminas/laminas-cache/actions/workflows/continuous-integration.yml)
> ## 🇷🇺 Русским гражданам
>
> Мы, участники Laminas, родились и живем в разных странах. У многих из нас есть друзья, родственники и коллеги как в России, так и в Украине. Некоторые из нас родились в России. Некоторые из нас живут в России. У некоторых бабушки и дедушки сражались с фашистами во Второй мировой войне. Здесь никто не поддерживает фашизм.
>
> У одного из нас есть украинская родственница, которая спаслась из дома вместе с сыном. Поезд задержался из-за бомбежки на дороге впереди. У нас есть друзья, которые прячутся в бомбоубежищах. Мы с тревогой ждем весточки от них после воздушных налетов, которые беспорядочно наносят удары и попадают по больницам, школам, детским садам и домам. Мы не берем это из каких-либо СМИ. Мы наблюдаем это напрямую.
>
> Вы доверяете нам достаточно, чтоб использовать наши программы, и мы просим вас довериться нам вновь. Мы нуждаемся в помощи. Выходите и протестуйте против этой бесполезной войны. Остановите кровопролитие. Скажите "Нет войне!"
>
> ## 🇺🇸 To Citizens of Russia
>
> We at Laminas come from all over the world. Many of us have friends, family and colleagues in both Russia and Ukraine. Some of us were born in Russia. Some of us currently live in Russia. Some have grandparents who fought Nazis in World War II. Nobody here supports fascism.
>
> One team member has a Ukrainian relative who fled her home with her son. The train was delayed due to bombing on the road ahead. We have friends who are hiding in bomb shelters. We anxiously follow up on them after the air raids, which indiscriminately fire at hospitals, schools, kindergartens and houses. We're not taking this from any media. These are our actual experiences.
>
> You trust us enough to use our software. We ask that you trust us to say the truth on this. We need your help. Go out and protest this unnecessary war. Stop the bloodshed. Say "stop the war!"
`Laminas\Cache` provides a general cache system for PHP. The `Laminas\Cache` component
is able to cache different patterns (class, object, output, etc) using different
storage adapters (DB, File, Memcache, etc).
- File issues at https://github.com/laminas/laminas-cache/issues
- Documentation is at https://docs.laminas.dev/laminas-cache/
## Standalone
If this component is used without `laminas-mvc` or `mezzio`, a PSR-11 container to fetch services, adapters, plugins, etc. is needed.
The easiest way would be to use [laminas-config-aggregator](https://docs.laminas.dev/laminas-config-aggregator/) along with [laminas-servicemanager](https://docs.laminas.dev/laminas-servicemanager/).
```php
use Laminas\Cache\ConfigProvider;
use Laminas\Cache\Service\StorageAdapterFactoryInterface;
use Laminas\Cache\Storage\Adapter\Memory;
use Laminas\ConfigAggregator\ConfigAggregator;
use Laminas\ServiceManager\ServiceManager;
$config = (new ConfigAggregator([
ConfigProvider::class,
]))->getMergedConfig();
$dependencies = $config['dependencies'];
$container = new ServiceManager($dependencies);
/** @var StorageAdapterFactoryInterface $storageFactory */
$storageFactory = $container->get(StorageAdapterFactoryInterface::class);
$storage = $storageFactory->create(Memory::class);
$storage->setItem('foo', 'bar');
```
## Benchmarks
We provide scripts for benchmarking laminas-cache using the
[PHPBench](https://github.com/phpbench/phpbench) framework; these can be
found in the `benchmark/` directory.
To execute the benchmarks you can run the following command:
```bash
$ vendor/bin/phpbench run --report=aggregate
```
PK K Va5 psalm.xmlnu ٘
PK K Vm;
renovate.jsonnu ٘ {
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"local>laminas/.github:renovate-config"
]
}
PK K Vv5 .laminas-ci/pre-install.shnu ȯ #!/bin/bash
WORKING_DIRECTORY=$2
JOB=$3
PHP_VERSION=$(echo "${JOB}" | jq -r '.php')
if [ ! -z "$GITHUB_BASE_REF" ] && [[ "$GITHUB_BASE_REF" =~ ^[0-9]+\.[0-9] ]]; then
readarray -td. TARGET_BRANCH_VERSION_PARTS <<<"${GITHUB_BASE_REF}.";
unset 'TARGET_BRANCH_VERSION_PARTS[-1]';
declare -a TARGET_BRANCH_VERSION_PARTS
MAJOR_OF_TARGET_BRANCH=${TARGET_BRANCH_VERSION_PARTS[0]}
MINOR_OF_TARGET_BRANCH=${TARGET_BRANCH_VERSION_PARTS[1]}
export COMPOSER_ROOT_VERISON="${MAJOR_OF_TARGET_BRANCH}.${MINOR_OF_TARGET_BRANCH}.99"
echo "Exported COMPOSER_ROOT_VERISON as ${COMPOSER_ROOT_VERISON}"
fi
${WORKING_DIRECTORY}/.laminas-ci/install-apcu-extension-via-pecl.sh "${PHP_VERSION}" || exit 1
PK K VQTW W . .laminas-ci/install-apcu-extension-via-pecl.shnu ȯ #!/bin/bash
PHP_VERSION="$1"
if ! [[ "${PHP_VERSION}" =~ 8\.2 ]]; then
echo "APCu is only installed from pecl for PHP 8.2, ${PHP_VERSION} detected."
exit 0;
fi
set +e
pecl install --configureoptions 'enable-apcu-debug="no"' apcu
echo "extension=apcu.so" > /etc/php/${PHP_VERSION}/mods-available/apcu.ini
phpenmod -v ${PHP} -s cli apcu
PK K V ' src/Pattern/StorageCapableInterface.phpnu ٘ filePermission = false;
$this->dirPermission = false;
}
parent::__construct($options);
}
/**
* Set flag indicating whether or not to cache by default
*
* Used by:
* - ObjectCache
*
* @param bool $cacheByDefault
* @return PatternOptions Provides a fluent interface
*/
public function setCacheByDefault($cacheByDefault)
{
$this->cacheByDefault = $cacheByDefault;
return $this;
}
/**
* Do we cache by default?
*
* Used by:
* - ObjectCache
*
* @return bool
*/
public function getCacheByDefault()
{
return $this->cacheByDefault;
}
/**
* Set whether or not to cache output
*
* Used by:
* - CallbackCache
* - ObjectCache
*
* @param bool $cacheOutput
* @return PatternOptions Provides a fluent interface
*/
public function setCacheOutput($cacheOutput)
{
$this->cacheOutput = (bool) $cacheOutput;
return $this;
}
/**
* Will we cache output?
*
* Used by:
* - CallbackCache
* - ObjectCache
*
* @return bool
*/
public function getCacheOutput()
{
return $this->cacheOutput;
}
/**
* Set directory permission
*
* @param false|int|string|float $dirPermission
* @throws Exception\InvalidArgumentException
* @return PatternOptions Provides a fluent interface
*/
public function setDirPermission($dirPermission)
{
if ($dirPermission !== false) {
if (is_string($dirPermission)) {
$dirPermission = octdec($dirPermission);
} else {
$dirPermission = (int) $dirPermission;
}
/**
* Code is untested, applying strict type check might lead to unexpected errors.
*
* @phpcs:disable SlevomatCodingStandard.Operators.DisallowEqualOperators.DisallowedNotEqualOperator
*/
if (($dirPermission & 0700) != 0700) {
throw new Exception\InvalidArgumentException(
'Invalid directory permission: need permission to execute, read and write by owner'
);
}
}
$this->dirPermission = $dirPermission;
return $this;
}
/**
* Gets directory permission
*
* @return false|int
*/
public function getDirPermission()
{
return $this->dirPermission;
}
/**
* Set umask
*
* Used by:
* - CaptureCache
*
* @param false|int|string|float $umask
* @throws Exception\InvalidArgumentException
* @return PatternOptions Provides a fluent interface
*/
public function setUmask($umask)
{
if ($umask !== false) {
if (is_string($umask)) {
$umask = octdec($umask);
} else {
$umask = (int) $umask;
}
// validate
if ($umask & 0700) {
throw new Exception\InvalidArgumentException(
'Invalid umask: need permission to execute, read and write by owner'
);
}
// normalize
$umask &= ~0002;
}
$this->umask = $umask;
return $this;
}
/**
* Get umask
*
* Used by:
* - CaptureCache
*
* @return false|int
*/
public function getUmask()
{
return $this->umask;
}
/**
* Set whether or not file locking should be used
*
* Used by:
* - CaptureCache
*
* @param bool $fileLocking
* @return PatternOptions Provides a fluent interface
*/
public function setFileLocking($fileLocking)
{
$this->fileLocking = (bool) $fileLocking;
return $this;
}
/**
* Is file locking enabled?
*
* Used by:
* - CaptureCache
*
* @return bool
*/
public function getFileLocking()
{
return $this->fileLocking;
}
/**
* Set file permission
*
* @param false|int|string|float $filePermission
* @throws Exception\InvalidArgumentException
* @return PatternOptions Provides a fluent interface
*/
public function setFilePermission($filePermission)
{
if ($filePermission !== false) {
if (is_string($filePermission)) {
$filePermission = octdec($filePermission);
} else {
$filePermission = (int) $filePermission;
}
/**
* Code is untested, applying strict type check might lead to unexpected errors.
*
* @phpcs:disable SlevomatCodingStandard.Operators.DisallowEqualOperators.DisallowedNotEqualOperator
*/
if (($filePermission & 0600) != 0600) {
throw new Exception\InvalidArgumentException(
'Invalid file permission: need permission to read and write by owner'
);
}
if ($filePermission & 0111) {
throw new Exception\InvalidArgumentException(
"Invalid file permission: Files shouldn't be executable"
);
}
}
$this->filePermission = $filePermission;
return $this;
}
/**
* Gets file permission
*
* @return false|int
*/
public function getFilePermission()
{
return $this->filePermission;
}
/**
* Set value for index filename
*
* @param string $indexFilename
* @return PatternOptions Provides a fluent interface
*/
public function setIndexFilename($indexFilename)
{
$this->indexFilename = (string) $indexFilename;
return $this;
}
/**
* Get value for index filename
*
* @return string
*/
public function getIndexFilename()
{
return $this->indexFilename;
}
/**
* Set object to cache
*
* @throws Exception\InvalidArgumentException
* @return PatternOptions Provides a fluent interface
*/
public function setObject(mixed $object)
{
if (! is_object($object)) {
throw new Exception\InvalidArgumentException(
sprintf('%s expects an object; received "%s"', __METHOD__, gettype($object))
);
}
$this->object = $object;
return $this;
}
/**
* Get object to cache
*
* @return null|object
*/
public function getObject()
{
return $this->object;
}
/**
* Set flag indicating whether or not to cache magic properties
*
* Used by:
* - ObjectCache
*
* @param bool $objectCacheMagicProperties
* @return PatternOptions Provides a fluent interface
*/
public function setObjectCacheMagicProperties($objectCacheMagicProperties)
{
$this->objectCacheMagicProperties = (bool) $objectCacheMagicProperties;
return $this;
}
/**
* Should we cache magic properties?
*
* Used by:
* - ObjectCache
*
* @return bool
*/
public function getObjectCacheMagicProperties()
{
return $this->objectCacheMagicProperties;
}
/**
* Set list of object methods for which to cache return values
*
* @return PatternOptions Provides a fluent interface
* @throws Exception\InvalidArgumentException
*/
public function setObjectCacheMethods(array $objectCacheMethods)
{
$this->objectCacheMethods = $this->normalizeObjectMethods($objectCacheMethods);
return $this;
}
/**
* Get list of object methods for which to cache return values
*
* @return array
*/
public function getObjectCacheMethods()
{
return $this->objectCacheMethods;
}
/**
* Set the object key part.
*
* Used to generate a callback key in order to speed up key generation.
*
* Used by:
* - ObjectCache
*
* @param null|string $objectKey The object key or NULL to use the objects class name
* @return PatternOptions Provides a fluent interface
*/
public function setObjectKey($objectKey)
{
if ($objectKey !== null) {
$this->objectKey = (string) $objectKey;
} else {
$this->objectKey = null;
}
return $this;
}
/**
* Get object key
*
* Used by:
* - ObjectCache
*
* @return string
*/
public function getObjectKey()
{
if ($this->objectKey === null) {
return $this->getObject()::class;
}
return $this->objectKey;
}
/**
* Set list of object methods for which NOT to cache return values
*
* @return PatternOptions Provides a fluent interface
* @throws Exception\InvalidArgumentException
*/
public function setObjectNonCacheMethods(array $objectNonCacheMethods)
{
$this->objectNonCacheMethods = $this->normalizeObjectMethods($objectNonCacheMethods);
return $this;
}
/**
* Get list of object methods for which NOT to cache return values
*
* @return array
*/
public function getObjectNonCacheMethods()
{
return $this->objectNonCacheMethods;
}
/**
* Set location of public directory
*
* Used by:
* - CaptureCache
*
* @param string $publicDir
* @throws Exception\InvalidArgumentException
* @return PatternOptions Provides a fluent interface
*/
public function setPublicDir($publicDir)
{
$publicDir = (string) $publicDir;
if (! is_dir($publicDir)) {
throw new Exception\InvalidArgumentException(
"Public directory '{$publicDir}' not found or not a directory"
);
} elseif (! is_writable($publicDir)) {
throw new Exception\InvalidArgumentException(
"Public directory '{$publicDir}' not writable"
);
} elseif (! is_readable($publicDir)) {
throw new Exception\InvalidArgumentException(
"Public directory '{$publicDir}' not readable"
);
}
$this->publicDir = rtrim(realpath($publicDir), DIRECTORY_SEPARATOR);
return $this;
}
/**
* Get location of public directory
*
* Used by:
* - CaptureCache
*
* @return null|string
*/
public function getPublicDir()
{
return $this->publicDir;
}
/**
* Recursively apply strtolower on all values of an array, and return as a
* list of unique values
*
* @return array
*/
protected function recursiveStrtolower(array $array)
{
return array_values(array_unique(array_map('strtolower', $array)));
}
/**
* Normalize object methods
*
* Recursively casts values to lowercase, then determines if any are in a
* list of methods not handled, raising an exception if so.
*
* @param array $methods
* @return array
* @throws Exception\InvalidArgumentException
*/
protected function normalizeObjectMethods(array $methods)
{
$methods = $this->recursiveStrtolower($methods);
$intersect = array_intersect(['__set', '__get', '__unset', '__isset'], $methods);
if (! empty($intersect)) {
throw new Exception\InvalidArgumentException(
"Magic properties are handled by option 'cache_magic_properties'"
);
}
return $methods;
}
}
PK K VRN src/Pattern/PatternInterface.phpnu ٘ getOptions();
$storage = $this->getStorage();
$success = null;
$key = $this->generateCallbackKey($callback, $args);
$result = $storage->getItem($key, $success);
if ($success) {
if (! array_key_exists(0, $result)) {
throw new Exception\RuntimeException("Invalid cached data for key '{$key}'");
}
echo $result[1] ?? '';
return $result[0];
}
$cacheOutput = $options->getCacheOutput();
if ($cacheOutput) {
ob_start();
ob_implicit_flush(false);
}
// TODO: do not cache on errors using [set|restore]_error_handler
try {
$ret = $callback(...$args);
} catch (\Exception $e) {
if ($cacheOutput) {
ob_end_flush();
}
throw $e;
}
if ($cacheOutput) {
$data = [$ret, ob_get_flush()];
} else {
$data = [$ret];
}
$storage->setItem($key, $data);
return $ret;
}
/**
* function call handler
*
* @param string $function Function name to call
* @param array $args Function arguments
* @return mixed
* @throws Exception\RuntimeException
* @throws \Exception
*/
public function __call($function, array $args)
{
return $this->call($function, $args);
}
/**
* Generate a unique key in base of a key representing the callback part
* and a key representing the arguments part.
*
* @param callable $callback A valid callback
* @param array $args Callback arguments
* @return string
* @throws Exception\RuntimeException
* @throws Exception\InvalidArgumentException
*/
public function generateKey($callback, array $args = [])
{
return $this->generateCallbackKey($callback, $args);
}
/**
* Generate a unique key in base of a key representing the callback part
* and a key representing the arguments part.
*
* @param callable $callback A valid callback
* @param array $args Callback arguments
* @throws Exception\RuntimeException If callback not serializable.
* @throws Exception\InvalidArgumentException If invalid callback.
* @return string
*/
protected function generateCallbackKey($callback, array $args)
{
if (! is_callable($callback, false, $callbackKey)) {
throw new Exception\InvalidArgumentException('Invalid callback');
}
// functions, methods and classnames are case-insensitive
$callbackKey = strtolower($callbackKey);
// generate a unique key of object callbacks
if (is_object($callback)) {
// Closures & __invoke
$object = $callback;
} elseif (isset($callback[0])) {
// array($object, 'method')
$object = $callback[0];
}
if (isset($object)) {
ErrorHandler::start();
try {
$serializedObject = serialize($object);
} catch (\Exception $e) {
ErrorHandler::stop();
throw new Exception\RuntimeException("Can't serialize callback: see previous exception", 0, $e);
}
$error = ErrorHandler::stop();
if (! $serializedObject) {
throw new Exception\RuntimeException(
sprintf('Cannot serialize callback%s', $error ? ': ' . $error->getMessage() : ''),
0,
$error
);
}
$callbackKey .= $serializedObject;
}
return md5($callbackKey) . $this->generateArgumentsKey($args);
}
/**
* Generate a unique key of the argument part.
*
* @throws Exception\RuntimeException
* @return string
*/
protected function generateArgumentsKey(array $args)
{
if (! $args) {
return '';
}
ErrorHandler::start();
try {
$serializedArgs = serialize(array_values($args));
} catch (\Exception $e) {
ErrorHandler::stop();
throw new Exception\RuntimeException("Can't serialize arguments: see previous exception", 0, $e);
}
$error = ErrorHandler::stop();
if (! $serializedArgs) {
throw new Exception\RuntimeException(
sprintf('Cannot serialize arguments%s', $error ? ': ' . $error->getMessage() : ''),
0,
$error
);
}
return md5($serializedArgs);
}
}
PK K VH - src/Pattern/AbstractStorageCapablePattern.phpnu ٘ storage;
}
}
PK K Vs s src/Pattern/OutputCache.phpnu ٘ getStorage();
$data = $storage->getItem($key, $success);
if ($success) {
echo $data;
return true;
}
ob_start();
ob_implicit_flush(false);
$this->keyStack[] = $key;
return false;
}
/**
* Stops buffering output, write buffered data to cache using the given key on start()
* and displays the buffer.
*
* @throws Exception\RuntimeException If output cache not started or buffering not active.
* @return bool TRUE on success, FALSE on failure writing to cache
*/
public function end()
{
$key = array_pop($this->keyStack);
if ($key === null) {
throw new Exception\RuntimeException('Output cache not started');
}
$output = ob_get_flush();
if ($output === false) {
throw new Exception\RuntimeException('Output buffering not active');
}
$storage = $this->getStorage();
return $storage->setItem($key, $output);
}
}
PK K V[*r- - src/Pattern/CaptureCache.phpnu ٘ detectPageId();
}
ob_start(function ($content) use ($pageId): bool {
$this->set($content, $pageId);
// http://php.net/manual/function.ob-start.php
// -> If output_callback returns FALSE original input is sent to the browser.
return false;
});
ob_implicit_flush(false);
}
/**
* Write content to page identity
*
* @param string $content
* @param null|string $pageId
* @throws Exception\LogicException
*/
public function set($content, $pageId = null)
{
$publicDir = $this->getOptions()->getPublicDir();
if ($publicDir === null) {
throw new Exception\LogicException("Option 'public_dir' no set");
}
if ($pageId === null) {
$pageId = $this->detectPageId();
}
$path = $this->pageId2Path($pageId);
$file = $path . DIRECTORY_SEPARATOR . $this->pageId2Filename($pageId);
$this->createDirectoryStructure($publicDir . DIRECTORY_SEPARATOR . $path);
$this->putFileContent($publicDir . DIRECTORY_SEPARATOR . $file, $content);
}
/**
* Get from cache
*
* @param null|string $pageId
* @return string|null
* @throws Exception\LogicException
* @throws Exception\RuntimeException
*/
public function get($pageId = null)
{
$publicDir = $this->getOptions()->getPublicDir();
if ($publicDir === null) {
throw new Exception\LogicException("Option 'public_dir' no set");
}
if ($pageId === null) {
$pageId = $this->detectPageId();
}
$file = $publicDir
. DIRECTORY_SEPARATOR . $this->pageId2Path($pageId)
. DIRECTORY_SEPARATOR . $this->pageId2Filename($pageId);
if (file_exists($file)) {
ErrorHandler::start();
$content = file_get_contents($file);
$error = ErrorHandler::stop();
if ($content === false) {
throw new Exception\RuntimeException("Failed to read cached pageId '{$pageId}'", 0, $error);
}
return $content;
}
}
/**
* Checks if a cache with given id exists
*
* @param null|string $pageId
* @throws Exception\LogicException
* @return bool
*/
public function has($pageId = null)
{
$publicDir = $this->getOptions()->getPublicDir();
if ($publicDir === null) {
throw new Exception\LogicException("Option 'public_dir' no set");
}
if ($pageId === null) {
$pageId = $this->detectPageId();
}
$file = $publicDir
. DIRECTORY_SEPARATOR . $this->pageId2Path($pageId)
. DIRECTORY_SEPARATOR . $this->pageId2Filename($pageId);
return file_exists($file);
}
/**
* Remove from cache
*
* @param null|string $pageId
* @throws Exception\LogicException
* @throws Exception\RuntimeException
* @return bool
*/
public function remove($pageId = null)
{
$publicDir = $this->getOptions()->getPublicDir();
if ($publicDir === null) {
throw new Exception\LogicException("Option 'public_dir' no set");
}
if ($pageId === null) {
$pageId = $this->detectPageId();
}
$file = $publicDir
. DIRECTORY_SEPARATOR . $this->pageId2Path($pageId)
. DIRECTORY_SEPARATOR . $this->pageId2Filename($pageId);
if (file_exists($file)) {
ErrorHandler::start();
$res = unlink($file);
$err = ErrorHandler::stop();
if (! $res) {
throw new Exception\RuntimeException("Failed to remove cached pageId '{$pageId}'", 0, $err);
}
return true;
}
return false;
}
/**
* Clear cached pages matching glob pattern
*
* @param string $pattern
* @throws Exception\LogicException
*/
public function clearByGlob($pattern = '**')
{
$publicDir = $this->getOptions()->getPublicDir();
if ($publicDir === null) {
throw new Exception\LogicException("Option 'public_dir' no set");
}
$it = new GlobIterator(
$publicDir . '/' . $pattern,
GlobIterator::CURRENT_AS_SELF | GlobIterator::SKIP_DOTS | GlobIterator::UNIX_PATHS
);
foreach ($it as $pathname => $entry) {
if ($entry->isFile()) {
unlink($pathname);
}
}
}
/**
* Determine the page to save from the request
*
* @throws Exception\RuntimeException
* @return string
*/
protected function detectPageId()
{
if (! isset($_SERVER['REQUEST_URI'])) {
throw new Exception\RuntimeException("Can't auto-detect current page identity");
}
return $_SERVER['REQUEST_URI'];
}
/**
* Get filename for page id
*
* @param string $pageId
* @return string
*/
protected function pageId2Filename($pageId)
{
if (str_ends_with($pageId, '/')) {
return $this->getOptions()->getIndexFilename();
}
return basename($pageId);
}
/**
* Get path for page id
*
* @param string $pageId
* @return string
*/
protected function pageId2Path($pageId)
{
if (str_ends_with($pageId, '/')) {
$path = rtrim($pageId, '/');
} else {
$path = dirname($pageId);
}
// convert requested "/" to the valid local directory separator
if (DIRECTORY_SEPARATOR !== '/') {
$path = str_replace('/', DIRECTORY_SEPARATOR, $path);
}
return $path;
}
/**
* Write content to a file
*
* @param string $file File complete path
* @param string $data Data to write
* @return void
* @throws Exception\RuntimeException
*/
protected function putFileContent($file, $data)
{
$options = $this->getOptions();
$locking = $options->getFileLocking();
$perm = $options->getFilePermission();
$umask = $options->getUmask();
if ($umask !== false && $perm !== false) {
$perm &= ~$umask;
}
ErrorHandler::start();
$umask = $umask !== false ? umask($umask) : false;
$rs = file_put_contents($file, $data, $locking ? LOCK_EX : 0);
if ($umask) {
umask($umask);
}
if ($rs === false) {
$err = ErrorHandler::stop();
throw new Exception\RuntimeException("Error writing file '{$file}'", 0, $err);
}
if ($perm !== false && ! chmod($file, $perm)) {
$oct = decoct($perm);
$err = ErrorHandler::stop();
throw new Exception\RuntimeException("chmod('{$file}', 0{$oct}) failed", 0, $err);
}
ErrorHandler::stop();
}
/**
* Creates directory if not already done.
*
* @param string $pathname
* @return void
* @throws Exception\RuntimeException
*/
protected function createDirectoryStructure($pathname)
{
// Directory structure already exists
if (file_exists($pathname)) {
return;
}
$options = $this->getOptions();
$perm = $options->getDirPermission();
$umask = $options->getUmask();
if ($umask !== false && $perm !== false) {
$perm &= ~$umask;
}
ErrorHandler::start();
if ($perm === false) {
// built-in mkdir function is enough
$umask = $umask !== false ? umask($umask) : false;
$res = mkdir($pathname, $perm !== false ? $perm : 0775, true);
if ($umask !== false) {
umask($umask);
}
if (! $res) {
$oct = $perm === false ? '775' : decoct($perm);
$err = ErrorHandler::stop();
throw new Exception\RuntimeException("mkdir('{$pathname}', 0{$oct}, true) failed", 0, $err);
}
if ($perm !== false && ! chmod($pathname, $perm)) {
$oct = decoct($perm);
$err = ErrorHandler::stop();
throw new Exception\RuntimeException("chmod('{$pathname}', 0{$oct}) failed", 0, $err);
}
} else {
// built-in mkdir function sets permission together with current umask
// which doesn't work well on multo threaded webservers
// -> create directories one by one and set permissions
// find existing path and missing path parts
$parts = [];
$path = $pathname;
while (! file_exists($path)) {
array_unshift($parts, basename($path));
$nextPath = dirname($path);
if ($nextPath === $path) {
break;
}
$path = $nextPath;
}
// make all missing path parts
foreach ($parts as $part) {
$path .= DIRECTORY_SEPARATOR . $part;
// create a single directory, set and reset umask immediately
$umask = $umask !== false ? umask($umask) : false;
$res = mkdir($path, $perm === false ? 0775 : $perm, false);
if ($umask !== false) {
umask($umask);
}
if (! $res) {
$oct = $perm === false ? '775' : decoct($perm);
ErrorHandler::stop();
throw new Exception\RuntimeException(
"mkdir('{$path}', 0{$oct}, false) failed"
);
}
if ($perm !== false && ! chmod($path, $perm)) {
$oct = decoct($perm);
ErrorHandler::stop();
throw new Exception\RuntimeException(
"chmod('{$path}', 0{$oct}) failed"
);
}
}
}
ErrorHandler::stop();
}
/**
* Returns the generated file name.
*
* @param null|string $pageId
* @return string
*/
public function getFilename($pageId = null)
{
if ($pageId === null) {
$pageId = $this->detectPageId();
}
$publicDir = $this->getOptions()->getPublicDir();
$path = $this->pageId2Path($pageId);
$file = $path . DIRECTORY_SEPARATOR . $this->pageId2Filename($pageId);
return $publicDir . $file;
}
}
PK K V"Ѳx x src/Pattern/AbstractPattern.phpnu ٘ options = $options;
return $this;
}
/**
* @return PatternOptions
*/
public function getOptions()
{
if (null === $this->options) {
$this->setOptions(new PatternOptions());
}
return $this->options;
}
}
PK K VĆ # # src/Pattern/ObjectCache.phpnu ٘ getObject()) {
throw new Exception\InvalidArgumentException("Missing option 'object'");
}
return $this;
}
/**
* Call and cache a class method
*
* @param string $method Method name to call
* @param array $args Method arguments
* @return mixed
* @throws Exception\RuntimeException
* @throws \Exception
*/
public function call($method, array $args = [])
{
$options = $this->getOptions();
$object = $options->getObject();
$method = strtolower($method);
// handle magic methods
switch ($method) {
case '__set':
$property = array_shift($args);
$value = array_shift($args);
$object->{$property} = $value;
if (
! $options->getObjectCacheMagicProperties()
|| property_exists($object, $property)
) {
// no caching if property isn't magic
// or caching magic properties is disabled
return;
}
// remove cached __get and __isset
$removeKeys = null;
if (method_exists($object, '__get')) {
$removeKeys[] = $this->generateKey('__get', [$property]);
}
if (method_exists($object, '__isset')) {
$removeKeys[] = $this->generateKey('__isset', [$property]);
}
if ($removeKeys) {
$storage = $this->getStorage();
$storage->removeItems($removeKeys);
}
return;
case '__get':
$property = array_shift($args);
if (
! $options->getObjectCacheMagicProperties()
|| property_exists($object, $property)
) {
// no caching if property isn't magic
// or caching magic properties is disabled
return $object->{$property};
}
array_unshift($args, $property);
return parent::call([$object, '__get'], $args);
case '__isset':
$property = array_shift($args);
if (
! $options->getObjectCacheMagicProperties()
|| property_exists($object, $property)
) {
// no caching if property isn't magic
// or caching magic properties is disabled
return isset($object->{$property});
}
return parent::call([$object, '__isset'], [$property]);
case '__unset':
$property = array_shift($args);
unset($object->{$property});
if (
! $options->getObjectCacheMagicProperties()
|| property_exists($object, $property)
) {
// no caching if property isn't magic
// or caching magic properties is disabled
return;
}
// remove previous cached __get and __isset calls
$removeKeys = null;
if (method_exists($object, '__get')) {
$removeKeys[] = $this->generateKey('__get', [$property]);
}
if (method_exists($object, '__isset')) {
$removeKeys[] = $this->generateKey('__isset', [$property]);
}
if ($removeKeys) {
$storage = $this->getStorage();
$storage->removeItems($removeKeys);
}
return;
}
$cache = $options->getCacheByDefault();
if ($cache) {
$cache = ! in_array($method, $options->getObjectNonCacheMethods());
} else {
$cache = in_array($method, $options->getObjectCacheMethods());
}
if (! $cache) {
return $object->{$method}(...$args);
}
return parent::call([$object, $method], $args);
}
/**
* Generate a unique key in base of a key representing the callback part
* and a key representing the arguments part.
*
* @param string $method The method
* @param array $args Callback arguments
* @return string
* @throws Exception\RuntimeException
*/
public function generateKey($method, array $args = [])
{
return $this->generateCallbackKey(
[$this->getOptions()->getObject(), $method],
$args
);
}
/**
* Generate a unique key in base of a key representing the callback part
* and a key representing the arguments part.
*
* @param callable $callback A valid callback
* @param array $args Callback arguments
* @return string
* @throws Exception\RuntimeException
*/
protected function generateCallbackKey($callback, array $args = [])
{
$callbackKey = md5($this->getOptions()->getObjectKey() . '::' . strtolower($callback[1]));
$argumentKey = $this->generateArgumentsKey($args);
return $callbackKey . $argumentKey;
}
/**
* Class method call handler
*
* @param string $method Method name to call
* @param array $args Method arguments
* @return mixed
* @throws Exception\RuntimeException
* @throws \Exception
*/
public function __call($method, array $args)
{
return $this->call($method, $args);
}
/**
* Writing data to properties.
*
* NOTE:
* Magic properties will be cached too if the option cacheMagicProperties
* is enabled and the property doesn't exist in real. If so it calls __set
* and removes cached data of previous __get and __isset calls.
*
* @see http://php.net/manual/language.oop5.overloading.php#language.oop5.overloading.members
*
* @phpcs:disable Squiz.Commenting.FunctionComment.InvalidReturnVoid
*
* @param string $name
* @return void
*/
public function __set($name, mixed $value)
{
return $this->call('__set', [$name, $value]);
}
/**
* Reading data from properties.
*
* NOTE:
* Magic properties will be cached too if the option cacheMagicProperties
* is enabled and the property doesn't exist in real. If so it calls __get.
*
* @see http://php.net/manual/language.oop5.overloading.php#language.oop5.overloading.members
*
* @param string $name
* @return mixed
*/
public function __get($name)
{
return $this->call('__get', [$name]);
}
/**
* Checking existing properties.
*
* NOTE:
* Magic properties will be cached too if the option cacheMagicProperties
* is enabled and the property doesn't exist in real. If so it calls __get.
*
* @see http://php.net/manual/language.oop5.overloading.php#language.oop5.overloading.members
*
* @param string $name
* @return bool
*/
public function __isset($name)
{
return $this->call('__isset', [$name]);
}
/**
* Unseting a property.
*
* NOTE:
* Magic properties will be cached too if the option cacheMagicProperties
* is enabled and the property doesn't exist in real. If so it removes
* previous cached __isset and __get calls.
*
* @see http://php.net/manual/language.oop5.overloading.php#language.oop5.overloading.members
*
* @phpcs:disable Squiz.Commenting.FunctionComment.InvalidReturnVoid
*
* @param string $name
*
* @return void
*/
public function __unset($name)
{
return $this->call('__unset', [$name]);
}
/**
* Handle casting to string
*
* @see http://php.net/manual/language.oop5.magic.php#language.oop5.magic.tostring
*/
public function __toString(): string
{
return (string) $this->call('__toString');
}
/**
* Handle invoke calls
*
* @see http://php.net/manual/language.oop5.magic.php#language.oop5.magic.invoke
*
* @return mixed
*/
public function __invoke()
{
return $this->call('__invoke', func_get_args());
}
}
PK K VYГi i , src/Exception/MissingDependencyException.phpnu ٘ The project configuration does not contain deprecated storage factory configurations.';
private const MESSAGE_PROJECT_DOES_NOT_CONTAIN_CACHE_CONFIGURATIONS
= 'Project configuration does not contain deprecated configurations.';
private const MESSAGE_PROJECT_CONFIGURATION_CONTAINS_INVALID_CACHES_CONFIGURATION
= 'One or more configurations of the configured caches are deprecated.'
. ' Please normalize the `%s` configuration, it contains deprecated configuration(s)';
private const MESSAGE_PROJECT_CONFIGURATION_CONTAINS_INVALID_CACHE_CONFIGURATION
= 'Please normalize the `%s` configuration as it contains deprecated configuration.';
private const MESSAGE_SCHEMA_DOCUMENTATION_MESSAGE = 'The normalized schema can be found at'
. ' https://docs.laminas.dev/laminas-cache/storage/adapter/#quick-start';
/** @var ArrayAccess */
private ArrayAccess $projectConfiguration;
private DeprecatedSchemaDetectorInterface $deprecatedSchemaDetector;
public function __construct(
ArrayAccess $projectConfiguration,
DeprecatedSchemaDetectorInterface $deprecatedSchemaDetector
) {
parent::__construct(self::NAME);
$this->projectConfiguration = $projectConfiguration;
$this->deprecatedSchemaDetector = $deprecatedSchemaDetector;
}
protected function configure(): void
{
$this
->setDescription(self::DESCRIPTION);
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
if (! $this->projectConfigurationContainsAnyCacheConfiguration()) {
$output->writeln(self::MESSAGE_PROJECT_DOES_NOT_CONTAIN_CACHE_CONFIGURATIONS);
return self::SUCCESS;
}
$output->writeln(
sprintf(
'Scanning `%s` configuration key for deprecated configurations...',
self::CACHES_CONFIGURATION_KEY
)
);
$caches = $this->projectConfiguration[self::CACHES_CONFIGURATION_KEY] ?? [];
$invalidCaches = [];
foreach ($caches as $cacheIdentifier => $configuration) {
if (! $this->deprecatedSchemaDetector->isDeprecatedStorageFactorySchema($configuration)) {
continue;
}
assert(is_string($cacheIdentifier));
$invalidCaches[] = $cacheIdentifier;
}
$cacheConfiguration = $this->projectConfiguration[self::CACHE_CONFIGURATION_KEY] ?? [];
$cacheConfigurationIsDeprecated = false;
if ($cacheConfiguration !== []) {
$cacheConfigurationIsDeprecated = $this->deprecatedSchemaDetector->isDeprecatedStorageFactorySchema(
$cacheConfiguration
);
}
if ($invalidCaches === [] && ! $cacheConfigurationIsDeprecated) {
$output->writeln(self::MESSAGE_CACHE_CONFIGURATIONS_ARE_VALID);
return self::SUCCESS;
}
if ($invalidCaches !== []) {
$output->writeln(
sprintf(
'%s: "%s".',
sprintf(
self::MESSAGE_PROJECT_CONFIGURATION_CONTAINS_INVALID_CACHES_CONFIGURATION,
self::CACHES_CONFIGURATION_KEY
),
implode('", "', $invalidCaches)
)
);
}
if ($cacheConfigurationIsDeprecated) {
$output->writeln(
sprintf(
'%s',
sprintf(
self::MESSAGE_PROJECT_CONFIGURATION_CONTAINS_INVALID_CACHE_CONFIGURATION,
self::CACHE_CONFIGURATION_KEY
)
)
);
}
$output->writeln(sprintf('%s', self::MESSAGE_SCHEMA_DOCUMENTATION_MESSAGE));
return self::FAILURE;
}
private function projectConfigurationContainsAnyCacheConfiguration(): bool
{
$cache = $this->projectConfiguration[self::CACHE_CONFIGURATION_KEY] ?? [];
$caches = $this->projectConfiguration[self::CACHES_CONFIGURATION_KEY] ?? [];
return $cache !== [] || $caches !== [];
}
}
PK K Vf] H src/Command/DeprecatedStorageFactoryConfigurationCheckCommandFactory.phpnu ٘ get('config');
if (is_array($config)) {
$config = new ArrayObject($config);
}
if (! $config instanceof ArrayAccess) {
throw new RuntimeException('Configuration from container must be either `ArrayAccess` or an array.');
}
$schemaDetector = new DeprecatedSchemaDetector();
return new DeprecatedStorageFactoryConfigurationCheckCommand(
$config,
$schemaDetector
);
}
}
PK K V?ȋ+ src/Psr/SerializationTrait.phpnu ٘ getCapabilities();
$requiredTypes = ['string', 'integer', 'double', 'boolean', 'NULL', 'array', 'object'];
$types = $capabilities->getSupportedDatatypes();
foreach ($requiredTypes as $type) {
// 'object' => 'object' is OK
// 'integer' => 'string' is not (redis)
// 'integer' => 'integer' is not (memcache)
if (! (isset($types[$type]) && in_array($types[$type], [true, 'array', 'object'], true))) {
return true;
}
}
return false;
}
}
PK K Vl ! src/Psr/MaximumKeyLengthTrait.phpnu ٘ getMaxKeyLength();
if ($maximumKeyLength === Capabilities::UNLIMITED_KEY_LENGTH) {
$this->maximumKeyLength = Capabilities::UNLIMITED_KEY_LENGTH;
return;
}
if ($maximumKeyLength === Capabilities::UNKNOWN_KEY_LENGTH) {
// For backward compatibility, assume adapters which do not provide a maximum key length do support 64 chars
$maximumKeyLength = 64;
}
if ($maximumKeyLength < 64) {
throw new SimpleCacheInvalidArgumentException(sprintf(
'The storage adapter "%s" does not fulfill the minimum requirements for PSR-6/PSR-16:'
. ' The maximum key length capability must allow at least 64 characters.',
$storage::class
));
}
$this->maximumKeyLength = min($maximumKeyLength, self::$pcreMaximumQuantifierLength - 1);
}
private function exceedsMaximumKeyLength(string $key): bool
{
return $this->maximumKeyLength !== Capabilities::UNLIMITED_KEY_LENGTH
&& preg_match('/^.{' . ($this->maximumKeyLength + 1) . ',}/u', $key);
}
}
PK K V$ , src/Psr/SimpleCache/SimpleCacheException.phpnu ٘ isSerializationRequired($storage)) {
throw new SimpleCacheException(sprintf(
'The storage adapter "%s" requires a serializer plugin; please see'
. ' https://docs.laminas.dev/laminas-cache/storage/plugin/#quick-start'
. ' for details on how to attach the plugin to your adapter.',
$storage::class
));
}
$capabilities = $storage->getCapabilities();
$this->memoizeTtlCapabilities($capabilities);
$this->memoizeMaximumKeyLengthCapability($storage, $capabilities);
$this->storage = $storage;
$this->utc = new DateTimeZone('UTC');
}
/**
* {@inheritDoc}
*/
public function get($key, $default = null)
{
$this->validateKey($key);
$this->success = null;
try {
$result = $this->storage->getItem($key, $this->success);
} catch (Throwable $e) {
throw static::translateThrowable($e);
}
$result ??= $default;
return $this->success ? $result : $default;
}
/**
* {@inheritDoc}
*/
public function set($key, $value, $ttl = null)
{
$this->validateKey($key);
$ttl = $this->convertTtlToInteger($ttl);
// PSR-16 states that 0 or negative TTL values should result in cache
// invalidation for the item.
if (null !== $ttl && 1 > $ttl) {
return $this->delete($key);
}
// If a positive TTL is set, but the adapter does not support per-item
// TTL, we return false immediately.
if (null !== $ttl && ! $this->providesPerItemTtl) {
return false;
}
$options = $this->storage->getOptions();
$previousTtl = $options->getTtl();
if ($ttl !== null) {
$options->setTtl($ttl);
}
try {
$result = $this->storage->setItem($key, $value);
} catch (Throwable $e) {
throw static::translateThrowable($e);
} finally {
$options->setTtl($previousTtl);
}
return $result;
}
/**
* {@inheritDoc}
*/
public function delete($key)
{
$this->validateKey($key);
try {
return null !== $this->storage->removeItem($key);
} catch (Throwable) {
return false;
}
}
/**
* {@inheritDoc}
*/
public function clear()
{
$namespace = $this->storage->getOptions()->getNamespace();
if ($this->storage instanceof ClearByNamespaceInterface && $namespace) {
return $this->storage->clearByNamespace($namespace);
}
if ($this->storage instanceof FlushableInterface) {
return $this->storage->flush();
}
return false;
}
/**
* {@inheritDoc}
*/
public function getMultiple($keys, $default = null)
{
if (! is_array($keys) && ! $keys instanceof Traversable) {
throw new SimpleCacheInvalidArgumentException(sprintf(
'Invalid value provided to %s; must be iterable',
__METHOD__
));
}
$keys = $this->convertIterableKeysToList($keys);
try {
$results = $this->storage->getItems($keys);
} catch (Throwable $e) {
throw static::translateThrowable($e);
}
foreach ($keys as $key) {
if (isset($results[$key])) {
continue;
}
$results[$key] = $default;
}
return $results;
}
/**
* {@inheritDoc}
*/
public function setMultiple($values, $ttl = null)
{
if (! is_array($values) && ! $values instanceof Traversable) {
throw new SimpleCacheInvalidArgumentException(sprintf(
'Invalid value provided to %s; must be iterable',
__METHOD__
));
}
$values = $this->convertIterableToKeyValueMap($values);
$keys = array_keys($values);
$ttl = $this->convertTtlToInteger($ttl);
// PSR-16 states that 0 or negative TTL values should result in cache
// invalidation for the items.
if (null !== $ttl && 1 > $ttl) {
return $this->deleteMultiple($keys);
}
// If a positive TTL is set, but the adapter does not support per-item
// TTL, we return false -- but not until after we validate keys.
if (null !== $ttl && ! $this->providesPerItemTtl) {
return false;
}
$options = $this->storage->getOptions();
$previousTtl = $options->getTtl();
if ($ttl !== null) {
$options->setTtl($ttl);
}
try {
$result = $this->storage->setItems($values);
} catch (Throwable $e) {
throw static::translateThrowable($e);
} finally {
$options->setTtl($previousTtl);
}
if (empty($result)) {
return true;
}
foreach ($result as $index => $key) {
if (! $this->storage->hasItem($key)) {
unset($result[$index]);
}
}
return empty($result);
}
/**
* {@inheritDoc}
*/
public function deleteMultiple($keys)
{
if (! is_array($keys) && ! $keys instanceof Traversable) {
throw new SimpleCacheInvalidArgumentException(sprintf(
'Invalid value provided to %s; must be iterable',
__METHOD__
));
}
$keys = $this->convertIterableKeysToList($keys);
if (empty($keys)) {
return true;
}
try {
$result = $this->storage->removeItems($keys);
} catch (Throwable) {
return false;
}
if (empty($result)) {
return true;
}
foreach ($result as $index => $key) {
if (! $this->storage->hasItem($key)) {
unset($result[$index]);
}
}
return empty($result);
}
/**
* {@inheritDoc}
*/
public function has($key)
{
$this->validateKey($key);
try {
return $this->storage->hasItem($key);
} catch (Throwable $e) {
throw static::translateThrowable($e);
}
}
/**
* @return SimpleCacheInvalidArgumentException|SimpleCacheException
*/
private static function translateThrowable(Throwable $throwable): PsrCacheException
{
$exceptionClass = $throwable instanceof LaminasCacheInvalidArgumentException
? SimpleCacheInvalidArgumentException::class
: SimpleCacheException::class;
return new $exceptionClass($throwable->getMessage(), $throwable->getCode(), $throwable);
}
/**
* @param string|int $key
* @throws SimpleCacheInvalidArgumentException If key is invalid.
*/
private function validateKey($key): void
{
if ('' === $key) {
throw new SimpleCacheInvalidArgumentException(
'Invalid key provided; cannot be empty'
);
}
if (0 === $key) {
// cache/integration-tests erroneously tests that ['0' => 'value']
// is a valid payload to setMultiple(). However, PHP silently
// converts '0' to 0, which would normally be invalid. For now,
// we need to catch just this single value so tests pass.
// I have filed an issue to correct the test:
// https://github.com/php-cache/integration-tests/issues/92
return;
}
if (! is_string($key)) {
throw new SimpleCacheInvalidArgumentException(sprintf(
'Invalid key provided of type "%s"%s; must be a string',
gettype($key),
sprintf(' (%s)', var_export($key, true))
));
}
$regex = sprintf('/[%s]/', preg_quote(self::INVALID_KEY_CHARS, '/'));
if (preg_match($regex, $key)) {
throw new SimpleCacheInvalidArgumentException(sprintf(
'Invalid key "%s" provided; cannot contain any of (%s)',
$key,
self::INVALID_KEY_CHARS
));
}
if ($this->exceedsMaximumKeyLength($key)) {
throw SimpleCacheInvalidArgumentException::maximumKeyLengthExceeded($key, $this->maximumKeyLength);
}
}
/**
* Determine if the storage adapter provides per-item TTL capabilities
*/
private function memoizeTtlCapabilities(Capabilities $capabilities): void
{
$this->providesPerItemTtl = $capabilities->getStaticTtl() && (0 < $capabilities->getMinTtl());
}
/**
* @param int|DateInterval|string $ttl
* @return null|int
* @throws SimpleCacheInvalidArgumentException For invalid arguments.
*/
private function convertTtlToInteger($ttl)
{
// null === absence of a TTL
if (null === $ttl) {
return null;
}
// integers are always okay
if (is_int($ttl)) {
return $ttl;
}
// Numeric strings evaluating to integers can be cast
if (
is_string($ttl)
&& ('0' === $ttl
|| preg_match('/^[1-9][0-9]+$/', $ttl)
)
) {
return (int) $ttl;
}
// DateIntervals require conversion
if ($ttl instanceof DateInterval) {
$now = new DateTimeImmutable('now', $this->utc);
$end = $now->add($ttl);
return $end->getTimestamp() - $now->getTimestamp();
}
// All others are invalid
throw new SimpleCacheInvalidArgumentException(sprintf(
'Invalid TTL "%s" provided; must be null, an integer, or a %s instance',
get_debug_type($ttl),
DateInterval::class
));
}
/**
* @psalm-return list
* @throws SimpleCacheInvalidArgumentException For invalid $iterable values.
*/
private function convertIterableKeysToList(iterable $keys): array
{
$array = [];
foreach ($keys as $key) {
if (! is_string($key) && ! is_int($key)) {
throw new SimpleCacheInvalidArgumentException(sprintf(
'Invalid key detected of type "%s"; must be a scalar',
get_debug_type($key)
));
}
$this->validateKey($key);
$array[] = $key;
}
return $array;
}
/**
* @psalm-return array
*/
private function convertIterableToKeyValueMap(iterable $values): array
{
$keyValueMap = [];
foreach ($values as $key => $value) {
if (! is_string($key) && ! is_int($key)) {
throw new SimpleCacheInvalidArgumentException(sprintf(
'Invalid key detected of type "%s"; must be a scalar',
get_debug_type($key)
));
}
$this->validateKey($key);
/** @psalm-suppress MixedAssignment */
$keyValueMap[$key] = $value;
}
return $keyValueMap;
}
}
PK K VO O ; src/Psr/SimpleCache/SimpleCacheInvalidArgumentException.phpnu ٘ */
private array $deferred = [];
private ClockInterface $clock;
/**
* PSR-6 requires that all implementing libraries support TTL so the given storage adapter must also support static
* TTL or an exception will be raised. Currently the following adapters do *not* support static TTL: Dba,
* Filesystem, Memory, Session and Redis < v2.
*
* @throws CacheException
*/
public function __construct(StorageInterface $storage, ?ClockInterface $clock = null)
{
$this->validateStorage($storage);
$capabilities = $storage->getCapabilities();
$this->memoizeMaximumKeyLengthCapability($storage, $capabilities);
$this->storage = $storage;
$clock ??= new class implements ClockInterface
{
public function now(): DateTimeImmutable
{
return new DateTimeImmutable();
}
};
$this->clock = $clock;
}
/**
* Saves any deferred items that have not been committed
*/
public function __destruct()
{
$this->commit();
}
/**
* {@inheritdoc}
*/
public function getItem($key)
{
$this->validateKey($key);
if (! $this->hasDeferredItem($key)) {
$value = null;
$isHit = false;
try {
$value = $this->storage->getItem($key, $isHit);
} catch (Exception\InvalidArgumentException $e) {
throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
} catch (Exception\ExceptionInterface) {
// ignore
}
return new CacheItem($key, $value, $isHit ?? false, $this->clock);
}
return clone $this->deferred[$key];
}
/**
* {@inheritdoc}
*/
public function getItems(array $keys = [])
{
$this->validateKeys($keys);
$items = [];
// check deferred items first
foreach ($keys as $key) {
if ($this->hasDeferredItem($key)) {
// dereference deferred items
$items[$key] = clone $this->deferred[$key];
}
}
$keys = array_diff($keys, array_keys($items));
if ($keys) {
try {
$cacheItems = $this->storage->getItems($keys);
} catch (Exception\InvalidArgumentException $e) {
throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
} catch (Exception\ExceptionInterface) {
$cacheItems = [];
}
foreach ($cacheItems as $key => $value) {
assert(is_string($key));
$items[$key] = new CacheItem($key, $value, true, $this->clock);
}
// Return empty items for any keys that where not found
foreach (array_diff($keys, array_keys($cacheItems)) as $key) {
$items[$key] = new CacheItem($key, null, false, $this->clock);
}
}
return $items;
}
/**
* {@inheritdoc}
*/
public function hasItem($key)
{
$this->validateKey($key);
// check deferred items first
if ($this->hasDeferredItem($key)) {
return true;
}
try {
return $this->storage->hasItem($key);
} catch (Exception\InvalidArgumentException $e) {
throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
} catch (Exception\ExceptionInterface) {
return false;
}
}
/**
* {@inheritdoc}
*
* If the storage adapter supports namespaces and one has been set, only that namespace is cleared; otherwise
* entire cache is flushed.
*/
public function clear()
{
$this->deferred = [];
try {
$options = $this->storage->getOptions();
$namespace = $options->getNamespace();
if ($this->storage instanceof ClearByNamespaceInterface && $namespace) {
$cleared = $this->storage->clearByNamespace($namespace);
} else {
$cleared = $this->storage->flush();
}
} catch (Exception\ExceptionInterface) {
$cleared = false;
}
assert(is_bool($cleared));
return $cleared;
}
/**
* {@inheritdoc}
*/
public function deleteItem($key)
{
return $this->deleteItems([$key]);
}
/**
* {@inheritdoc}
*/
public function deleteItems(array $keys)
{
$this->validateKeys($keys);
// remove deferred items first
$this->deferred = array_diff_key($this->deferred, array_flip($keys));
try {
$result = $this->storage->removeItems($keys);
} catch (Exception\InvalidArgumentException $e) {
throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
} catch (Exception\ExceptionInterface) {
return false;
}
// BC compatibility can be removed in 3.0
if (! is_array($result)) {
return $result !== null;
}
if ($result === []) {
return true;
}
$existing = $this->storage->hasItems($result);
$unified = array_unique($existing);
return ! in_array(true, $unified, true);
}
/**
* {@inheritdoc}
*/
public function save(CacheItemInterface $item)
{
if (! $item instanceof CacheItem) {
throw new InvalidArgumentException('$item must be an instance of ' . CacheItem::class);
}
return $this->saveMultipleItems([$item], $item->getTtl()) === [];
}
/**
* {@inheritdoc}
*/
public function saveDeferred(CacheItemInterface $item)
{
if (! $item instanceof CacheItem) {
throw new InvalidArgumentException('$item must be an instance of ' . CacheItem::class);
}
$ttl = $item->getTtl();
if ($ttl !== null && $ttl <= 0) {
return false;
}
// deferred items should always be a 'hit' until they expire
$item->setIsHit(true);
$this->deferred[$item->getKey()] = $item;
return true;
}
/**
* {@inheritdoc}
*/
public function commit()
{
$groupedByTtl = [];
foreach ($this->deferred as $cacheKey => $item) {
$itemTtl = var_export($item->getTtl(), true);
$group = $groupedByTtl[$itemTtl] ?? [];
$group[$cacheKey] = $item;
$groupedByTtl[$itemTtl] = array_values($group);
}
$notSavedItems = [];
/**
* NOTE: we are not using the array key for the TTL in here as TTL might be `null`.
* Since we stringify the TTL by using `var_export`, the array has string and integer keys.
* Converting a string `null` back to native null-type would be a huge mess.
*/
foreach ($groupedByTtl as $keyValuePairs) {
$itemTtl = current($keyValuePairs)->getTtl();
$notSavedItems[] = $this->saveMultipleItems($keyValuePairs, $itemTtl);
}
$this->deferred = array_merge([], ...$notSavedItems);
return empty($this->deferred);
}
/**
* Throws exception is storage is not compatible with PSR-6
*
* @throws CacheException
* @psalm-assert-if-true StorageInterface&FlushableInterface $storage
*/
private function validateStorage(StorageInterface $storage)
{
if ($this->isSerializationRequired($storage)) {
throw new CacheException(sprintf(
'The storage adapter "%s" requires a serializer plugin; please see'
. ' https://docs.laminas.dev/laminas-cache/storage/plugin/#quick-start'
. ' for details on how to attach the plugin to your adapter.',
$storage::class
));
}
// all current adapters implement this
if (! $storage instanceof FlushableInterface) {
throw new CacheException(sprintf(
'Storage %s does not implement %s',
$storage::class,
FlushableInterface::class
));
}
// we've got to be able to set per-item TTL on write
$capabilities = $storage->getCapabilities();
if (! ($capabilities->getStaticTtl() && $capabilities->getMinTtl())) {
throw new CacheException(sprintf(
'Storage %s does not support static TTL',
$storage::class
));
}
if ($capabilities->getUseRequestTime()) {
throw new CacheException(sprintf(
'The capability "use-request-time" of storage %s violates PSR-6',
$storage::class
));
}
if ($capabilities->getLockOnExpire()) {
throw new CacheException(sprintf(
'The capability "lock-on-expire" of storage %s violates PSR-6',
$storage::class
));
}
}
/**
* Returns true if deferred item exists for given key and has not expired
*
* @param string $key
* @return bool
*/
private function hasDeferredItem($key)
{
if (isset($this->deferred[$key])) {
$ttl = $this->deferred[$key]->getTtl();
return $ttl === null || $ttl > 0;
}
return false;
}
/**
* Throws exception if given key is invalid
*
* @throws InvalidArgumentException
*/
private function validateKey(mixed $key)
{
if (! is_string($key) || preg_match('#[{}()/\\\\@:]#', $key)) {
throw new InvalidArgumentException(sprintf(
"Key must be a string and not contain '{}()/\\@:'; '%s' given",
is_string($key) ? $key : gettype($key)
));
}
if ($this->exceedsMaximumKeyLength($key)) {
throw InvalidArgumentException::maximumKeyLengthExceeded($key, $this->maximumKeyLength);
}
}
/**
* Throws exception if any of given keys is invalid
*
* @param array $keys
* @throws InvalidArgumentException
*/
private function validateKeys($keys)
{
foreach ($keys as $key) {
$this->validateKey($key);
}
}
/**
* @psalm-param non-empty-list $items
* @psalm-return array
*/
private function saveMultipleItems(array $items, ?int $itemTtl): array
{
$keyItemPair = [];
foreach ($items as $item) {
$keyItemPair[$item->getKey()] = $item;
}
// delete expired item
if ($itemTtl < 0) {
$this->deleteItems(array_keys($keyItemPair));
foreach ($keyItemPair as $cacheItem) {
$cacheItem->setIsHit(false);
}
return $keyItemPair;
}
$options = $this->storage->getOptions();
$ttl = $options->getTtl();
$keyValuePair = [];
foreach ($items as $item) {
$key = $item->getKey();
/** @psalm-suppress MixedAssignment */
$keyValuePair[$key] = $item->get();
}
$options->setTtl($itemTtl ?? 0);
try {
$notSavedKeys = $this->storage->setItems($keyValuePair);
} catch (Exception\InvalidArgumentException $e) {
throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
} catch (Exception\ExceptionInterface) {
$notSavedKeys = array_keys($keyValuePair);
} finally {
$options->setTtl($ttl);
}
$notSavedItems = [];
foreach ($keyItemPair as $key => $item) {
if (in_array($key, $notSavedKeys, true)) {
$notSavedItems[$key] = $item;
continue;
}
$item->setIsHit(true);
}
return $notSavedItems;
}
}
PK K VZ/ / 2 src/Psr/CacheItemPool/InvalidArgumentException.phpnu ٘ value = $isHit ? $value : null;
$this->isHit = $isHit;
$clock ??= new class implements ClockInterface
{
public function now(): DateTimeImmutable
{
return new DateTimeImmutable();
}
};
$this->clock = $clock;
}
/**
* {@inheritdoc}
*/
public function getKey(): string
{
return $this->key;
}
/**
* {@inheritdoc}
*/
public function get()
{
return $this->value;
}
/**
* {@inheritdoc}
*/
public function isHit(): bool
{
if (! $this->isHit) {
return false;
}
$ttl = $this->getTtl();
return $ttl === null || $ttl > 0;
}
/**
* Sets isHit value
*
* This function is called by CacheItemPoolDecorator::saveDeferred() and is not intended for use by other calling
* code.
*/
public function setIsHit(bool $isHit): self
{
$this->isHit = $isHit;
return $this;
}
/**
* {@inheritdoc}
*/
public function set($value): CacheItemInterface
{
$this->value = $value;
return $this;
}
/**
* {@inheritdoc}
*/
public function expiresAt($expiration): CacheItemInterface
{
if (! ($expiration === null || $expiration instanceof DateTimeInterface)) {
throw new InvalidArgumentException('$expiration must be null or an instance of DateTimeInterface');
}
$this->expiration = $expiration instanceof DateTimeInterface ? $expiration->getTimestamp() : null;
return $this;
}
/**
* {@inheritdoc}
*/
public function expiresAfter($time): CacheItemInterface
{
if ($time === null) {
return $this->expiresAt(null);
}
if (is_int($time)) {
$interval = DateInterval::createFromDateString(sprintf('%d seconds', $time));
if ($interval === false) {
throw new InvalidArgumentException(sprintf('Provided TTL "%d" is not supported.', $time));
}
$time = $interval;
}
/** @psalm-suppress RedundantConditionGivenDocblockType Until we do have native type-hints we should keep verifying this. */
if ($time instanceof DateInterval) {
$now = $this->clock->now();
return $this->expiresAt($now->add($time));
}
throw new InvalidArgumentException(sprintf('Invalid $time "%s"', gettype($time)));
}
/**
* Returns number of seconds until item expires
*
* If NULL, the pool should use the default TTL for the storage adapter. If <= 0, the item has expired.
*/
public function getTtl(): ?int
{
if ($this->expiration === null) {
return null;
}
$now = $this->clock->now();
return $this->expiration - $now->getTimestamp();
}
}
PK K V?F F 2 src/Service/StorageAdapterPluginManagerFactory.phpnu ٘ get(PluginManager::class));
}
}
PK K VJw , src/Service/StorageAdapterFactoryFactory.phpnu ٘ get(AdapterPluginManager::class),
$container->get(StoragePluginFactoryInterface::class)
);
}
}
PK K V5r $ src/Service/StoragePluginFactory.phpnu ٘ create($name, $options);
}
public function create(string $plugin, array $options = []): PluginInterface
{
$instance = $this->plugins->build($plugin, $options);
assert($instance instanceof PluginInterface);
return $instance;
}
public function assertValidConfigurationStructure(array $configuration): void
{
try {
Assert::isNonEmptyMap($configuration, 'Configuration must be a non-empty array.');
Assert::keyExists($configuration, 'name', 'Configuration must contain a "name" key.');
Assert::stringNotEmpty($configuration['name'], 'Plugin "name" has to be a non-empty string.');
Assert::nullOrIsMap(
$configuration['options'] ?? null,
'Plugin "options" must be an array with string keys.'
);
} catch (PhpInvalidArgumentException $exception) {
throw new InvalidArgumentException($exception->getMessage(), 0, $exception);
}
}
}
PK K V=Ih h ( src/Service/DeprecatedSchemaDetector.phpnu ٘ $plugin) {
if (is_string($index) || ! is_array($plugin)) {
return true;
}
if (! isset($plugin['name'])) {
return true;
}
}
return false;
}
}
PK K Vd?* * + src/Service/StoragePluginManagerFactory.phpnu ٘ get('config');
Assert::isArrayAccessible($config);
$cacheConfig = $config['cache'] ?? [];
Assert::isMap($cacheConfig);
$factory = $container->get(StorageAdapterFactoryInterface::class);
assert($factory instanceof StorageAdapterFactoryInterface);
$factory->assertValidConfigurationStructure($cacheConfig);
return $factory->createFromArrayConfiguration($cacheConfig);
}
}
PK K V[1 1 src/Service/DeprecatedSchemaDetectorInterface.phpnu ٘ $configuration
*/
public function isDeprecatedStorageFactorySchema(array $configuration): bool;
}
PK K V % src/Service/StorageAdapterFactory.phpnu ٘ create($adapterName, $adapterOptions, $plugins);
}
public function create(string $storage, array $options = [], array $plugins = []): StorageInterface
{
$adapter = $this->adapters->build($storage, $options);
assert($adapter instanceof StorageInterface);
if ($plugins === []) {
return $adapter;
}
if (! $adapter instanceof PluginAwareInterface) {
throw new Exception\RuntimeException(sprintf(
"The adapter '%s' doesn't implement '%s' and therefore can't handle plugins",
$adapter::class,
PluginAwareInterface::class
));
}
foreach ($plugins as $pluginConfiguration) {
$plugin = $this->pluginFactory->createFromArrayConfiguration($pluginConfiguration);
$pluginPriority = $pluginConfiguration['priority'] ?? self::DEFAULT_PLUGIN_PRIORITY;
if (! $adapter->hasPlugin($plugin)) {
$adapter->addPlugin($plugin, $pluginPriority);
}
}
return $adapter;
}
/** @psalm-assert PluginArrayConfigurationWithPriorityType $configuration */
public function assertValidConfigurationStructure(array $configuration): void
{
try {
Assert::isNonEmptyMap($configuration, 'Configuration must be a non-empty array.');
$adapter = $configuration['adapter'] ?? $configuration['name'] ?? null;
if (! is_string($adapter)) {
throw new InvalidArgumentException('Configuration must contain a "adapter" key.');
}
Assert::stringNotEmpty($adapter, 'Storage "adapter" has to be a non-empty string.');
Assert::nullOrIsMap(
$configuration['options'] ?? null,
'Storage "options" must be an array with string keys.'
);
if (isset($configuration['plugins'])) {
Assert::isList($configuration['plugins'], 'Storage "plugins" must be a list of plugin configurations.');
$this->assertValidPluginConfigurationStructure($adapter, $configuration['plugins']);
}
} catch (InvalidArgumentException $exception) {
throw new Exception\InvalidArgumentException($exception->getMessage(), 0, $exception);
}
}
/**
* @psalm-param non-empty-string $adapter
* @psalm-param list $plugins
* @psalm-assert list $plugins
*/
private function assertValidPluginConfigurationStructure(string $adapter, array $plugins): void
{
Assert::allIsArray($plugins, 'All plugin configurations are expected to be an array.');
foreach ($plugins as $pluginConfiguration) {
assert(is_array($pluginConfiguration));
try {
$this->pluginFactory->assertValidConfigurationStructure($pluginConfiguration);
if (isset($pluginConfiguration['priority'])) {
Assert::integer($pluginConfiguration['priority'], 'Plugin priority has to be integer.');
}
} catch (Exception\InvalidArgumentException | InvalidArgumentException $exception) {
throw new Exception\InvalidArgumentException(
sprintf(
'Plugin configuration for adapter "%s" is invalid: %s',
$adapter,
$exception->getMessage()
),
0,
$exception
);
}
}
}
}
PK K VMW - src/Service/StoragePluginFactoryInterface.phpnu ٘ }
*/
interface StoragePluginFactoryInterface
{
/**
* @psalm-param PluginArrayConfigurationType $configuration
*/
public function createFromArrayConfiguration(array $configuration): PluginInterface;
/**
* @psalm-param non-empty-string $plugin
* @param array $options
* @psalm-param array $options
*/
public function create(string $plugin, array $options = []): PluginInterface;
/**
* @param array $configuration
* @psalm-assert PluginArrayConfigurationType $configuration
* @throws InvalidArgumentException If the provided configuration is invalid.
*/
public function assertValidConfigurationStructure(array $configuration): void;
}
PK K Vh 2 src/Service/StorageCacheAbstractServiceFactory.phpnu ٘ |null */
protected $config;
/**
* Configuration key for cache objects
*
* @var string
*/
protected $configKey = self::CACHES_CONFIGURATION_KEY;
/**
* @param string $requestedName
* @return boolean
*/
public function canCreate(ContainerInterface $container, $requestedName)
{
$config = $this->getConfig($container);
if (empty($config)) {
return false;
}
return isset($config[$requestedName]) && is_array($config[$requestedName]);
}
/**
* Create an object
*
* @param string $requestedName
* @param null|array $options
* @return object
*/
public function __invoke(ContainerInterface $container, $requestedName, ?array $options = null)
{
$config = $this->getConfig($container);
$factory = $container->get(StorageAdapterFactoryInterface::class);
assert($factory instanceof StorageAdapterFactoryInterface);
$configForRequestedName = $config[$requestedName] ?? [];
Assert::isMap($configForRequestedName);
$factory->assertValidConfigurationStructure($configForRequestedName);
return $factory->createFromArrayConfiguration($configForRequestedName);
}
/**
* Retrieve cache configuration, if any
*
* @return array
*/
protected function getConfig(ContainerInterface $container)
{
if ($this->config !== null) {
return $this->config;
}
if (! $container->has('config')) {
$this->config = [];
return $this->config;
}
$config = $container->get('config');
Assert::isArrayAccessible($config);
if (! isset($config[$this->configKey])) {
$this->config = [];
return $this->config;
}
$cacheConfigurations = $config[$this->configKey];
Assert::isMap($cacheConfigurations);
return $this->config = $cacheConfigurations;
}
}
PK K V . src/Service/StorageAdapterFactoryInterface.phpnu ٘ }
* @psalm-type PluginArrayConfigurationWithPriorityType =
* InternalPluginArrayConfigurationType&InternalOptionalPriorityConfigurationType
* @psalm-type StorageAdapterArrayConfigurationType = array{
* name:non-empty-string,
* options?:array,
* plugins?: list
* }|array{
* adapter:non-empty-string,
* options?:array,
* plugins?: list
* }
*/
interface StorageAdapterFactoryInterface
{
/**
* @psalm-param StorageAdapterArrayConfigurationType $configuration
*/
public function createFromArrayConfiguration(array $configuration): StorageInterface;
/**
* @psalm-param non-empty-string $storage
* @param array $options
* @psalm-param list $plugins
*/
public function create(string $storage, array $options = [], array $plugins = []): StorageInterface;
/**
* @param array $configuration
* @psalm-assert StorageAdapterArrayConfigurationType $configuration
* @throws InvalidArgumentException If the provided configuration is invalid.
*/
public function assertValidConfigurationStructure(array $configuration): void;
}
PK K V(z &