@@ -47,9 +47,9 @@
| = $post['login'] ?> |
= $post['description'] ?> |
-
-
-
diff --git a/app/Views/users/show.php b/app/Views/users/show.php
new file mode 100644
index 0000000..054077e
--- /dev/null
+++ b/app/Views/users/show.php
@@ -0,0 +1,33 @@
+= $this->extend('layouts/master');
+$this->section('title') ?> Show User = $this->endSection() ?>
+= $this->section('content') ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+= $this->endSection() ?>
\ No newline at end of file
diff --git a/composer.json b/composer.json
index 60144c6..a033f03 100644
--- a/composer.json
+++ b/composer.json
@@ -74,7 +74,6 @@
},
"scripts": {
"post-update-cmd": [
- "CodeIgniter\\ComposerScripts::postUpdate",
"bash -c \"if [ -f admin/setup.sh ]; then bash admin/setup.sh; fi\""
],
"analyze": [
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..276dc02
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,6052 @@
+{
+ "_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": "47ddd5d90d84114fdb0ca635a59f2f5f",
+ "packages": [
+ {
+ "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": "psr/log",
+ "version": "1.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
+ "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "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/1.1.4"
+ },
+ "time": "2021-05-03T11:20: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": "codeigniter/coding-standard",
+ "version": "v1.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/CodeIgniter/coding-standard.git",
+ "reference": "9b3a18ebd635e05717e984d40cc2f888afa52683"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/CodeIgniter/coding-standard/zipball/9b3a18ebd635e05717e984d40cc2f888afa52683",
+ "reference": "9b3a18ebd635e05717e984d40cc2f888afa52683",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "friendsofphp/php-cs-fixer": "3.13.0",
+ "nexusphp/cs-config": "^3.6",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "nexusphp/tachycardia": "^1.3",
+ "phpstan/phpstan": "^1.0",
+ "phpunit/phpunit": "^9.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "CodeIgniter\\CodingStandard\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "John Paul E. Balandan, CPA",
+ "email": "paulbalandan@gmail.com"
+ }
+ ],
+ "description": "Official Coding Standards for CodeIgniter based on PHP CS Fixer",
+ "keywords": [
+ "phpcs",
+ "static analysis"
+ ],
+ "support": {
+ "forum": "http://forum.codeigniter.com/",
+ "issues": "https://github.com/CodeIgniter/coding-standard/issues",
+ "slack": "https://codeigniterchat.slack.com",
+ "source": "https://github.com/CodeIgniter/coding-standard"
+ },
+ "time": "2022-12-22T02:29:54+00:00"
+ },
+ {
+ "name": "composer/pcre",
+ "version": "3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/pcre.git",
+ "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2",
+ "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.3",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "symfony/phpunit-bridge": "^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Pcre\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
+ "keywords": [
+ "PCRE",
+ "preg",
+ "regex",
+ "regular expression"
+ ],
+ "support": {
+ "issues": "https://github.com/composer/pcre/issues",
+ "source": "https://github.com/composer/pcre/tree/3.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-17T09:50:14+00:00"
+ },
+ {
+ "name": "composer/semver",
+ "version": "3.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9",
+ "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.4",
+ "symfony/phpunit-bridge": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
+ }
+ ],
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "semantic",
+ "semver",
+ "validation",
+ "versioning"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/semver/issues",
+ "source": "https://github.com/composer/semver/tree/3.3.2"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-04-01T19:23:25+00:00"
+ },
+ {
+ "name": "composer/xdebug-handler",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/xdebug-handler.git",
+ "reference": "ced299686f41dce890debac69273b47ffe98a40c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c",
+ "reference": "ced299686f41dce890debac69273b47ffe98a40c",
+ "shasum": ""
+ },
+ "require": {
+ "composer/pcre": "^1 || ^2 || ^3",
+ "php": "^7.2.5 || ^8.0",
+ "psr/log": "^1 || ^2 || ^3"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "symfony/phpunit-bridge": "^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Composer\\XdebugHandler\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "John Stevenson",
+ "email": "john-stevenson@blueyonder.co.uk"
+ }
+ ],
+ "description": "Restarts a process without Xdebug.",
+ "keywords": [
+ "Xdebug",
+ "performance"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/xdebug-handler/issues",
+ "source": "https://github.com/composer/xdebug-handler/tree/3.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-02-25T21:32:43+00:00"
+ },
+ {
+ "name": "dnoegel/php-xdg-base-dir",
+ "version": "v0.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dnoegel/php-xdg-base-dir.git",
+ "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
+ "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "XdgBaseDir\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "implementation of xdg base directory specification for php",
+ "support": {
+ "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues",
+ "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1"
+ },
+ "time": "2019-12-04T15:06:13+00:00"
+ },
+ {
+ "name": "doctrine/annotations",
+ "version": "1.14.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/annotations.git",
+ "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af",
+ "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af",
+ "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.3"
+ },
+ "time": "2023-02-01T09:20:38+00:00"
+ },
+ {
+ "name": "doctrine/deprecations",
+ "version": "v1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/deprecations.git",
+ "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3",
+ "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^9",
+ "phpstan/phpstan": "1.4.10 || 1.10.15",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "psalm/plugin-phpunit": "0.18.4",
+ "psr/log": "^1 || ^2 || ^3",
+ "vimeo/psalm": "4.30.0 || 5.12.0"
+ },
+ "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.1.1"
+ },
+ "time": "2023-06-03T09:27:29+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": "fakerphp/faker",
+ "version": "v1.22.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/FakerPHP/Faker.git",
+ "reference": "f85772abd508bd04e20bb4b1bbe260a68d0066d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/f85772abd508bd04e20bb4b1bbe260a68d0066d2",
+ "reference": "f85772abd508bd04e20bb4b1bbe260a68d0066d2",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "psr/container": "^1.0 || ^2.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "conflict": {
+ "fzaninotto/faker": "*"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "doctrine/persistence": "^1.3 || ^2.0",
+ "ext-intl": "*",
+ "phpunit/phpunit": "^9.5.26",
+ "symfony/phpunit-bridge": "^5.4.16"
+ },
+ "suggest": {
+ "doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
+ "ext-curl": "Required by Faker\\Provider\\Image to download images.",
+ "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
+ "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
+ "ext-mbstring": "Required for multibyte Unicode string functionality."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "v1.21-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Faker\\": "src/Faker/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "François Zaninotto"
+ }
+ ],
+ "description": "Faker is a PHP library that generates fake data for you.",
+ "keywords": [
+ "data",
+ "faker",
+ "fixtures"
+ ],
+ "support": {
+ "issues": "https://github.com/FakerPHP/Faker/issues",
+ "source": "https://github.com/FakerPHP/Faker/tree/v1.22.0"
+ },
+ "time": "2023-05-14T12:31:37+00:00"
+ },
+ {
+ "name": "felixfbecker/advanced-json-rpc",
+ "version": "v3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git",
+ "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447",
+ "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447",
+ "shasum": ""
+ },
+ "require": {
+ "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
+ "php": "^7.1 || ^8.0",
+ "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.0 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "AdvancedJsonRpc\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "ISC"
+ ],
+ "authors": [
+ {
+ "name": "Felix Becker",
+ "email": "felix.b@outlook.com"
+ }
+ ],
+ "description": "A more advanced JSONRPC implementation",
+ "support": {
+ "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues",
+ "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1"
+ },
+ "time": "2021-06-11T22:34:44+00:00"
+ },
+ {
+ "name": "felixfbecker/language-server-protocol",
+ "version": "v1.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/felixfbecker/php-language-server-protocol.git",
+ "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842",
+ "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "*",
+ "squizlabs/php_codesniffer": "^3.1",
+ "vimeo/psalm": "^4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "LanguageServerProtocol\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "ISC"
+ ],
+ "authors": [
+ {
+ "name": "Felix Becker",
+ "email": "felix.b@outlook.com"
+ }
+ ],
+ "description": "PHP classes for the Language Server Protocol",
+ "keywords": [
+ "language",
+ "microsoft",
+ "php",
+ "server"
+ ],
+ "support": {
+ "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues",
+ "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2"
+ },
+ "time": "2022-03-02T22:36:06+00:00"
+ },
+ {
+ "name": "fidry/cpu-core-counter",
+ "version": "0.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theofidry/cpu-core-counter.git",
+ "reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/b58e5a3933e541dc286cc91fc4f3898bbc6f1623",
+ "reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "fidry/makefile": "^0.2.0",
+ "phpstan/extension-installer": "^1.2.0",
+ "phpstan/phpstan": "^1.9.2",
+ "phpstan/phpstan-deprecation-rules": "^1.0.0",
+ "phpstan/phpstan-phpunit": "^1.2.2",
+ "phpstan/phpstan-strict-rules": "^1.4.4",
+ "phpunit/phpunit": "^9.5.26 || ^8.5.31",
+ "theofidry/php-cs-fixer-config": "^1.0",
+ "webmozarts/strict-phpunit": "^7.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Fidry\\CpuCoreCounter\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Théo FIDRY",
+ "email": "theo.fidry@gmail.com"
+ }
+ ],
+ "description": "Tiny utility to get the number of CPU cores.",
+ "keywords": [
+ "CPU",
+ "core"
+ ],
+ "support": {
+ "issues": "https://github.com/theofidry/cpu-core-counter/issues",
+ "source": "https://github.com/theofidry/cpu-core-counter/tree/0.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theofidry",
+ "type": "github"
+ }
+ ],
+ "time": "2022-12-24T12:35:10+00:00"
+ },
+ {
+ "name": "friendsofphp/php-cs-fixer",
+ "version": "v3.13.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
+ "reference": "a6232229a8309e8811dc751c28b91cb34b2943e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a6232229a8309e8811dc751c28b91cb34b2943e1",
+ "reference": "a6232229a8309e8811dc751c28b91cb34b2943e1",
+ "shasum": ""
+ },
+ "require": {
+ "composer/semver": "^3.2",
+ "composer/xdebug-handler": "^3.0.3",
+ "doctrine/annotations": "^1.13",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": "^7.4 || ^8.0",
+ "sebastian/diff": "^4.0",
+ "symfony/console": "^5.4 || ^6.0",
+ "symfony/event-dispatcher": "^5.4 || ^6.0",
+ "symfony/filesystem": "^5.4 || ^6.0",
+ "symfony/finder": "^5.4 || ^6.0",
+ "symfony/options-resolver": "^5.4 || ^6.0",
+ "symfony/polyfill-mbstring": "^1.23",
+ "symfony/polyfill-php80": "^1.25",
+ "symfony/polyfill-php81": "^1.25",
+ "symfony/process": "^5.4 || ^6.0",
+ "symfony/stopwatch": "^5.4 || ^6.0"
+ },
+ "require-dev": {
+ "justinrainbow/json-schema": "^5.2",
+ "keradus/cli-executor": "^2.0",
+ "mikey179/vfsstream": "^1.6.10",
+ "php-coveralls/php-coveralls": "^2.5.2",
+ "php-cs-fixer/accessible-object": "^1.1",
+ "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2",
+ "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1",
+ "phpspec/prophecy": "^1.15",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpunit/phpunit": "^9.5",
+ "phpunitgoodpractices/polyfill": "^1.6",
+ "phpunitgoodpractices/traits": "^1.9.2",
+ "symfony/phpunit-bridge": "^6.0",
+ "symfony/yaml": "^5.4 || ^6.0"
+ },
+ "suggest": {
+ "ext-dom": "For handling output formats in XML",
+ "ext-mbstring": "For handling non-UTF8 characters."
+ },
+ "bin": [
+ "php-cs-fixer"
+ ],
+ "type": "application",
+ "autoload": {
+ "psr-4": {
+ "PhpCsFixer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Dariusz Rumiński",
+ "email": "dariusz.ruminski@gmail.com"
+ }
+ ],
+ "description": "A tool to automatically fix PHP code style",
+ "support": {
+ "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
+ "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.13.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/keradus",
+ "type": "github"
+ }
+ ],
+ "time": "2022-10-31T19:28:50+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "7.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5",
+ "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "guzzlehttp/promises": "^1.5.3 || ^2.0",
+ "guzzlehttp/psr7": "^1.9.1 || ^2.4.5",
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-client": "^1.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "provide": {
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.1",
+ "ext-curl": "*",
+ "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
+ "php-http/message-factory": "^1.1",
+ "phpunit/phpunit": "^8.5.29 || ^9.5.23",
+ "psr/log": "^1.1 || ^2.0 || ^3.0"
+ },
+ "suggest": {
+ "ext-curl": "Required for CURL handler support",
+ "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+ "psr/log": "Required for using the Log middleware"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Jeremy Lindblom",
+ "email": "jeremeamia@gmail.com",
+ "homepage": "https://github.com/jeremeamia"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "psr-18",
+ "psr-7",
+ "rest",
+ "web service"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/guzzle/issues",
+ "source": "https://github.com/guzzle/guzzle/tree/7.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-21T14:04:53+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/3a494dc7dc1d7d12e511890177ae2d0e6c107da6",
+ "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.1",
+ "phpunit/phpunit": "^8.5.29 || ^9.5.23"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/promises/issues",
+ "source": "https://github.com/guzzle/promises/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-21T13:50:22+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "b635f279edd83fc275f822a1188157ffea568ff6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6",
+ "reference": "b635f279edd83fc275f822a1188157ffea568ff6",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0",
+ "ralouphie/getallheaders": "^3.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.1",
+ "http-interop/http-factory-tests": "^0.9",
+ "phpunit/phpunit": "^8.5.29 || ^9.5.23"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/2.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-04-17T16:11:26+00:00"
+ },
+ {
+ "name": "kint-php/kint",
+ "version": "5.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/kint-php/kint.git",
+ "reference": "1033fc4a5075e15b9b46be20c246069ab44bc243"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/kint-php/kint/zipball/1033fc4a5075e15b9b46be20c246069ab44bc243",
+ "reference": "1033fc4a5075e15b9b46be20c246069ab44bc243",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3",
+ "phpspec/prophecy-phpunit": "^2",
+ "phpunit/phpunit": "^9",
+ "seld/phar-utils": "^1",
+ "symfony/finder": "^4.0 || ^5.0 || ^6.0",
+ "vimeo/psalm": "^5@dev"
+ },
+ "suggest": {
+ "kint-php/kint-helpers": "Provides extra helper functions",
+ "kint-php/kint-twig": "Provides d() and s() functions in twig templates"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "init.php"
+ ],
+ "psr-4": {
+ "Kint\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jonathan Vollebregt",
+ "homepage": "https://github.com/jnvsor"
+ },
+ {
+ "name": "Contributors",
+ "homepage": "https://github.com/kint-php/kint/graphs/contributors"
+ }
+ ],
+ "description": "Kint - debugging tool for PHP developers",
+ "homepage": "https://kint-php.github.io/kint/",
+ "keywords": [
+ "debug",
+ "kint",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/kint-php/kint/issues",
+ "source": "https://github.com/kint-php/kint/tree/5.0.5"
+ },
+ "time": "2023-03-08T14:50:41+00:00"
+ },
+ {
+ "name": "mikey179/vfsstream",
+ "version": "v1.6.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bovigo/vfsStream.git",
+ "reference": "17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f",
+ "reference": "17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.5|^5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "org\\bovigo\\vfs\\": "src/main/php"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Frank Kleine",
+ "homepage": "http://frankkleine.de/",
+ "role": "Developer"
+ }
+ ],
+ "description": "Virtual file system to mock the real file system in unit tests.",
+ "homepage": "http://vfs.bovigo.org/",
+ "support": {
+ "issues": "https://github.com/bovigo/vfsStream/issues",
+ "source": "https://github.com/bovigo/vfsStream/tree/master",
+ "wiki": "https://github.com/bovigo/vfsStream/wiki"
+ },
+ "time": "2022-02-23T02:02:42+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.11.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+ "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+ "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.1"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-03-08T13:26:56+00:00"
+ },
+ {
+ "name": "netresearch/jsonmapper",
+ "version": "v4.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cweiske/jsonmapper.git",
+ "reference": "f60565f8c0566a31acf06884cdaa591867ecc956"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/f60565f8c0566a31acf06884cdaa591867ecc956",
+ "reference": "f60565f8c0566a31acf06884cdaa591867ecc956",
+ "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.2.0"
+ },
+ "time": "2023-04-09T17:37:40+00:00"
+ },
+ {
+ "name": "nexusphp/cs-config",
+ "version": "v3.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/NexusPHP/cs-config.git",
+ "reference": "8ef2d10694d0dfadb1fc028c9b5de07c8e852092"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/NexusPHP/cs-config/zipball/8ef2d10694d0dfadb1fc028c9b5de07c8e852092",
+ "reference": "8ef2d10694d0dfadb1fc028c9b5de07c8e852092",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "friendsofphp/php-cs-fixer": "^3.13",
+ "php": "^7.4 || ^8.0"
+ },
+ "conflict": {
+ "liaison/cs-config": "*"
+ },
+ "require-dev": {
+ "nexusphp/tachycardia": "^1.3",
+ "phpstan/phpstan": "^1.8",
+ "phpunit/phpunit": "^9.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-develop": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Nexus\\CsConfig\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "John Paul E. Balandan, CPA",
+ "email": "paulbalandan@gmail.com"
+ }
+ ],
+ "description": "A factory for custom rulesets for PHP CS Fixer.",
+ "support": {
+ "issues": "https://github.com/NexusPHP/cs-config/issues",
+ "slack": "https://nexusphp.slack.com",
+ "source": "https://github.com/NexusPHP/cs-config.git"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.me/paulbalandan",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/paulbalandan",
+ "type": "github"
+ }
+ ],
+ "time": "2022-11-01T15:20:57+00:00"
+ },
+ {
+ "name": "nexusphp/tachycardia",
+ "version": "v1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/NexusPHP/tachycardia.git",
+ "reference": "a9a0335e36fa297d6df0174ef090890618bce3fe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/NexusPHP/tachycardia/zipball/a9a0335e36fa297d6df0174ef090890618bce3fe",
+ "reference": "a9a0335e36fa297d6df0174ef090890618bce3fe",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "phpunit/php-timer": "^5.0",
+ "phpunit/phpunit": "^9.5"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.0",
+ "nexusphp/cs-config": "^3.2",
+ "phpstan/phpstan": "^1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Nexus\\PHPUnit\\Extension\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "John Paul E. Balandan, CPA",
+ "email": "paulbalandan@gmail.com"
+ }
+ ],
+ "description": "Detects slow running tests in your PHPUnit-driven test suites.",
+ "support": {
+ "issues": "https://github.com/NexusPHP/tachycardia/issues",
+ "slack": "https://nexusphp.slack.com",
+ "source": "https://github.com/NexusPHP/tachycardia.git"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.me/paulbalandan",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/paulbalandan",
+ "type": "github"
+ }
+ ],
+ "time": "2022-10-14T05:24:06+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.15.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/11e2663a5bc9db5d714eedb4277ee300403b4a9e",
+ "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e",
+ "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.5"
+ },
+ "time": "2023-05-19T20:20:00+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": "php-coveralls/php-coveralls",
+ "version": "v2.5.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-coveralls/php-coveralls.git",
+ "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9d8243bbf0e053333692857c98fab7cfba0d60a9",
+ "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-simplexml": "*",
+ "guzzlehttp/guzzle": "^6.0 || ^7.0",
+ "php": "^5.5 || ^7.0 || ^8.0",
+ "psr/log": "^1.0 || ^2.0",
+ "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0",
+ "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0",
+ "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0 || ^6.0",
+ "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || >=8.0 <8.5.29 || >=9.0 <9.5.23",
+ "sanmai/phpunit-legacy-adapter": "^6.1 || ^8.0"
+ },
+ "suggest": {
+ "symfony/http-kernel": "Allows Symfony integration"
+ },
+ "bin": [
+ "bin/php-coveralls"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PhpCoveralls\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kitamura Satoshi",
+ "email": "with.no.parachute@gmail.com",
+ "homepage": "https://www.facebook.com/satooshi.jp",
+ "role": "Original creator"
+ },
+ {
+ "name": "Takashi Matsuo",
+ "email": "tmatsuo@google.com"
+ },
+ {
+ "name": "Google Inc"
+ },
+ {
+ "name": "Dariusz Ruminski",
+ "email": "dariusz.ruminski@gmail.com",
+ "homepage": "https://github.com/keradus"
+ },
+ {
+ "name": "Contributors",
+ "homepage": "https://github.com/php-coveralls/php-coveralls/graphs/contributors"
+ }
+ ],
+ "description": "PHP client library for Coveralls API",
+ "homepage": "https://github.com/php-coveralls/php-coveralls",
+ "keywords": [
+ "ci",
+ "coverage",
+ "github",
+ "test"
+ ],
+ "support": {
+ "issues": "https://github.com/php-coveralls/php-coveralls/issues",
+ "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.5.3"
+ },
+ "time": "2022-09-12T20:47:09+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.7.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b2fe4d22a5426f38e014855322200b97b5362c0d",
+ "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1.0",
+ "php": "^7.4 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0",
+ "phpstan/phpdoc-parser": "^1.13"
+ },
+ "require-dev": {
+ "ext-tokenizer": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpunit/phpunit": "^9.5",
+ "rector/rector": "^0.13.9",
+ "vimeo/psalm": "^4.25"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.2"
+ },
+ "time": "2023-05-30T18:13:47+00:00"
+ },
+ {
+ "name": "phpstan/phpdoc-parser",
+ "version": "1.22.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpdoc-parser.git",
+ "reference": "ec58baf7b3c7f1c81b3b00617c953249fb8cf30c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/ec58baf7b3c7f1c81b3b00617c953249fb8cf30c",
+ "reference": "ec58baf7b3c7f1c81b3b00617c953249fb8cf30c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^2.0",
+ "nikic/php-parser": "^4.15",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^1.5",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpstan/phpstan-strict-rules": "^1.0",
+ "phpunit/phpunit": "^9.5",
+ "symfony/process": "^5.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\PhpDocParser\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPDoc parser with support for nullable, intersection and generic types",
+ "support": {
+ "issues": "https://github.com/phpstan/phpdoc-parser/issues",
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/1.22.0"
+ },
+ "time": "2023-06-01T12:35:21+00:00"
+ },
+ {
+ "name": "phpstan/phpstan",
+ "version": "1.10.15",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan.git",
+ "reference": "762c4dac4da6f8756eebb80e528c3a47855da9bd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/762c4dac4da6f8756eebb80e528c3a47855da9bd",
+ "reference": "762c4dac4da6f8756eebb80e528c3a47855da9bd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ondrejmirtes",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/phpstan",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-09T15:28:01+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.26",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1",
+ "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.15",
+ "php": ">=7.3",
+ "phpunit/php-file-iterator": "^3.0.3",
+ "phpunit/php-text-template": "^2.0.2",
+ "sebastian/code-unit-reverse-lookup": "^2.0.2",
+ "sebastian/complexity": "^2.0",
+ "sebastian/environment": "^5.1.2",
+ "sebastian/lines-of-code": "^1.0.3",
+ "sebastian/version": "^3.0.1",
+ "theseer/tokenizer": "^1.2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-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.26"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-03-06T12:58:08+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/phpcov",
+ "version": "8.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpcov.git",
+ "reference": "8ec45dde34a84914a0ace355fbd6d7af2242c9a4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpcov/zipball/8ec45dde34a84914a0ace355fbd6d7af2242c9a4",
+ "reference": "8ec45dde34a84914a0ace355fbd6d7af2242c9a4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "phpunit/php-code-coverage": "^9.2",
+ "phpunit/php-file-iterator": "^3.0",
+ "phpunit/phpunit": "^9.3",
+ "sebastian/cli-parser": "^1.0",
+ "sebastian/diff": "^4.0",
+ "sebastian/version": "^3.0"
+ },
+ "bin": [
+ "phpcov"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "8.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": "CLI frontend for php-code-coverage",
+ "homepage": "https://github.com/sebastianbergmann/phpcov",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpcov/issues",
+ "source": "https://github.com/sebastianbergmann/phpcov/tree/8.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-03-24T12:07:05+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "9.6.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/17d621b3aff84d0c8b62539e269e87d8d5baa76e",
+ "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.3.1 || ^2",
+ "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": "To be able to generate mocks based on WSDL files",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.6-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.8"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-11T05:14:45+00:00"
+ },
+ {
+ "name": "predis/predis",
+ "version": "v2.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/predis/predis.git",
+ "reference": "a77a43913a74f9331f637bb12867eb8e274814e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/predis/predis/zipball/a77a43913a74f9331f637bb12867eb8e274814e5",
+ "reference": "a77a43913a74f9331f637bb12867eb8e274814e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.3",
+ "phpstan/phpstan": "^1.9",
+ "phpunit/phpunit": "^8.0 || ~9.4.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Predis\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Till Krüss",
+ "homepage": "https://till.im",
+ "role": "Maintainer"
+ }
+ ],
+ "description": "A flexible and feature-complete Redis client for PHP.",
+ "homepage": "http://github.com/predis/predis",
+ "keywords": [
+ "nosql",
+ "predis",
+ "redis"
+ ],
+ "support": {
+ "issues": "https://github.com/predis/predis/issues",
+ "source": "https://github.com/predis/predis/tree/v2.1.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/tillkruss",
+ "type": "github"
+ }
+ ],
+ "time": "2023-03-02T18:32:04+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
+ },
+ "time": "2021-02-03T23:26:27+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
+ },
+ {
+ "name": "psr/http-client",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31",
+ "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
+ "keywords": [
+ "http",
+ "http-client",
+ "psr",
+ "psr-18"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-client/tree/1.0.2"
+ },
+ "time": "2023-04-10T20:12:12+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "e616d01114759c4c489f93b099585439f795fe35"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35",
+ "reference": "e616d01114759c4c489f93b099585439f795fe35",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory/tree/1.0.2"
+ },
+ "time": "2023-04-10T20:10:41+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/2.0"
+ },
+ "time": "2023-04-04T09:54:51+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "support": {
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ },
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "rector/rector",
+ "version": "0.15.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/rectorphp/rector.git",
+ "reference": "000bfb6f7974449399f39e1a210458395b75c887"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/rectorphp/rector/zipball/000bfb6f7974449399f39e1a210458395b75c887",
+ "reference": "000bfb6f7974449399f39e1a210458395b75c887",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0",
+ "phpstan/phpstan": "^1.9.7"
+ },
+ "conflict": {
+ "rector/rector-doctrine": "*",
+ "rector/rector-downgrade-php": "*",
+ "rector/rector-php-parser": "*",
+ "rector/rector-phpunit": "*",
+ "rector/rector-symfony": "*"
+ },
+ "bin": [
+ "bin/rector"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "0.14-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Instant Upgrade and Automated Refactoring of any PHP code",
+ "support": {
+ "issues": "https://github.com/rectorphp/rector/issues",
+ "source": "https://github.com/rectorphp/rector/tree/0.15.10"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/tomasvotruba",
+ "type": "github"
+ }
+ ],
+ "time": "2023-01-21T14:30:16+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.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131",
+ "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131",
+ "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.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-05-07T05:35:17+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "5.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "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.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:03:51+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.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "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": "https://github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:07:39+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.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "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.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:13: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": "spatie/array-to-xml",
+ "version": "3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/array-to-xml.git",
+ "reference": "e210b98957987c755372465be105d32113f339a4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/e210b98957987c755372465be105d32113f339a4",
+ "reference": "e210b98957987c755372465be105d32113f339a4",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "php": "^8.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.2",
+ "pestphp/pest": "^1.21",
+ "spatie/pest-plugin-snapshots": "^1.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Spatie\\ArrayToXml\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Freek Van der Herten",
+ "email": "freek@spatie.be",
+ "homepage": "https://freek.dev",
+ "role": "Developer"
+ }
+ ],
+ "description": "Convert an array to xml",
+ "homepage": "https://github.com/spatie/array-to-xml",
+ "keywords": [
+ "array",
+ "convert",
+ "xml"
+ ],
+ "support": {
+ "source": "https://github.com/spatie/array-to-xml/tree/3.1.6"
+ },
+ "funding": [
+ {
+ "url": "https://spatie.be/open-source/support-us",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/spatie",
+ "type": "github"
+ }
+ ],
+ "time": "2023-05-11T14:04:07+00:00"
+ },
+ {
+ "name": "symfony/config",
+ "version": "v6.0.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "db4fc45c24e0c3e2198e68ada9d7f90daa1f97e3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/db4fc45c24e0c3e2198e68ada9d7f90daa1f97e3",
+ "reference": "db4fc45c24e0c3e2198e68ada9d7f90daa1f97e3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/filesystem": "^5.4|^6.0",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-php81": "^1.22"
+ },
+ "conflict": {
+ "symfony/finder": "<4.4"
+ },
+ "require-dev": {
+ "symfony/event-dispatcher": "^5.4|^6.0",
+ "symfony/finder": "^5.4|^6.0",
+ "symfony/messenger": "^5.4|^6.0",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/yaml": "^5.4|^6.0"
+ },
+ "suggest": {
+ "symfony/yaml": "To use the yaml reference dumper"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Config\\": ""
+ },
+ "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": "Helps you find, load, combine, autofill and validate configuration values of any kind",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/config/tree/v6.0.19"
+ },
+ "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": "2023-01-09T04:36:00+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v6.0.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "c3ebc83d031b71c39da318ca8b7a07ecc67507ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/c3ebc83d031b71c39da318ca8b7a07ecc67507ed",
+ "reference": "c3ebc83d031b71c39da318ca8b7a07ecc67507ed",
+ "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.19"
+ },
+ "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": "2023-01-01T08:36:10+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.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "2eaf8e63bc5b8cefabd4a800157f0d0c094f677a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2eaf8e63bc5b8cefabd4a800157f0d0c094f677a",
+ "reference": "2eaf8e63bc5b8cefabd4a800157f0d0c094f677a",
+ "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.19"
+ },
+ "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": "2023-01-01T08:36:10+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.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214",
+ "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214",
+ "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.19"
+ },
+ "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": "2023-01-20T17:44:14+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v6.0.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "5cc9cac6586fc0c28cd173780ca696e419fefa11"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/5cc9cac6586fc0c28cd173780ca696e419fefa11",
+ "reference": "5cc9cac6586fc0c28cd173780ca696e419fefa11",
+ "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.19"
+ },
+ "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": "2023-01-20T17:44:14+00:00"
+ },
+ {
+ "name": "symfony/options-resolver",
+ "version": "v6.0.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/options-resolver.git",
+ "reference": "6a180d1c45e0d9797470ca9eb46215692de00fa3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/6a180d1c45e0d9797470ca9eb46215692de00fa3",
+ "reference": "6a180d1c45e0d9797470ca9eb46215692de00fa3",
+ "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.19"
+ },
+ "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": "2023-01-01T08:36:10+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/polyfill-php81",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php81.git",
+ "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a",
+ "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a",
+ "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\\Php81\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php81/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.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "2114fd60f26a296cc403a7939ab91478475a33d4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/2114fd60f26a296cc403a7939ab91478475a33d4",
+ "reference": "2114fd60f26a296cc403a7939ab91478475a33d4",
+ "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.19"
+ },
+ "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": "2023-01-01T08:36:10+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66",
+ "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2",
+ "psr/container": "^2.0"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "suggest": {
+ "symfony/service-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\\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/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-05-30T19:17:58+00:00"
+ },
+ {
+ "name": "symfony/stopwatch",
+ "version": "v6.0.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/stopwatch.git",
+ "reference": "011e781839dd1d2eb8119f65ac516a530f60226d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/011e781839dd1d2eb8119f65ac516a530f60226d",
+ "reference": "011e781839dd1d2eb8119f65ac516a530f60226d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2",
+ "symfony/service-contracts": "^1|^2|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Stopwatch\\": ""
+ },
+ "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 a way to profile code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/stopwatch/tree/v6.0.19"
+ },
+ "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": "2023-01-01T08:36:10+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v6.0.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a",
+ "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a",
+ "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.19"
+ },
+ "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": "2023-01-01T08:36:10+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v6.0.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "deec3a812a0305a50db8ae689b183f43d915c884"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/deec3a812a0305a50db8ae689b183f43d915c884",
+ "reference": "deec3a812a0305a50db8ae689b183f43d915c884",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/console": "<5.4"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0"
+ },
+ "suggest": {
+ "symfony/console": "For validating YAML files using the lint command"
+ },
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "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": "Loads and dumps YAML files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/yaml/tree/v6.0.19"
+ },
+ "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": "2023-01-11T11:50:03+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.12.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/vimeo/psalm.git",
+ "reference": "f90118cdeacd0088e7215e64c0c99ceca819e176"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/vimeo/psalm/zipball/f90118cdeacd0088e7215e64c0c99ceca819e176",
+ "reference": "f90118cdeacd0088e7215e64c0c99ceca819e176",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^2.4.2",
+ "amphp/byte-stream": "^1.5",
+ "composer-runtime-api": "^2",
+ "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.1 || ^0.5.1",
+ "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
+ "nikic/php-parser": "^4.14",
+ "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0",
+ "sebastian/diff": "^4.0 || ^5.0",
+ "spatie/array-to-xml": "^2.17.0 || ^3.0",
+ "symfony/console": "^4.1.6 || ^5.0 || ^6.0",
+ "symfony/filesystem": "^5.4 || ^6.0"
+ },
+ "provide": {
+ "psalm/psalm": "self.version"
+ },
+ "require-dev": {
+ "amphp/phpunit-util": "^2.0",
+ "bamarni/composer-bin-plugin": "^1.4",
+ "brianium/paratest": "^6.9",
+ "ext-curl": "*",
+ "mockery/mockery": "^1.5",
+ "nunomaduro/mock-final-classes": "^1.1",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/phpdoc-parser": "^1.6",
+ "phpunit/phpunit": "^9.6",
+ "psalm/plugin-mockery": "^1.1",
+ "psalm/plugin-phpunit": "^0.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",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/vimeo/psalm/issues",
+ "source": "https://github.com/vimeo/psalm/tree/5.12.0"
+ },
+ "time": "2023-05-22T21:19:03+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<4.6.1 || 4.6.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5.13"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "support": {
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.11.0"
+ },
+ "time": "2022-06-03T18:03:27+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^7.4 || ^8.0",
+ "ext-intl": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.3.0"
+}
diff --git a/system/API/ResponseTrait.php b/system/API/ResponseTrait.php
index 0b357f0..5a35000 100644
--- a/system/API/ResponseTrait.php
+++ b/system/API/ResponseTrait.php
@@ -20,9 +20,6 @@
* Provides common, more readable, methods to provide
* consistent HTTP responses under a variety of common
* situations when working as an API.
- *
- * @property IncomingRequest $request
- * @property ResponseInterface $response
*/
trait ResponseTrait
{
@@ -92,8 +89,10 @@ protected function respond($data = null, ?int $status = null, string $message =
if ($data === null && $status === null) {
$status = 404;
$output = null;
+ $this->format($data);
} elseif ($data === null && is_numeric($status)) {
$output = null;
+ $this->format($data);
} else {
$status = empty($status) ? 200 : $status;
$output = $this->format($data);
diff --git a/system/Autoloader/Autoloader.php b/system/Autoloader/Autoloader.php
index 0f1d91e..f838451 100644
--- a/system/Autoloader/Autoloader.php
+++ b/system/Autoloader/Autoloader.php
@@ -381,7 +381,12 @@ private function loadComposerNamespaces(ClassLoader $composer, array $composerPa
);
}
// This method requires Composer 2.0.14 or later.
- $packageList = InstalledVersions::getAllRawData()[0]['versions'];
+ $allData = InstalledVersions::getAllRawData();
+ $packageList = [];
+
+ foreach ($allData as $list) {
+ $packageList = array_merge($packageList, $list['versions']);
+ }
// Check config for $composerPackages.
$only = $composerPackages['only'] ?? [];
diff --git a/system/BaseModel.php b/system/BaseModel.php
index 5d1aad1..26b6952 100644
--- a/system/BaseModel.php
+++ b/system/BaseModel.php
@@ -63,8 +63,8 @@ abstract class BaseModel
* The Database connection group that
* should be instantiated.
*
- * @var string
- * @phpstan-var non-empty-string
+ * @var string|null
+ * @phpstan-var non-empty-string|null
*/
protected $DBGroup;
diff --git a/system/CLI/BaseCommand.php b/system/CLI/BaseCommand.php
index 163e81f..0618ceb 100644
--- a/system/CLI/BaseCommand.php
+++ b/system/CLI/BaseCommand.php
@@ -105,7 +105,7 @@ abstract public function run(array $params);
/**
* Can be used by a command to run other commands.
*
- * @return mixed
+ * @return int|void
*
* @throws ReflectionException
*/
@@ -205,7 +205,7 @@ public function getPad(array $array, int $pad): int
/**
* Makes it simple to access our protected properties.
*
- * @return mixed
+ * @return array|Commands|LoggerInterface|string|null
*/
public function __get(string $key)
{
diff --git a/system/CLI/CLI.php b/system/CLI/CLI.php
index 8b648a6..80d001a 100644
--- a/system/CLI/CLI.php
+++ b/system/CLI/CLI.php
@@ -915,7 +915,7 @@ public static function getURI(): string
*
* **IMPORTANT:** The index here is one-based instead of zero-based.
*
- * @return mixed
+ * @return string|null
*/
public static function getSegment(int $index)
{
diff --git a/system/CLI/GeneratorTrait.php b/system/CLI/GeneratorTrait.php
index 97f011f..21ae0c1 100644
--- a/system/CLI/GeneratorTrait.php
+++ b/system/CLI/GeneratorTrait.php
@@ -235,15 +235,15 @@ protected function qualifyClassName(): string
$component = singular($this->component);
/**
- * @see https://regex101.com/r/a5KNCR/1
+ * @see https://regex101.com/r/a5KNCR/2
*/
- $pattern = sprintf('/([a-z][a-z0-9_\/\\\\]+)(%s)/i', $component);
+ $pattern = sprintf('/([a-z][a-z0-9_\/\\\\]+)(%s)$/i', $component);
if (preg_match($pattern, $class, $matches) === 1) {
$class = $matches[1] . ucfirst($matches[2]);
}
- if ($this->enabledSuffixing && $this->getOption('suffix') && ! strripos($class, $component)) {
+ if ($this->enabledSuffixing && $this->getOption('suffix') && preg_match($pattern, $class) !== 1) {
$class .= ucfirst($component);
}
diff --git a/system/Cache/Handlers/FileHandler.php b/system/Cache/Handlers/FileHandler.php
index 98a4ccb..c217c7e 100644
--- a/system/Cache/Handlers/FileHandler.php
+++ b/system/Cache/Handlers/FileHandler.php
@@ -229,7 +229,7 @@ public function isSupported(): bool
* Does the heavy lifting of actually retrieving the file and
* verifying it's age.
*
- * @return mixed
+ * @return array|bool|float|int|object|string|null
*/
protected function getItem(string $filename)
{
@@ -346,7 +346,7 @@ protected function getDirFileInfo(string $sourceDir, bool $topLevelOnly = true,
while (false !== ($file = readdir($fp))) {
if (is_dir($sourceDir . $file) && $file[0] !== '.' && $topLevelOnly === false) {
$this->getDirFileInfo($sourceDir . $file . DIRECTORY_SEPARATOR, $topLevelOnly, true);
- } elseif ($file[0] !== '.') {
+ } elseif (! is_dir($sourceDir . $file) && $file[0] !== '.') {
$_filedata[$file] = $this->getFileInfo($sourceDir . $file);
$_filedata[$file]['relative_path'] = $relativePath;
}
@@ -366,8 +366,8 @@ protected function getDirFileInfo(string $sourceDir, bool $topLevelOnly = true,
* Options are: name, server_path, size, date, readable, writable, executable, fileperms
* Returns FALSE if the file cannot be found.
*
- * @param string $file Path to file
- * @param mixed $returnedValues Array or comma separated string of information returned
+ * @param string $file Path to file
+ * @param array|string $returnedValues Array or comma separated string of information returned
*
* @return array|false
*/
diff --git a/system/Cache/Handlers/RedisHandler.php b/system/Cache/Handlers/RedisHandler.php
index 8b3af58..6874a86 100644
--- a/system/Cache/Handlers/RedisHandler.php
+++ b/system/Cache/Handlers/RedisHandler.php
@@ -233,12 +233,11 @@ public function getCacheInfo()
*/
public function getMetaData(string $key)
{
- $key = static::validateKey($key, $this->prefix);
$value = $this->get($key);
if ($value !== null) {
$time = Time::now()->getTimestamp();
- $ttl = $this->redis->ttl($key);
+ $ttl = $this->redis->ttl(static::validateKey($key, $this->prefix));
return [
'expire' => $ttl > 0 ? $time + $ttl : null,
diff --git a/system/CodeIgniter.php b/system/CodeIgniter.php
index 5cb98c4..943fa36 100644
--- a/system/CodeIgniter.php
+++ b/system/CodeIgniter.php
@@ -47,7 +47,7 @@ class CodeIgniter
/**
* The current version of CodeIgniter Framework
*/
- public const CI_VERSION = '4.3.1';
+ public const CI_VERSION = '4.3.5';
/**
* App startup time.
diff --git a/system/Commands/Database/MigrateRollback.php b/system/Commands/Database/MigrateRollback.php
index 17434da..c29ce84 100644
--- a/system/Commands/Database/MigrateRollback.php
+++ b/system/Commands/Database/MigrateRollback.php
@@ -57,7 +57,7 @@ class MigrateRollback extends BaseCommand
* @var array
*/
protected $options = [
- '-b' => 'Specify a batch to roll back to; e.g. "3" to return to batch #3 or "-2" to roll back twice',
+ '-b' => 'Specify a batch to roll back to; e.g. "3" to return to batch #3',
'-g' => 'Set database group',
'-f' => 'Force command - this option allows you to bypass the confirmation question when running this command in a production environment',
];
diff --git a/system/Commands/Generators/CellGenerator.php b/system/Commands/Generators/CellGenerator.php
index b137006..cdb819d 100644
--- a/system/Commands/Generators/CellGenerator.php
+++ b/system/Commands/Generators/CellGenerator.php
@@ -65,7 +65,6 @@ class CellGenerator extends BaseCommand
*/
protected $options = [
'--namespace' => 'Set root namespace. Default: "APP_NAMESPACE".',
- '--suffix' => 'Append the component title to the class name (e.g. User => UserCell).',
'--force' => 'Force overwrite existing file.',
];
@@ -74,30 +73,26 @@ class CellGenerator extends BaseCommand
*/
public function run(array $params)
{
- // Generate the Class first
- $this->component = 'Cell';
- $this->directory = 'Cells';
+ $this->component = 'Cell';
+ $this->directory = 'Cells';
+
+ $params = array_merge($params, ['suffix' => null]);
+
$this->template = 'cell.tpl.php';
$this->classNameLang = 'CLI.generator.className.cell';
-
$this->generateClass($params);
- // Generate the View
+ $this->name = 'make:cell_view';
+ $this->template = 'cell_view.tpl.php';
$this->classNameLang = 'CLI.generator.viewName.cell';
- // Form the view name
- $segments = explode('\\', $this->qualifyClassName());
-
- $view = array_pop($segments);
- $view = str_replace('Cell', '', decamelize($view));
- if (strpos($view, '_cell') === false) {
- $view .= '_cell';
- }
- $segments[] = $view;
- $view = implode('\\', $segments);
+ $className = $this->qualifyClassName();
+ $viewName = decamelize(class_basename($className));
+ $viewName = preg_replace('/([a-z][a-z0-9_\/\\\\]+)(_cell)$/i', '$1', $viewName) ?? $viewName;
+ $namespace = substr($className, 0, strrpos($className, '\\') + 1);
- $this->template = 'cell_view.tpl.php';
+ $this->generateView($namespace . $viewName, $params);
- $this->generateView($view, $params);
+ return 0;
}
}
diff --git a/system/Commands/Generators/Views/model.tpl.php b/system/Commands/Generators/Views/model.tpl.php
index 5fc5ed9..ca6d0ec 100644
--- a/system/Commands/Generators/Views/model.tpl.php
+++ b/system/Commands/Generators/Views/model.tpl.php
@@ -10,7 +10,6 @@ class {class} extends Model
protected $table = '{table}';
protected $primaryKey = 'id';
protected $useAutoIncrement = true;
- protected $insertID = 0;
protected $returnType = {return};
protected $useSoftDeletes = false;
protected $protectFields = true;
diff --git a/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php b/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php
index 3f373c4..9504347 100644
--- a/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php
+++ b/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php
@@ -65,8 +65,9 @@ public function read(string $class, string $defaultController = 'Home', string $
// Remove HTTP verb prefix.
$methodInUri = lcfirst(substr($methodName, strlen($httpVerb)));
+ // Check if it is the default method.
if ($methodInUri === $defaultMethod) {
- $routeWithoutController = $this->getRouteWithoutController(
+ $routeForDefaultController = $this->getRouteForDefaultController(
$classShortname,
$defaultController,
$classInUri,
@@ -75,8 +76,11 @@ public function read(string $class, string $defaultController = 'Home', string $
$httpVerb
);
- if ($routeWithoutController !== []) {
- $output = [...$output, ...$routeWithoutController];
+ if ($routeForDefaultController !== []) {
+ // The controller is the default controller. It only
+ // has a route for the default method. Other methods
+ // will not be routed even if they exist.
+ $output = [...$output, ...$routeForDefaultController];
continue;
}
@@ -113,6 +117,12 @@ public function read(string $class, string $defaultController = 'Home', string $
$params[$param->getName()] = $required;
}
+ // If it is the default controller, the method will not be
+ // routed.
+ if ($classShortname === $defaultController) {
+ $route = 'x ' . $route;
+ }
+
$output[] = [
'method' => $httpVerb,
'route' => $route,
@@ -151,9 +161,11 @@ private function getUriByClass(string $classname): string
}
/**
- * Gets a route without default controller.
+ * Gets a route for the default controller.
+ *
+ * @phpstan-return list
*/
- private function getRouteWithoutController(
+ private function getRouteForDefaultController(
string $classShortname,
string $defaultController,
string $uriByClass,
diff --git a/system/Commands/Utilities/Routes/ControllerFinder.php b/system/Commands/Utilities/Routes/ControllerFinder.php
index 7e78658..e7d828c 100644
--- a/system/Commands/Utilities/Routes/ControllerFinder.php
+++ b/system/Commands/Utilities/Routes/ControllerFinder.php
@@ -44,6 +44,7 @@ public function find(): array
$nsArray = explode('\\', trim($this->namespace, '\\'));
$count = count($nsArray);
$ns = '';
+ $files = [];
for ($i = 0; $i < $count; $i++) {
$ns .= '\\' . array_shift($nsArray);
diff --git a/system/Common.php b/system/Common.php
index f73a4d4..2a98253 100644
--- a/system/Common.php
+++ b/system/Common.php
@@ -10,6 +10,7 @@
*/
use CodeIgniter\Cache\CacheInterface;
+use CodeIgniter\Config\BaseConfig;
use CodeIgniter\Config\Factories;
use CodeIgniter\Cookie\Cookie;
use CodeIgniter\Cookie\CookieStore;
@@ -31,6 +32,7 @@
use CodeIgniter\Test\TestLogger;
use Config\App;
use Config\Database;
+use Config\DocTypes;
use Config\Logger;
use Config\Services;
use Config\View;
@@ -47,8 +49,7 @@
*/
function app_timezone(): string
{
- /** @var App $config */
- $config = config('App');
+ $config = config(App::class);
return $config->appTimezone;
}
@@ -90,7 +91,11 @@ function cache(?string $key = null)
function clean_path(string $path): string
{
// Resolve relative paths
- $path = realpath($path) ?: $path;
+ try {
+ $path = realpath($path) ?: $path;
+ } catch (ErrorException|ValueError $e) {
+ $path = 'error file path: ' . urlencode($path);
+ }
switch (true) {
case strpos($path, APPPATH) === 0:
@@ -199,7 +204,12 @@ function command(string $command)
/**
* More simple way of getting config instances from Factories
*
- * @return object|null
+ * @template ConfigTemplate of BaseConfig
+ *
+ * @param class-string|string $name
+ *
+ * @return ConfigTemplate|null
+ * @phpstan-return ($name is class-string ? ConfigTemplate : object|null)
*/
function config(string $name, bool $getShared = true)
{
@@ -491,7 +501,7 @@ function force_https(int $duration = 31_536_000, ?RequestInterface $request = nu
Services::session(null, true)->regenerate(); // @codeCoverageIgnore
}
- $baseURL = config('App')->baseURL;
+ $baseURL = config(App::class)->baseURL;
if (strpos($baseURL, 'https://') === 0) {
$authority = substr($baseURL, strlen('https://'));
@@ -807,11 +817,12 @@ function log_message(string $level, string $message, array $context = [])
/**
* More simple way of getting model instances from Factories
*
- * @template T of Model
+ * @template ModelTemplate of Model
*
- * @param class-string $name
+ * @param class-string|string $name
*
- * @return T
+ * @return ModelTemplate|null
+ * @phpstan-return ($name is class-string ? ModelTemplate : object|null)
*/
function model(string $name, bool $getShared = true, ?ConnectionInterface &$conn = null)
{
@@ -859,7 +870,7 @@ function old(string $key, $default = null, $escape = 'html')
*
* If more control is needed, you must use $response->redirect explicitly.
*
- * @param string $route
+ * @param string|null $route Route name or Controller::method
*/
function redirect(?string $route = null): RedirectResponse
{
@@ -881,7 +892,7 @@ function redirect(?string $route = null): RedirectResponse
*/
function _solidus(): string
{
- if (config('DocTypes')->html5 ?? false) {
+ if (config(DocTypes::class)->html5 ?? false) {
return '';
}
@@ -969,8 +980,6 @@ function route_to(string $method, ...$params)
* session()->set('foo', 'bar');
* $foo = session('bar');
*
- * @param string $val
- *
* @return array|bool|float|int|object|Session|string|null
* @phpstan-return ($val is null ? Session : array|bool|float|int|object|string|null)
*/
@@ -1060,7 +1069,7 @@ function single_service(string $name, ...$params)
*/
function slash_item(string $item): ?string
{
- $config = config('App');
+ $config = config(App::class);
if (! property_exists($config, $item)) {
return null;
@@ -1162,10 +1171,8 @@ function timer(?string $name = null, ?callable $callable = null)
*/
function view(string $name, array $data = [], array $options = []): string
{
- /** @var CodeIgniter\View\View $renderer */
$renderer = Services::renderer();
- /** @var \CodeIgniter\Config\View $config */
$config = config(View::class);
$saveData = $config->saveData;
diff --git a/system/Config/BaseService.php b/system/Config/BaseService.php
index 98cb19f..6b72b6f 100644
--- a/system/Config/BaseService.php
+++ b/system/Config/BaseService.php
@@ -173,9 +173,9 @@ class BaseService
*
* $key must be a name matching a service.
*
- * @param mixed ...$params
+ * @param array|bool|float|int|object|string|null ...$params
*
- * @return mixed
+ * @return object
*/
protected static function getSharedInstance(string $key, ...$params)
{
@@ -239,7 +239,7 @@ public static function locator(bool $getShared = true)
* Provides the ability to perform case-insensitive calling of service
* names.
*
- * @return mixed
+ * @return object|null
*/
public static function __callStatic(string $name, array $arguments)
{
@@ -296,7 +296,7 @@ public static function resetSingle(string $name)
/**
* Inject mock object for testing.
*
- * @param mixed $mock
+ * @param object $mock
*/
public static function injectMock(string $name, $mock)
{
@@ -309,7 +309,7 @@ public static function injectMock(string $name, $mock)
* looks for the service method in each, returning an instance of
* the service, if available.
*
- * @return mixed
+ * @return object|null
*
* @deprecated
*
diff --git a/system/Config/Config.php b/system/Config/Config.php
index 307f7ad..d261fa4 100644
--- a/system/Config/Config.php
+++ b/system/Config/Config.php
@@ -23,7 +23,7 @@ class Config
* @param string $name Configuration name
* @param bool $getShared Use shared instance
*
- * @return mixed|null
+ * @return object|null
*/
public static function get(string $name, bool $getShared = true)
{
diff --git a/system/Cookie/Cookie.php b/system/Cookie/Cookie.php
index 3fc5ea1..e94d61b 100644
--- a/system/Cookie/Cookie.php
+++ b/system/Cookie/Cookie.php
@@ -96,7 +96,7 @@ class Cookie implements ArrayAccess, CloneableCookieInterface
* Default attributes for a Cookie object. The keys here are the
* lowercase attribute names. Do not camelCase!
*
- * @var array
+ * @var array
*/
private static array $defaults = [
'prefix' => '',
@@ -124,7 +124,7 @@ class Cookie implements ArrayAccess, CloneableCookieInterface
*
* This method is called from Response::__construct().
*
- * @param array|CookieConfig $config
+ * @param array|CookieConfig $config
*
* @return array The old defaults array. Useful for resetting.
*/
@@ -195,9 +195,9 @@ public static function fromHeaderString(string $cookie, bool $raw = false)
/**
* Construct a new Cookie instance.
*
- * @param string $name The cookie's name
- * @param string $value The cookie's value
- * @param array $options The cookie's options
+ * @param string $name The cookie's name
+ * @param string $value The cookie's value
+ * @param array $options The cookie's options
*
* @throws CookieException
*/
@@ -595,8 +595,8 @@ public function offsetGet($offset)
/**
* Offset to set.
*
- * @param string $offset
- * @param mixed $value
+ * @param string $offset
+ * @param bool|int|string $value
*
* @throws LogicException
*/
diff --git a/system/Cookie/CookieInterface.php b/system/Cookie/CookieInterface.php
index 0b2b757..5a21d6a 100644
--- a/system/Cookie/CookieInterface.php
+++ b/system/Cookie/CookieInterface.php
@@ -143,7 +143,7 @@ public function isRaw(): bool;
* Gets the options that are passable to the `setcookie` variant
* available on PHP 7.3+
*
- * @return array
+ * @return array
*/
public function getOptions(): array;
@@ -162,7 +162,7 @@ public function __toString();
/**
* Returns the array representation of the Cookie object.
*
- * @return array
+ * @return array
*/
public function toArray(): array;
}
diff --git a/system/Database/BaseBuilder.php b/system/Database/BaseBuilder.php
index a8577f8..fab6e30 100644
--- a/system/Database/BaseBuilder.php
+++ b/system/Database/BaseBuilder.php
@@ -761,9 +761,9 @@ protected function whereHaving(string $qbKey, $key, $value = null, string $type
$k = trim($k);
end($op);
-
$op = trim(current($op));
+ // Does the key end with operator?
if (substr($k, -strlen($op)) === $op) {
$k = rtrim(substr($k, 0, -strlen($op)));
$op = " {$op}";
@@ -783,7 +783,15 @@ protected function whereHaving(string $qbKey, $key, $value = null, string $type
} elseif (! $this->hasOperator($k) && $qbKey !== 'QBHaving') {
// value appears not to have been set, assign the test to IS NULL
$op = ' IS NULL';
- } elseif (preg_match('/\s*(!?=|<>|IS(?:\s+NOT)?)\s*$/i', $k, $match, PREG_OFFSET_CAPTURE)) {
+ } elseif (
+ // The key ends with !=, =, <>, IS, IS NOT
+ preg_match(
+ '/\s*(!?=|<>|IS(?:\s+NOT)?)\s*$/i',
+ $k,
+ $match,
+ PREG_OFFSET_CAPTURE
+ )
+ ) {
$k = substr($k, 0, $match[0][1]);
$op = $match[1][0] === '=' ? ' IS NULL' : ' IS NOT NULL';
} else {
@@ -2013,9 +2021,9 @@ private function setAlias(string $alias): BaseBuilder
/**
* Sets update fields for upsert, update
*
- * @param string|string[] $set
- * @param bool $addToDefault adds update fields to the default ones
- * @param array|null $ignore ignores items in set
+ * @param RawSql[]|string|string[] $set
+ * @param bool $addToDefault adds update fields to the default ones
+ * @param array|null $ignore ignores items in set
*
* @return $this
*/
@@ -3074,6 +3082,10 @@ protected function compileWhereHaving(string $qbKey): string
continue;
}
+ if ($qbkey instanceof RawSql) {
+ continue;
+ }
+
if ($qbkey['condition'] instanceof RawSql) {
$qbkey = $qbkey['condition'];
@@ -3377,16 +3389,16 @@ protected function getOperator(string $str, bool $list = false)
: '';
$this->pregOperators = [
'\s*(?:<|>|!)?=\s*', // =, <=, >=, !=
- '\s*<>?\s*', // <, <>
- '\s*>\s*', // >
- '\s+IS NULL', // IS NULL
- '\s+IS NOT NULL', // IS NOT NULL
- '\s+EXISTS\s*\(.*\)', // EXISTS(sql)
+ '\s*<>?\s*', // <, <>
+ '\s*>\s*', // >
+ '\s+IS NULL', // IS NULL
+ '\s+IS NOT NULL', // IS NOT NULL
+ '\s+EXISTS\s*\(.*\)', // EXISTS (sql)
'\s+NOT EXISTS\s*\(.*\)', // NOT EXISTS(sql)
- '\s+BETWEEN\s+', // BETWEEN value AND value
- '\s+IN\s*\(.*\)', // IN(list)
- '\s+NOT IN\s*\(.*\)', // NOT IN (list)
- '\s+LIKE\s+\S.*(' . $_les . ')?', // LIKE 'expr'[ ESCAPE '%s']
+ '\s+BETWEEN\s+', // BETWEEN value AND value
+ '\s+IN\s*\(.*\)', // IN (list)
+ '\s+NOT IN\s*\(.*\)', // NOT IN (list)
+ '\s+LIKE\s+\S.*(' . $_les . ')?', // LIKE 'expr'[ ESCAPE '%s']
'\s+NOT LIKE\s+\S.*(' . $_les . ')?', // NOT LIKE 'expr'[ ESCAPE '%s']
];
}
@@ -3409,13 +3421,18 @@ private function getOperatorFromWhereKey(string $whereKey)
$whereKey = trim($whereKey);
$pregOperators = [
- '\s*(?:<|>|!)?=', // =, <=, >=, !=
- '\s*<>?', // <, <>
- '\s*>', // >
- '\s+IS NULL', // IS NULL
- '\s+IS NOT NULL', // IS NOT NULL
- '\s+LIKE', // LIKE
- '\s+NOT LIKE', // NOT LIKE
+ '\s*(?:<|>|!)?=', // =, <=, >=, !=
+ '\s*<>?', // <, <>
+ '\s*>', // >
+ '\s+IS NULL', // IS NULL
+ '\s+IS NOT NULL', // IS NOT NULL
+ '\s+EXISTS\s*\(.*\)', // EXISTS (sql)
+ '\s+NOT EXISTS\s*\(.*\)', // NOT EXISTS (sql)
+ '\s+BETWEEN\s+', // BETWEEN value AND value
+ '\s+IN\s*\(.*\)', // IN (list)
+ '\s+NOT IN\s*\(.*\)', // NOT IN (list)
+ '\s+LIKE', // LIKE
+ '\s+NOT LIKE', // NOT LIKE
];
return preg_match_all(
diff --git a/system/Database/BaseConnection.php b/system/Database/BaseConnection.php
index badd34d..670dd04 100644
--- a/system/Database/BaseConnection.php
+++ b/system/Database/BaseConnection.php
@@ -46,8 +46,8 @@
* @property bool $transFailure
* @property bool $transStatus
*
- * @template TConnection of object|resource
- * @template TResult of object|resource
+ * @template TConnection
+ * @template TResult
*
* @implements ConnectionInterface
*/
@@ -456,7 +456,8 @@ abstract protected function _close();
/**
* Create a persistent database connection.
*
- * @return mixed
+ * @return false|object|resource
+ * @phpstan-return false|TConnection
*/
public function persistentConnect()
{
@@ -558,7 +559,7 @@ abstract protected function execute(string $sql);
* Should automatically handle different connections for read/write
* queries if needed.
*
- * @param mixed ...$binds
+ * @param array|string|null $binds
*
* @return BaseResult|bool|Query BaseResult when “read” type query, bool when “write” type query, Query when prepared query
* @phpstan-return BaseResult|bool|Query
@@ -1747,7 +1748,7 @@ protected function _enableForeignKeyChecks()
/**
* Accessor for properties if they exist.
*
- * @return mixed
+ * @return array|bool|float|int|object|resource|string|null
*/
public function __get(string $key)
{
diff --git a/system/Database/BasePreparedQuery.php b/system/Database/BasePreparedQuery.php
index 3253562..bfc0a60 100644
--- a/system/Database/BasePreparedQuery.php
+++ b/system/Database/BasePreparedQuery.php
@@ -18,9 +18,9 @@
use ErrorException;
/**
- * @template TConnection of object|resource
- * @template TStatement of object|resource
- * @template TResult of object|resource
+ * @template TConnection
+ * @template TStatement
+ * @template TResult
*
* @implements PreparedQueryInterface
*/
diff --git a/system/Database/BaseResult.php b/system/Database/BaseResult.php
index 511c4f9..c5f603a 100644
--- a/system/Database/BaseResult.php
+++ b/system/Database/BaseResult.php
@@ -12,10 +12,11 @@
namespace CodeIgniter\Database;
use CodeIgniter\Entity\Entity;
+use stdClass;
/**
- * @template TConnection of object|resource
- * @template TResult of object|resource
+ * @template TConnection
+ * @template TResult
*
* @implements ResultInterface
*/
@@ -116,7 +117,9 @@ public function getResult(string $type = 'object'): array
/**
* Returns the results as an array of custom objects.
*
- * @return mixed
+ * @phpstan-param class-string $className
+ *
+ * @return array
*/
public function getCustomResultObject(string $className)
{
@@ -205,6 +208,9 @@ public function getResultArray(): array
* Returns the results as an array of objects.
*
* If no results, an empty array is returned.
+ *
+ * @return array
+ * @phpstan-return list
*/
public function getResultObject(): array
{
@@ -248,10 +254,11 @@ public function getResultObject(): array
*
* If row doesn't exist, returns null.
*
- * @param mixed $n The index of the results to return
+ * @param int $n The index of the results to return
* @param string $type The type of result object. 'array', 'object' or class name.
*
- * @return mixed
+ * @return array|object|stdClass|null
+ * @phpstan-return ($type is 'object' ? stdClass|null : ($type is 'array' ? array|null : object|null))
*/
public function getRow($n = 0, string $type = 'object')
{
@@ -285,7 +292,7 @@ public function getRow($n = 0, string $type = 'object')
*
* If row doesn't exists, returns null.
*
- * @return mixed
+ * @return array|null
*/
public function getCustomRowObject(int $n, string $className)
{
@@ -309,7 +316,7 @@ public function getCustomRowObject(int $n, string $className)
*
* If row doesn't exist, returns null.
*
- * @return mixed
+ * @return array|null
*/
public function getRowArray(int $n = 0)
{
@@ -330,7 +337,7 @@ public function getRowArray(int $n = 0)
*
* If row doesn't exist, returns null.
*
- * @return mixed
+ * @return object|stdClass|null
*/
public function getRowObject(int $n = 0)
{
@@ -349,10 +356,10 @@ public function getRowObject(int $n = 0)
/**
* Assigns an item into a particular column slot.
*
- * @param mixed $key
- * @param mixed $value
+ * @param array|string $key
+ * @param array|object|stdClass|null $value
*
- * @return mixed
+ * @return void
*/
public function setRow($key, $value = null)
{
@@ -377,7 +384,7 @@ public function setRow($key, $value = null)
/**
* Returns the "first" row of the current results.
*
- * @return mixed
+ * @return array|object|null
*/
public function getFirstRow(string $type = 'object')
{
@@ -389,7 +396,7 @@ public function getFirstRow(string $type = 'object')
/**
* Returns the "last" row of the current results.
*
- * @return mixed
+ * @return array|object|null
*/
public function getLastRow(string $type = 'object')
{
@@ -401,7 +408,7 @@ public function getLastRow(string $type = 'object')
/**
* Returns the "next" row of the current results.
*
- * @return mixed
+ * @return array|object|null
*/
public function getNextRow(string $type = 'object')
{
@@ -416,7 +423,7 @@ public function getNextRow(string $type = 'object')
/**
* Returns the "previous" row of the current results.
*
- * @return mixed
+ * @return array|object|null
*/
public function getPreviousRow(string $type = 'object')
{
@@ -435,7 +442,7 @@ public function getPreviousRow(string $type = 'object')
/**
* Returns an unbuffered row and move the pointer to the next row.
*
- * @return mixed
+ * @return array|object|null
*/
public function getUnbufferedRow(string $type = 'object')
{
@@ -492,6 +499,8 @@ abstract public function getFieldData(): array;
/**
* Frees the current result.
+ *
+ * @return void
*/
abstract public function freeResult();
@@ -500,7 +509,7 @@ abstract public function freeResult();
* internally before fetching results to make sure the result set
* starts at zero.
*
- * @return mixed
+ * @return bool
*/
abstract public function dataSeek(int $n = 0);
@@ -509,7 +518,7 @@ abstract public function dataSeek(int $n = 0);
*
* Overridden by driver classes.
*
- * @return mixed
+ * @return array|false|null
*/
abstract protected function fetchAssoc();
@@ -518,7 +527,7 @@ abstract protected function fetchAssoc();
*
* Overridden by child classes.
*
- * @return object
+ * @return Entity|false|object|stdClass
*/
abstract protected function fetchObject(string $className = 'stdClass');
}
diff --git a/system/Database/ConnectionInterface.php b/system/Database/ConnectionInterface.php
index 7cbae20..85125eb 100644
--- a/system/Database/ConnectionInterface.php
+++ b/system/Database/ConnectionInterface.php
@@ -12,8 +12,8 @@
namespace CodeIgniter\Database;
/**
- * @template TConnection of object|resource
- * @template TResult of object|resource
+ * @template TConnection
+ * @template TResult
*/
interface ConnectionInterface
{
@@ -62,7 +62,7 @@ public function getConnection(?string $alias = null);
/**
* Select a specific database table to use.
*
- * @return mixed
+ * @return bool
*/
public function setDatabase(string $databaseName);
@@ -98,7 +98,7 @@ public function getVersion(): string;
* Should automatically handle different connections for read/write
* queries if needed.
*
- * @param mixed ...$binds
+ * @param array|string|null $binds
*
* @return BaseResult|bool|Query
* @phpstan-return BaseResult|bool|Query
@@ -127,7 +127,7 @@ public function table($tableName);
/**
* Returns the last query's statement object.
*
- * @return mixed
+ * @return Query
*/
public function getLastQuery();
@@ -150,7 +150,7 @@ public function escape($str);
*
* @param array ...$params
*
- * @return mixed
+ * @return array|bool|float|int|object|resource|string|null
*/
public function callFunction(string $functionName, ...$params);
diff --git a/system/Database/Forge.php b/system/Database/Forge.php
index a33deb3..f83a9ac 100644
--- a/system/Database/Forge.php
+++ b/system/Database/Forge.php
@@ -153,7 +153,7 @@ class Forge
*
* @internal Used for marking nullable fields. Not covered by BC promise.
*/
- protected $null = '';
+ protected $null = 'NULL';
/**
* DEFAULT value representation in CREATE/ALTER TABLE statements
@@ -562,7 +562,7 @@ public function createTable(string $table, bool $ifNotExists = false, array $att
}
/**
- * @return string
+ * @return string SQL string
*
* @deprecated $ifNotExists is no longer used, and will be removed.
*/
@@ -897,13 +897,19 @@ protected function _processFields(bool $createTable = false): array
$this->_attributeDefault($attributes, $field);
if (isset($attributes['NULL'])) {
+ $nullString = ' ' . $this->null;
+
if ($attributes['NULL'] === true) {
- $field['null'] = empty($this->null) ? '' : ' ' . $this->null;
+ $field['null'] = empty($this->null) ? '' : $nullString;
+ } elseif ($attributes['NULL'] === $nullString) {
+ $field['null'] = $nullString;
+ } elseif ($attributes['NULL'] === '') {
+ $field['null'] = '';
} else {
- $field['null'] = ' NOT NULL';
+ $field['null'] = ' NOT ' . $this->null;
}
} elseif ($createTable === true) {
- $field['null'] = ' NOT NULL';
+ $field['null'] = ' NOT ' . $this->null;
}
$this->_attributeAutoIncrement($attributes, $field);
diff --git a/system/Database/MySQLi/Result.php b/system/Database/MySQLi/Result.php
index 550fc0a..afe2348 100644
--- a/system/Database/MySQLi/Result.php
+++ b/system/Database/MySQLi/Result.php
@@ -103,6 +103,8 @@ public function getFieldData(): array
/**
* Frees the current result.
+ *
+ * @return void
*/
public function freeResult()
{
@@ -117,7 +119,7 @@ public function freeResult()
* internally before fetching results to make sure the result set
* starts at zero.
*
- * @return mixed
+ * @return bool
*/
public function dataSeek(int $n = 0)
{
@@ -129,7 +131,7 @@ public function dataSeek(int $n = 0)
*
* Overridden by driver classes.
*
- * @return mixed
+ * @return array|false|null
*/
protected function fetchAssoc()
{
@@ -141,7 +143,7 @@ protected function fetchAssoc()
*
* Overridden by child classes.
*
- * @return bool|Entity|object
+ * @return Entity|false|object|stdClass
*/
protected function fetchObject(string $className = 'stdClass')
{
diff --git a/system/Database/OCI8/Forge.php b/system/Database/OCI8/Forge.php
index 514cf99..31b2058 100644
--- a/system/Database/OCI8/Forge.php
+++ b/system/Database/OCI8/Forge.php
@@ -120,10 +120,17 @@ protected function _alterTable(string $alterType, string $table, $field)
// If a null constraint is added to a column with a null constraint,
// ORA-01451 will occur,
// so add null constraint is used only when it is different from the current null constraint.
- $isWantToAddNull = strpos($field[$i]['null'], ' NOT') === false;
- $currentNullAddable = $nullableMap[$field[$i]['name']];
+ // If a not null constraint is added to a column with a not null constraint,
+ // ORA-01442 will occur.
+ $wantToAddNull = strpos($field[$i]['null'], ' NOT') === false;
+ $currentNullable = $nullableMap[$field[$i]['name']];
- if ($isWantToAddNull === $currentNullAddable) {
+ if ($wantToAddNull === true && $currentNullable === true) {
+ $field[$i]['null'] = '';
+ } elseif ($field[$i]['null'] === '' && $currentNullable === false) {
+ // Nullable by default
+ $field[$i]['null'] = ' NULL';
+ } elseif ($wantToAddNull === false && $currentNullable === false) {
$field[$i]['null'] = '';
}
}
diff --git a/system/Database/OCI8/Result.php b/system/Database/OCI8/Result.php
index cb192de..63682e2 100644
--- a/system/Database/OCI8/Result.php
+++ b/system/Database/OCI8/Result.php
@@ -13,6 +13,7 @@
use CodeIgniter\Database\BaseResult;
use CodeIgniter\Entity\Entity;
+use stdClass;
/**
* Result for OCI8
@@ -80,7 +81,7 @@ public function dataSeek(int $n = 0)
*
* Overridden by driver classes.
*
- * @return mixed
+ * @return array|false
*/
protected function fetchAssoc()
{
@@ -92,7 +93,7 @@ protected function fetchAssoc()
*
* Overridden by child classes.
*
- * @return bool|Entity|object
+ * @return Entity|false|object|stdClass
*/
protected function fetchObject(string $className = 'stdClass')
{
diff --git a/system/Database/Postgre/Connection.php b/system/Database/Postgre/Connection.php
index 4e4fd3b..8e96128 100644
--- a/system/Database/Postgre/Connection.php
+++ b/system/Database/Postgre/Connection.php
@@ -128,11 +128,16 @@ public function getVersion(): string
return $this->dataCache['version'];
}
- if (! $this->connID || ($pgVersion = pg_version($this->connID)) === false) {
+ if (! $this->connID) {
$this->initialize();
}
- return isset($pgVersion['server']) ? $this->dataCache['version'] = $pgVersion['server'] : false;
+ $pgVersion = pg_version($this->connID);
+ $this->dataCache['version'] = isset($pgVersion['server']) ?
+ (preg_match('/^(\d+\.\d+)/', $pgVersion['server'], $matches) ? $matches[1] : '') :
+ '';
+
+ return $this->dataCache['version'];
}
/**
@@ -533,7 +538,7 @@ protected function _transRollback(): bool
*
* Overrides BaseConnection::isWriteType, adding additional read query types.
*
- * @param mixed $sql
+ * @param string $sql
*/
public function isWriteType($sql): bool
{
diff --git a/system/Database/Postgre/Forge.php b/system/Database/Postgre/Forge.php
index 662fbe6..47be1b0 100644
--- a/system/Database/Postgre/Forge.php
+++ b/system/Database/Postgre/Forge.php
@@ -109,10 +109,12 @@ protected function _alterTable(string $alterType, string $table, $field)
. " SET DEFAULT {$data['default']}";
}
- if (isset($data['null'])) {
- $sqls[] = $sql . ' ALTER COLUMN ' . $this->db->escapeIdentifiers($data['name'])
- . ($data['null'] === true ? ' DROP' : ' SET') . ' NOT NULL';
+ $nullable = true; // Nullable by default.
+ if (isset($data['null']) && ($data['null'] === false || $data['null'] === ' NOT ' . $this->null)) {
+ $nullable = false;
}
+ $sqls[] = $sql . ' ALTER COLUMN ' . $this->db->escapeIdentifiers($data['name'])
+ . ($nullable === true ? ' DROP' : ' SET') . ' NOT NULL';
if (! empty($data['new_name'])) {
$sqls[] = $sql . ' RENAME COLUMN ' . $this->db->escapeIdentifiers($data['name'])
diff --git a/system/Database/Postgre/Result.php b/system/Database/Postgre/Result.php
index c3fce41..84ee151 100644
--- a/system/Database/Postgre/Result.php
+++ b/system/Database/Postgre/Result.php
@@ -69,6 +69,8 @@ public function getFieldData(): array
/**
* Frees the current result.
+ *
+ * @return void
*/
public function freeResult()
{
@@ -83,7 +85,7 @@ public function freeResult()
* internally before fetching results to make sure the result set
* starts at zero.
*
- * @return mixed
+ * @return bool
*/
public function dataSeek(int $n = 0)
{
@@ -95,7 +97,7 @@ public function dataSeek(int $n = 0)
*
* Overridden by driver classes.
*
- * @return mixed
+ * @return array|false
*/
protected function fetchAssoc()
{
@@ -107,7 +109,7 @@ protected function fetchAssoc()
*
* Overridden by child classes.
*
- * @return bool|Entity|object
+ * @return Entity|false|object|stdClass
*/
protected function fetchObject(string $className = 'stdClass')
{
diff --git a/system/Database/PreparedQueryInterface.php b/system/Database/PreparedQueryInterface.php
index 7dbd985..7b55991 100644
--- a/system/Database/PreparedQueryInterface.php
+++ b/system/Database/PreparedQueryInterface.php
@@ -14,9 +14,9 @@
use BadMethodCallException;
/**
- * @template TConnection of object|resource
- * @template TStatement of object|resource
- * @template TResult of object|resource
+ * @template TConnection
+ * @template TStatement
+ * @template TResult
*/
interface PreparedQueryInterface
{
diff --git a/system/Database/ResultInterface.php b/system/Database/ResultInterface.php
index bb1a5d6..c959a7c 100644
--- a/system/Database/ResultInterface.php
+++ b/system/Database/ResultInterface.php
@@ -11,9 +11,11 @@
namespace CodeIgniter\Database;
+use stdClass;
+
/**
- * @template TConnection of object|resource
- * @template TResult of object|resource
+ * @template TConnection
+ * @template TResult
*/
interface ResultInterface
{
@@ -31,7 +33,7 @@ public function getResult(string $type = 'object'): array;
*
* @param string $className The name of the class to use.
*
- * @return mixed
+ * @return array
*/
public function getCustomResultObject(string $className);
@@ -55,10 +57,11 @@ public function getResultObject(): array;
*
* If row doesn't exist, returns null.
*
- * @param mixed $n The index of the results to return
+ * @param int $n The index of the results to return
* @param string $type The type of result object. 'array', 'object' or class name.
*
- * @return mixed
+ * @return array|object|stdClass|null
+ * @phpstan-return ($type is 'object' ? stdClass|null : ($type is 'array' ? array|null : object|null))
*/
public function getRow($n = 0, string $type = 'object');
@@ -67,7 +70,7 @@ public function getRow($n = 0, string $type = 'object');
*
* If row doesn't exists, returns null.
*
- * @return mixed
+ * @return array|null
*/
public function getCustomRowObject(int $n, string $className);
@@ -76,7 +79,7 @@ public function getCustomRowObject(int $n, string $className);
*
* If row doesn't exist, returns null.
*
- * @return mixed
+ * @return array|null
*/
public function getRowArray(int $n = 0);
@@ -85,45 +88,45 @@ public function getRowArray(int $n = 0);
*
* If row doesn't exist, returns null.
*
- * @return mixed
+ * @return object|stdClass|null
*/
public function getRowObject(int $n = 0);
/**
* Assigns an item into a particular column slot.
*
- * @param string $key
- * @param mixed $value
+ * @param array|string $key
+ * @param array|object|stdClass|null $value
*
- * @return mixed
+ * @return void
*/
public function setRow($key, $value = null);
/**
* Returns the "first" row of the current results.
*
- * @return mixed
+ * @return array|object|null
*/
public function getFirstRow(string $type = 'object');
/**
* Returns the "last" row of the current results.
*
- * @return mixed
+ * @return array|object|null
*/
public function getLastRow(string $type = 'object');
/**
* Returns the "next" row of the current results.
*
- * @return mixed
+ * @return array|object|null
*/
public function getNextRow(string $type = 'object');
/**
* Returns the "previous" row of the current results.
*
- * @return mixed
+ * @return array|object|null
*/
public function getPreviousRow(string $type = 'object');
@@ -135,7 +138,7 @@ public function getNumRows(): int;
/**
* Returns an unbuffered row and move the pointer to the next row.
*
- * @return mixed
+ * @return array|object|null
*/
public function getUnbufferedRow(string $type = 'object');
@@ -164,7 +167,7 @@ public function freeResult();
* internally before fetching results to make sure the result set
* starts at zero.
*
- * @return mixed
+ * @return bool
*/
public function dataSeek(int $n = 0);
}
diff --git a/system/Database/SQLSRV/Connection.php b/system/Database/SQLSRV/Connection.php
index 5d9b208..4e0ca98 100644
--- a/system/Database/SQLSRV/Connection.php
+++ b/system/Database/SQLSRV/Connection.php
@@ -44,7 +44,7 @@ class Connection extends BaseConnection
* FALSE or SQLSRV_CURSOR_FORWARD would increase performance,
* but would disable num_rows() (and possibly insert_id())
*
- * @var mixed
+ * @var false|string
*/
public $scrollable;
@@ -436,7 +436,7 @@ public function affectedRows(): int
/**
* Select a specific database table to use.
*
- * @return mixed
+ * @return bool
*/
public function setDatabase(?string $databaseName = null)
{
@@ -485,7 +485,7 @@ protected function execute(string $sql)
/**
* Returns the last error encountered by this connection.
*
- * @return mixed
+ * @return array
*
* @deprecated Use `error()` instead.
*/
@@ -546,7 +546,7 @@ public function getVersion(): string
*
* Overrides BaseConnection::isWriteType, adding additional read query types.
*
- * @param mixed $sql
+ * @param string $sql
*/
public function isWriteType($sql): bool
{
diff --git a/system/Database/SQLSRV/Forge.php b/system/Database/SQLSRV/Forge.php
index 8d7a720..e446247 100644
--- a/system/Database/SQLSRV/Forge.php
+++ b/system/Database/SQLSRV/Forge.php
@@ -203,10 +203,12 @@ protected function _alterTable(string $alterType, string $table, $field)
. " DEFAULT {$data['default']} FOR " . $this->db->escapeIdentifiers($data['name']);
}
- if (isset($data['null'])) {
- $sqls[] = $sql . ' ALTER COLUMN ' . $this->db->escapeIdentifiers($data['name'])
- . ($data['null'] === true ? ' DROP' : '') . " {$data['type']}{$data['length']} NOT NULL";
+ $nullable = true; // Nullable by default.
+ if (isset($data['null']) && ($data['null'] === false || $data['null'] === ' NOT ' . $this->null)) {
+ $nullable = false;
}
+ $sqls[] = $sql . ' ALTER COLUMN ' . $this->db->escapeIdentifiers($data['name'])
+ . " {$data['type']}{$data['length']} " . ($nullable === true ? '' : 'NOT') . ' NULL';
if (! empty($data['comment'])) {
$sqls[] = 'EXEC sys.sp_addextendedproperty '
diff --git a/system/Database/SQLSRV/Result.php b/system/Database/SQLSRV/Result.php
index 6e172d8..ea1117d 100644
--- a/system/Database/SQLSRV/Result.php
+++ b/system/Database/SQLSRV/Result.php
@@ -103,6 +103,8 @@ public function getFieldData(): array
/**
* Frees the current result.
+ *
+ * @return void
*/
public function freeResult()
{
@@ -117,7 +119,7 @@ public function freeResult()
* internally before fetching results to make sure the result set
* starts at zero.
*
- * @return mixed
+ * @return bool
*/
public function dataSeek(int $n = 0)
{
@@ -137,7 +139,7 @@ public function dataSeek(int $n = 0)
*
* Overridden by driver classes.
*
- * @return mixed
+ * @return array|false|null
*/
protected function fetchAssoc()
{
@@ -147,7 +149,7 @@ protected function fetchAssoc()
/**
* Returns the result set as an object.
*
- * @return bool|Entity|object
+ * @return Entity|false|object|stdClass
*/
protected function fetchObject(string $className = 'stdClass')
{
diff --git a/system/Database/SQLite3/Result.php b/system/Database/SQLite3/Result.php
index 0599446..b2175d9 100644
--- a/system/Database/SQLite3/Result.php
+++ b/system/Database/SQLite3/Result.php
@@ -80,6 +80,8 @@ public function getFieldData(): array
/**
* Frees the current result.
+ *
+ * @return void
*/
public function freeResult()
{
@@ -94,7 +96,7 @@ public function freeResult()
* internally before fetching results to make sure the result set
* starts at zero.
*
- * @return mixed
+ * @return bool
*
* @throws DatabaseException
*/
@@ -112,7 +114,7 @@ public function dataSeek(int $n = 0)
*
* Overridden by driver classes.
*
- * @return mixed
+ * @return array|false
*/
protected function fetchAssoc()
{
@@ -124,7 +126,7 @@ protected function fetchAssoc()
*
* Overridden by child classes.
*
- * @return bool|object
+ * @return Entity|false|object|stdClass
*/
protected function fetchObject(string $className = 'stdClass')
{
diff --git a/system/Database/SQLite3/Table.php b/system/Database/SQLite3/Table.php
index e0367f1..4ed9b51 100644
--- a/system/Database/SQLite3/Table.php
+++ b/system/Database/SQLite3/Table.php
@@ -183,14 +183,14 @@ public function dropColumn($columns)
*
* @return Table
*/
- public function modifyColumn(array $field)
+ public function modifyColumn(array $fields)
{
- $field = $field[0];
-
- $oldName = $field['name'];
- unset($field['name']);
+ foreach ($fields as $field) {
+ $oldName = $field['name'];
+ unset($field['name']);
- $this->fields[$oldName] = $field;
+ $this->fields[$oldName] = $field;
+ }
return $this;
}
diff --git a/system/Debug/Exceptions.php b/system/Debug/Exceptions.php
index bcce589..531e95f 100644
--- a/system/Debug/Exceptions.php
+++ b/system/Debug/Exceptions.php
@@ -68,6 +68,8 @@ class Exceptions
*/
protected $response;
+ private ?Throwable $exceptionCaughtByExceptionHandler = null;
+
/**
* @param CLIRequest|IncomingRequest $request
*/
@@ -113,8 +115,15 @@ public function initialize()
*/
public function exceptionHandler(Throwable $exception)
{
+ $this->exceptionCaughtByExceptionHandler = $exception;
+
[$statusCode, $exitCode] = $this->determineCodes($exception);
+ // Get the first exception.
+ while ($prevException = $exception->getPrevious()) {
+ $exception = $prevException;
+ }
+
if ($this->config->log === true && ! in_array($statusCode, $this->config->ignoreCodes, true)) {
log_message('critical', "{message}\nin {exFile} on line {exLine}.\n{trace}", [
'message' => $exception->getMessage(),
@@ -191,6 +200,13 @@ public function shutdownHandler()
['type' => $type, 'message' => $message, 'file' => $file, 'line' => $line] = $error;
+ if ($this->exceptionCaughtByExceptionHandler) {
+ $message .= "\n【Previous Exception】\n"
+ . get_class($this->exceptionCaughtByExceptionHandler) . "\n"
+ . $this->exceptionCaughtByExceptionHandler->getMessage() . "\n"
+ . $this->exceptionCaughtByExceptionHandler->getTraceAsString();
+ }
+
if (in_array($type, [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE], true)) {
$this->exceptionHandler(new ErrorException($message, 0, $type, $file, $line));
}
@@ -520,9 +536,6 @@ private static function renderBacktrace(array $backtrace): string
case is_resource($value):
return sprintf('resource (%s)', get_resource_type($value));
- case is_string($value):
- return var_export(clean_path($value), true);
-
default:
return var_export($value, true);
}
diff --git a/system/Debug/Toolbar/Collectors/Events.php b/system/Debug/Toolbar/Collectors/Events.php
index a8a7e7a..178a886 100644
--- a/system/Debug/Toolbar/Collectors/Events.php
+++ b/system/Debug/Toolbar/Collectors/Events.php
@@ -11,11 +11,8 @@
namespace CodeIgniter\Debug\Toolbar\Collectors;
-use CodeIgniter\View\RendererInterface;
-use Config\Services;
-
/**
- * Views collector
+ * Events collector
*/
class Events extends BaseCollector
{
@@ -25,7 +22,7 @@ class Events extends BaseCollector
*
* @var bool
*/
- protected $hasTimeline = false;
+ protected $hasTimeline = true;
/**
* Whether this collector needs to display
@@ -51,21 +48,6 @@ class Events extends BaseCollector
*/
protected $title = 'Events';
- /**
- * Instance of the Renderer service
- *
- * @var RendererInterface
- */
- protected $viewer;
-
- /**
- * Constructor.
- */
- public function __construct()
- {
- $this->viewer = Services::renderer();
- }
-
/**
* Child classes should implement this to return the timeline data
* formatted for correct usage.
@@ -74,12 +56,12 @@ protected function formatTimelineData(): array
{
$data = [];
- $rows = $this->viewer->getPerformanceData();
+ $rows = \CodeIgniter\Events\Events::getPerformanceLogs();
foreach ($rows as $info) {
$data[] = [
- 'name' => 'View: ' . $info['view'],
- 'component' => 'Views',
+ 'name' => 'Event: ' . $info['event'],
+ 'component' => 'Events',
'start' => $info['start'],
'duration' => $info['end'] - $info['start'],
];
diff --git a/system/Debug/Toolbar/Collectors/Views.php b/system/Debug/Toolbar/Collectors/Views.php
index fae3385..ea44dae 100644
--- a/system/Debug/Toolbar/Collectors/Views.php
+++ b/system/Debug/Toolbar/Collectors/Views.php
@@ -60,9 +60,9 @@ class Views extends BaseCollector
protected $title = 'Views';
/**
- * Instance of the Renderer service
+ * Instance of the shared Renderer service
*
- * @var RendererInterface
+ * @var RendererInterface|null
*/
protected $viewer;
@@ -73,12 +73,9 @@ class Views extends BaseCollector
*/
protected $views = [];
- /**
- * Constructor.
- */
- public function __construct()
+ private function initViewer(): void
{
- $this->viewer = Services::renderer();
+ $this->viewer ??= Services::renderer();
}
/**
@@ -87,6 +84,8 @@ public function __construct()
*/
protected function formatTimelineData(): array
{
+ $this->initViewer();
+
$data = [];
$rows = $this->viewer->getPerformanceData();
@@ -121,8 +120,9 @@ protected function formatTimelineData(): array
*/
public function getVarData(): array
{
- return [
+ $this->initViewer();
+ return [
'View Data' => $this->viewer->getData(),
];
}
@@ -132,6 +132,8 @@ public function getVarData(): array
*/
public function getBadgeValue(): int
{
+ $this->initViewer();
+
return count($this->viewer->getPerformanceData());
}
diff --git a/system/Email/Email.php b/system/Email/Email.php
index 488a5ee..fe68ff2 100644
--- a/system/Email/Email.php
+++ b/system/Email/Email.php
@@ -1883,7 +1883,10 @@ protected function SMTPConnect()
$crypto = stream_socket_enable_crypto(
$this->SMTPConnect,
true,
- STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
+ STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT
+ | STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
+ | STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
+ | STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT
);
if ($crypto !== true) {
diff --git a/system/Entity/Entity.php b/system/Entity/Entity.php
index 92cedef..4247c82 100644
--- a/system/Entity/Entity.php
+++ b/system/Entity/Entity.php
@@ -259,19 +259,19 @@ public function hasChanged(?string $key = null): bool
return $this->original !== $this->attributes;
}
- $key = $this->mapProperty($key);
+ $dbColumn = $this->mapProperty($key);
// Key doesn't exist in either
- if (! array_key_exists($key, $this->original) && ! array_key_exists($key, $this->attributes)) {
+ if (! array_key_exists($dbColumn, $this->original) && ! array_key_exists($dbColumn, $this->attributes)) {
return false;
}
// It's a new element
- if (! array_key_exists($key, $this->original) && array_key_exists($key, $this->attributes)) {
+ if (! array_key_exists($dbColumn, $this->original) && array_key_exists($dbColumn, $this->attributes)) {
return true;
}
- return $this->original[$key] !== $this->attributes[$key];
+ return $this->original[$dbColumn] !== $this->attributes[$dbColumn];
}
/**
@@ -435,19 +435,19 @@ public function cast(?bool $cast = null)
*/
public function __set(string $key, $value = null)
{
- $key = $this->mapProperty($key);
+ $dbColumn = $this->mapProperty($key);
// Check if the field should be mutated into a date
- if (in_array($key, $this->dates, true)) {
+ if (in_array($dbColumn, $this->dates, true)) {
$value = $this->mutateDate($value);
}
- $value = $this->castAs($value, $key, 'set');
+ $value = $this->castAs($value, $dbColumn, 'set');
// if a set* method exists for this key, use that method to
// insert this value. should be outside $isNullable check,
// so maybe wants to do sth with null value automatically
- $method = 'set' . str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $key)));
+ $method = 'set' . str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $dbColumn)));
if (method_exists($this, $method)) {
$this->{$method}($value);
@@ -459,7 +459,7 @@ public function __set(string $key, $value = null)
// class properties that are undefined, though they cannot be
// saved. Useful for grabbing values through joins, assigning
// relationships, etc.
- $this->attributes[$key] = $value;
+ $this->attributes[$dbColumn] = $value;
return $this;
}
@@ -480,12 +480,12 @@ public function __set(string $key, $value = null)
*/
public function __get(string $key)
{
- $key = $this->mapProperty($key);
+ $dbColumn = $this->mapProperty($key);
$result = null;
// Convert to CamelCase for the method
- $method = 'get' . str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $key)));
+ $method = 'get' . str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $dbColumn)));
// if a get* method exists for this key,
// use that method to insert this value.
@@ -495,17 +495,17 @@ public function __get(string $key)
// Otherwise return the protected property
// if it exists.
- elseif (array_key_exists($key, $this->attributes)) {
- $result = $this->attributes[$key];
+ elseif (array_key_exists($dbColumn, $this->attributes)) {
+ $result = $this->attributes[$dbColumn];
}
// Do we need to mutate this into a date?
- if (in_array($key, $this->dates, true)) {
+ if (in_array($dbColumn, $this->dates, true)) {
$result = $this->mutateDate($result);
}
// Or cast it as something?
elseif ($this->_cast) {
- $result = $this->castAs($result, $key);
+ $result = $this->castAs($result, $dbColumn);
}
return $result;
@@ -521,15 +521,15 @@ public function __isset(string $key): bool
return false;
}
- $key = $this->mapProperty($key);
+ $dbColumn = $this->mapProperty($key);
- $method = 'get' . str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $key)));
+ $method = 'get' . str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $dbColumn)));
if (method_exists($this, $method)) {
return true;
}
- return isset($this->attributes[$key]);
+ return isset($this->attributes[$dbColumn]);
}
/**
@@ -541,9 +541,9 @@ public function __unset(string $key): void
return;
}
- $key = $this->mapProperty($key);
+ $dbColumn = $this->mapProperty($key);
- unset($this->attributes[$key]);
+ unset($this->attributes[$dbColumn]);
}
/**
@@ -551,10 +551,10 @@ public function __unset(string $key): void
*/
protected function isMappedDbColumn(string $key): bool
{
- $maybeColumnName = $this->mapProperty($key);
+ $dbColumn = $this->mapProperty($key);
- // Property name which has mapped column name
- if ($key !== $maybeColumnName) {
+ // The $key is a property name which has mapped db column name
+ if ($key !== $dbColumn) {
return false;
}
diff --git a/system/Filters/FilterInterface.php b/system/Filters/FilterInterface.php
index 32a18de..8055d11 100644
--- a/system/Filters/FilterInterface.php
+++ b/system/Filters/FilterInterface.php
@@ -29,7 +29,7 @@ interface FilterInterface
* sent back to the client, allowing for error pages,
* redirects, etc.
*
- * @param null $arguments
+ * @param array|null $arguments
*
* @return mixed
*/
@@ -41,7 +41,7 @@ public function before(RequestInterface $request, $arguments = null);
* to stop execution of other after filters, short of
* throwing an Exception or Error.
*
- * @param null $arguments
+ * @param array|null $arguments
*
* @return mixed
*/
diff --git a/system/Filters/Filters.php b/system/Filters/Filters.php
index 30e36a3..c022d7d 100644
--- a/system/Filters/Filters.php
+++ b/system/Filters/Filters.php
@@ -375,7 +375,7 @@ public function enableFilters(array $names, string $when = 'before')
/**
* Returns the arguments for a specified key, or all.
*
- * @return mixed
+ * @return array|string
*/
public function getArguments(?string $key = null)
{
diff --git a/system/Format/JSONFormatter.php b/system/Format/JSONFormatter.php
index 7933351..b4a8082 100644
--- a/system/Format/JSONFormatter.php
+++ b/system/Format/JSONFormatter.php
@@ -22,7 +22,7 @@ class JSONFormatter implements FormatterInterface
/**
* Takes the given data and formats it.
*
- * @param mixed $data
+ * @param array|bool|float|int|object|string|null $data
*
* @return false|string (JSON string | false)
*/
diff --git a/system/Format/XMLFormatter.php b/system/Format/XMLFormatter.php
index 2a18e38..322ac32 100644
--- a/system/Format/XMLFormatter.php
+++ b/system/Format/XMLFormatter.php
@@ -23,7 +23,7 @@ class XMLFormatter implements FormatterInterface
/**
* Takes the given data and formats it.
*
- * @param mixed $data
+ * @param array|bool|float|int|object|string|null $data
*
* @return false|string (XML string | false)
*/
diff --git a/system/HTTP/CURLRequest.php b/system/HTTP/CURLRequest.php
index f8d9a73..1f467a5 100644
--- a/system/HTTP/CURLRequest.php
+++ b/system/HTTP/CURLRequest.php
@@ -28,6 +28,13 @@ class CURLRequest extends OutgoingRequest
*/
protected $response;
+ /**
+ * The original response object associated with this request
+ *
+ * @var ResponseInterface|null
+ */
+ protected $responseOrig;
+
/**
* The URI associated with this request
*
@@ -105,7 +112,7 @@ public function __construct(App $config, URI $uri, ?ResponseInterface $response
parent::__construct('GET', $uri);
- $this->response = $response;
+ $this->responseOrig = $response ?? new Response(config('App'));
$this->baseURI = $uri->useRawQueryString();
$this->defaultOptions = $options;
@@ -125,6 +132,8 @@ public function __construct(App $config, URI $uri, ?ResponseInterface $response
*/
public function request($method, string $url, array $options = []): ResponseInterface
{
+ $this->response = clone $this->responseOrig;
+
$this->parseOptions($options);
$url = $this->prepareURL($url);
diff --git a/system/HTTP/DownloadResponse.php b/system/HTTP/DownloadResponse.php
index 899bec8..d5824da 100644
--- a/system/HTTP/DownloadResponse.php
+++ b/system/HTTP/DownloadResponse.php
@@ -227,9 +227,8 @@ public function setContentType(string $mime, string $charset = 'UTF-8')
*/
public function noCache(): self
{
- $this->removeHeader('Cache-control');
-
- $this->setHeader('Cache-control', ['private', 'no-transform', 'no-store', 'must-revalidate']);
+ $this->removeHeader('Cache-Control');
+ $this->setHeader('Cache-Control', ['private', 'no-transform', 'no-store', 'must-revalidate']);
return $this;
}
diff --git a/system/HTTP/IncomingRequest.php b/system/HTTP/IncomingRequest.php
index 3304f46..29529fd 100644
--- a/system/HTTP/IncomingRequest.php
+++ b/system/HTTP/IncomingRequest.php
@@ -329,7 +329,7 @@ protected function parseQueryString(): string
$uri = $_SERVER['QUERY_STRING'] ?? @getenv('QUERY_STRING');
if (trim($uri, '/') === '') {
- return '';
+ return '/';
}
if (strncmp($uri, '/', 1) === 0) {
@@ -443,7 +443,7 @@ public function isSecure(): bool
* instance, this can be used to change the "current URL"
* for testing.
*
- * @param string $path URI path relative to SCRIPT_NAME
+ * @param string $path URI path relative to baseURL
* @param App|null $config Optional alternate config to use
*
* @return $this
@@ -451,6 +451,9 @@ public function isSecure(): bool
public function setPath(string $path, ?App $config = null)
{
$this->path = $path;
+
+ // @TODO remove this. The path of the URI object should be a full URI path,
+ // not a URI path relative to baseURL.
$this->uri->setPath($path);
$config ??= $this->config;
@@ -481,8 +484,11 @@ public function setPath(string $path, ?App $config = null)
$this->uri->setScheme('https');
}
} elseif (! is_cli()) {
+ // Do not change exit() to exception; Request is initialized before
+ // setting the exception handler, so if an exception is raised, an
+ // error will be displayed even if in the production environment.
// @codeCoverageIgnoreStart
- exit('You have an empty or invalid base URL. The baseURL value must be set in Config\App.php, or through the .env file.');
+ exit('You have an empty or invalid baseURL. The baseURL value must be set in app/Config/App.php, or through the .env file.');
// @codeCoverageIgnoreEnd
}
@@ -566,7 +572,7 @@ public function getDefaultLocale(): string
*
* @param array|string|null $index
* @param int|null $filter Filter constant
- * @param mixed $flags
+ * @param array|int|null $flags
*
* @return array|bool|float|int|stdClass|string|null
*/
@@ -701,7 +707,7 @@ public function getRawInput()
* @param int|null $filter Filter Constant
* @param array|int|null $flags Option
*
- * @return mixed
+ * @return array|bool|float|int|object|string|null
*/
public function getRawInputVar($index = null, ?int $filter = null, $flags = null)
{
@@ -753,9 +759,9 @@ public function getRawInputVar($index = null, ?int $filter = null, $flags = null
*
* @param array|string|null $index Index for item to fetch from $_GET.
* @param int|null $filter A filter name to apply.
- * @param mixed|null $flags
+ * @param array|int|null $flags
*
- * @return mixed
+ * @return array|bool|float|int|object|string|null
*/
public function getGet($index = null, $filter = null, $flags = null)
{
@@ -767,9 +773,9 @@ public function getGet($index = null, $filter = null, $flags = null)
*
* @param array|string|null $index Index for item to fetch from $_POST.
* @param int|null $filter A filter name to apply
- * @param mixed $flags
+ * @param array|int|null $flags
*
- * @return mixed
+ * @return array|bool|float|int|object|string|null
*/
public function getPost($index = null, $filter = null, $flags = null)
{
@@ -781,9 +787,9 @@ public function getPost($index = null, $filter = null, $flags = null)
*
* @param array|string|null $index Index for item to fetch from $_POST or $_GET
* @param int|null $filter A filter name to apply
- * @param mixed $flags
+ * @param array|int|null $flags
*
- * @return mixed
+ * @return array|bool|float|int|object|string|null
*/
public function getPostGet($index = null, $filter = null, $flags = null)
{
@@ -803,9 +809,9 @@ public function getPostGet($index = null, $filter = null, $flags = null)
*
* @param array|string|null $index Index for item to be fetched from $_GET or $_POST
* @param int|null $filter A filter name to apply
- * @param mixed $flags
+ * @param array|int|null $flags
*
- * @return mixed
+ * @return array|bool|float|int|object|string|null
*/
public function getGetPost($index = null, $filter = null, $flags = null)
{
@@ -825,9 +831,9 @@ public function getGetPost($index = null, $filter = null, $flags = null)
*
* @param array|string|null $index Index for item to be fetched from $_COOKIE
* @param int|null $filter A filter name to be applied
- * @param mixed $flags
+ * @param array|int|null $flags
*
- * @return mixed
+ * @return array|bool|float|int|object|string|null
*/
public function getCookie($index = null, $filter = null, $flags = null)
{
diff --git a/system/HTTP/RedirectResponse.php b/system/HTTP/RedirectResponse.php
index 34f950d..1c0e354 100644
--- a/system/HTTP/RedirectResponse.php
+++ b/system/HTTP/RedirectResponse.php
@@ -24,7 +24,7 @@ class RedirectResponse extends Response
* Sets the URI to redirect to and, optionally, the HTTP status code to use.
* If no code is provided it will be automatically determined.
*
- * @param string $uri The URI to redirect to
+ * @param string $uri The URI path (relative to baseURL) to redirect to
* @param int|null $code HTTP status code
*
* @return $this
@@ -44,13 +44,13 @@ public function to(string $uri, ?int $code = null, string $method = 'auto')
* Sets the URI to redirect to but as a reverse-routed or named route
* instead of a raw URI.
*
- * @param string $route Named route or Controller::method
+ * @param string $route Route name or Controller::method
*
* @return $this
*
* @throws HTTPException
*/
- public function route(string $route, array $params = [], int $code = 302, string $method = 'auto')
+ public function route(string $route, array $params = [], ?int $code = null, string $method = 'auto')
{
$namedRoute = $route;
diff --git a/system/HTTP/RequestInterface.php b/system/HTTP/RequestInterface.php
index fd2cdfb..367c494 100644
--- a/system/HTTP/RequestInterface.php
+++ b/system/HTTP/RequestInterface.php
@@ -40,8 +40,8 @@ public function isValidIP(string $ip, ?string $which = null): bool;
* Fetch an item from the $_SERVER array.
* Supplied by RequestTrait.
*
- * @param string $index Index for item to be fetched from $_SERVER
- * @param null $filter A filter name to be applied
+ * @param array|string|null $index Index for item to be fetched from $_SERVER
+ * @param int|null $filter A filter name to be applied
*
* @return mixed
*/
diff --git a/system/HTTP/RequestTrait.php b/system/HTTP/RequestTrait.php
index 5dc0359..418da59 100644
--- a/system/HTTP/RequestTrait.php
+++ b/system/HTTP/RequestTrait.php
@@ -192,7 +192,7 @@ private function getClientIP(string $header): ?string
*
* @param array|string|null $index Index for item to be fetched from $_SERVER
* @param int|null $filter A filter name to be applied
- * @param null $flags
+ * @param array|int|null $flags
*
* @return mixed
*/
@@ -204,9 +204,9 @@ public function getServer($index = null, $filter = null, $flags = null)
/**
* Fetch an item from the $_ENV array.
*
- * @param null $index Index for item to be fetched from $_ENV
- * @param null $filter A filter name to be applied
- * @param null $flags
+ * @param array|string|null $index Index for item to be fetched from $_ENV
+ * @param int|null $filter A filter name to be applied
+ * @param array|int|null $flags
*
* @return mixed
*/
@@ -244,7 +244,7 @@ public function setGlobal(string $method, $value)
* @param int|null $filter Filter constant
* @param array|int|null $flags Options
*
- * @return array|bool|string|null
+ * @return array|bool|float|int|object|string|null
*/
public function fetchGlobal(string $method, $index = null, ?int $filter = null, $flags = null)
{
diff --git a/system/HTTP/ResponseTrait.php b/system/HTTP/ResponseTrait.php
index 0ad3239..133d1b1 100644
--- a/system/HTTP/ResponseTrait.php
+++ b/system/HTTP/ResponseTrait.php
@@ -30,8 +30,6 @@
* Additional methods to make a PSR-7 Response class
* compliant with the framework's own ResponseInterface.
*
- * @property array $statusCodes
- *
* @see https://github.com/php-fig/http-message/blob/master/src/ResponseInterface.php
*/
trait ResponseTrait
@@ -345,8 +343,8 @@ protected function formatBody($body, string $format)
*/
public function noCache()
{
- $this->removeHeader('Cache-control');
- $this->setHeader('Cache-control', ['no-store', 'max-age=0', 'no-cache']);
+ $this->removeHeader('Cache-Control');
+ $this->setHeader('Cache-Control', ['no-store', 'max-age=0', 'no-cache']);
return $this;
}
@@ -399,7 +397,7 @@ public function setCache(array $options = [])
unset($options['last-modified']);
}
- $this->setHeader('Cache-control', $options);
+ $this->setHeader('Cache-Control', $options);
return $this;
}
@@ -496,8 +494,8 @@ public function sendBody()
/**
* Perform a redirect to a new URL, in two flavors: header or location.
*
- * @param string $uri The URI to redirect to
- * @param int $code The type of redirection, defaults to 302
+ * @param string $uri The URI to redirect to
+ * @param int|null $code The type of redirection, defaults to 302
*
* @return $this
*
@@ -505,20 +503,32 @@ public function sendBody()
*/
public function redirect(string $uri, string $method = 'auto', ?int $code = null)
{
- // Assume 302 status code response; override if needed
- if (empty($code)) {
- $code = 302;
- }
-
// IIS environment likely? Use 'refresh' for better compatibility
- if ($method === 'auto' && isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') !== false) {
+ if (
+ $method === 'auto'
+ && isset($_SERVER['SERVER_SOFTWARE'])
+ && strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') !== false
+ ) {
$method = 'refresh';
+ } elseif ($method !== 'refresh' && $code === null) {
+ // override status code for HTTP/1.1 & higher
+ if (
+ isset($_SERVER['SERVER_PROTOCOL'], $_SERVER['REQUEST_METHOD'])
+ && $this->getProtocolVersion() >= 1.1
+ ) {
+ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
+ $code = 302;
+ } elseif (in_array($_SERVER['REQUEST_METHOD'], ['POST', 'PUT', 'DELETE'], true)) {
+ // reference: https://en.wikipedia.org/wiki/Post/Redirect/Get
+ $code = 303;
+ } else {
+ $code = 307;
+ }
+ }
}
- // override status code for HTTP/1.1 & higher
- // reference: http://en.wikipedia.org/wiki/Post/Redirect/Get
- if (isset($_SERVER['SERVER_PROTOCOL'], $_SERVER['REQUEST_METHOD']) && $this->getProtocolVersion() >= 1.1 && $method !== 'refresh') {
- $code = ($_SERVER['REQUEST_METHOD'] !== 'GET') ? 303 : ($code === 302 ? 307 : $code);
+ if ($code === null) {
+ $code = 302;
}
switch ($method) {
diff --git a/system/HTTP/URI.php b/system/HTTP/URI.php
index 9af28b3..587e441 100644
--- a/system/HTTP/URI.php
+++ b/system/HTTP/URI.php
@@ -148,11 +148,9 @@ class URI
/**
* Builds a representation of the string from the component parts.
*
- * @param string|null $scheme URI scheme. E.g., http, ftp
- * @param string $authority
- * @param string $path
- * @param string $query
- * @param string $fragment
+ * @param string|null $scheme URI scheme. E.g., http, ftp
+ *
+ * @return string URI string with only passed parts. Maybe incomplete as a URI.
*/
public static function createURIString(
?string $scheme = null,
diff --git a/system/Helpers/form_helper.php b/system/Helpers/form_helper.php
index 57d3f38..dfd4a64 100644
--- a/system/Helpers/form_helper.php
+++ b/system/Helpers/form_helper.php
@@ -741,9 +741,12 @@ function validation_show_error(string $field, string $template = 'single'): stri
$config = config('Validation');
$view = Services::renderer();
- $errors = validation_errors();
+ $errors = array_filter(validation_errors(), static fn ($key) => preg_match(
+ '/^' . str_replace(['\.\*', '\*\.'], ['\..+', '.+\.'], preg_quote($field, '/')) . '$/',
+ $key
+ ), ARRAY_FILTER_USE_KEY);
- if (! array_key_exists($field, $errors)) {
+ if ($errors === []) {
return '';
}
@@ -751,7 +754,7 @@ function validation_show_error(string $field, string $template = 'single'): stri
throw ValidationException::forInvalidTemplate($template);
}
- return $view->setVar('error', $errors[$field])
+ return $view->setVar('error', implode("\n", $errors))
->render($config->templates[$template]);
}
}
diff --git a/system/Helpers/text_helper.php b/system/Helpers/text_helper.php
index 51b2c7d..2343a89 100644
--- a/system/Helpers/text_helper.php
+++ b/system/Helpers/text_helper.php
@@ -538,12 +538,13 @@ function reduce_multiples(string $str, string $character = ',', bool $trim = fal
*
* @param string $type Type of random string. basic, alpha, alnum, numeric, nozero, md5, sha1, and crypto
* @param int $len Number of characters
+ *
+ * @deprecated The type 'basic', 'md5', and 'sha1' are deprecated. They are not cryptographically secure.
*/
function random_string(string $type = 'alnum', int $len = 8): string
{
switch ($type) {
case 'alnum':
- case 'numeric':
case 'nozero':
case 'alpha':
switch ($type) {
@@ -555,16 +556,18 @@ function random_string(string $type = 'alnum', int $len = 8): string
$pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
break;
- case 'numeric':
- $pool = '0123456789';
- break;
-
case 'nozero':
$pool = '123456789';
break;
}
- return substr(str_shuffle(str_repeat($pool, (int) ceil($len / strlen($pool)))), 0, $len);
+ return _from_random($len, $pool);
+
+ case 'numeric':
+ $max = 10 ** $len - 1;
+ $rand = random_int(0, $max);
+
+ return sprintf('%0' . $len . 'd', $rand);
case 'md5':
return md5(uniqid((string) mt_rand(), true));
@@ -586,6 +589,69 @@ function random_string(string $type = 'alnum', int $len = 8): string
}
}
+if (! function_exists('_from_random')) {
+ /**
+ * The following function was derived from code of Symfony (v6.2.7 - 2023-02-28)
+ * https://github.com/symfony/symfony/blob/80cac46a31d4561804c17d101591a4f59e6db3a2/src/Symfony/Component/String/ByteString.php#L45
+ * Code subject to the MIT license (https://github.com/symfony/symfony/blob/v6.2.7/LICENSE).
+ * Copyright (c) 2004-present Fabien Potencier
+ *
+ * The following method was derived from code of the Hack Standard Library (v4.40 - 2020-05-03)
+ * https://github.com/hhvm/hsl/blob/80a42c02f036f72a42f0415e80d6b847f4bf62d5/src/random/private.php#L16
+ * Code subject to the MIT license (https://github.com/hhvm/hsl/blob/master/LICENSE).
+ * Copyright (c) 2004-2020, Facebook, Inc. (https://www.facebook.com/)
+ *
+ * @internal Outside the framework this should not be used directly.
+ */
+ function _from_random(int $length, string $pool): string
+ {
+ if ($length <= 0) {
+ throw new InvalidArgumentException(
+ sprintf('A strictly positive length is expected, "%d" given.', $length)
+ );
+ }
+
+ $poolSize = \strlen($pool);
+ $bits = (int) ceil(log($poolSize, 2.0));
+ if ($bits <= 0 || $bits > 56) {
+ throw new InvalidArgumentException(
+ 'The length of the alphabet must in the [2^1, 2^56] range.'
+ );
+ }
+
+ $string = '';
+
+ while ($length > 0) {
+ $urandomLength = (int) ceil(2 * $length * $bits / 8.0);
+ $data = random_bytes($urandomLength);
+ $unpackedData = 0;
+ $unpackedBits = 0;
+
+ for ($i = 0; $i < $urandomLength && $length > 0; $i++) {
+ // Unpack 8 bits
+ $unpackedData = ($unpackedData << 8) | \ord($data[$i]);
+ $unpackedBits += 8;
+
+ // While we have enough bits to select a character from the alphabet, keep
+ // consuming the random data
+ for (; $unpackedBits >= $bits && $length > 0; $unpackedBits -= $bits) {
+ $index = ($unpackedData & ((1 << $bits) - 1));
+ $unpackedData >>= $bits;
+ // Unfortunately, the alphabet size is not necessarily a power of two.
+ // Worst case, it is 2^k + 1, which means we need (k+1) bits and we
+ // have around a 50% chance of missing as k gets larger
+ if ($index < $poolSize) {
+ $string .= $pool[$index];
+ $length--;
+ }
+ }
+ }
+ }
+
+ return $string;
+ }
+}
+
if (! function_exists('increment_string')) {
/**
* Add's _1 to a string or increment the ending number to allow _2, _3, etc
diff --git a/system/Helpers/url_helper.php b/system/Helpers/url_helper.php
index 1a3b78d..8443c7a 100644
--- a/system/Helpers/url_helper.php
+++ b/system/Helpers/url_helper.php
@@ -26,17 +26,34 @@
*
* @internal Outside the framework this should not be used directly.
*
- * @param string $relativePath May include queries or fragments
+ * @param array|string $relativePath URI string or array of URI segments.
+ * May include queries or fragments.
+ * @param App|null $config Alternative Config to use
*
* @throws HTTPException For invalid paths.
* @throws InvalidArgumentException For invalid config.
*/
- function _get_uri(string $relativePath = '', ?App $config = null): URI
+ function _get_uri($relativePath = '', ?App $config = null): URI
{
- $config ??= config('App');
+ $appConfig = null;
+ if ($config === null) {
+ /** @var App $appConfig */
+ $appConfig = config('App');
+
+ if ($appConfig->baseURL === '') {
+ throw new InvalidArgumentException(
+ '_get_uri() requires a valid baseURL.'
+ );
+ }
+ } elseif ($config->baseURL === '') {
+ throw new InvalidArgumentException(
+ '_get_uri() requires a valid baseURL.'
+ );
+ }
- if ($config->baseURL === '') {
- throw new InvalidArgumentException('_get_uri() requires a valid baseURL.');
+ // Convert array of segments to a string
+ if (is_array($relativePath)) {
+ $relativePath = implode('/', $relativePath);
}
// If a full URI was passed then convert it
@@ -53,27 +70,31 @@ function _get_uri(string $relativePath = '', ?App $config = null): URI
$relativePath = URI::removeDotSegments($relativePath);
- // Build the full URL based on $config and $relativePath
$request = Services::request();
- /** @var App $config */
- $url = $request instanceof CLIRequest
- ? rtrim($config->baseURL, '/ ') . '/'
- : $request->getUri()->getBaseURL();
+ if ($config === null) {
+ $baseURL = $request instanceof CLIRequest
+ ? rtrim($appConfig->baseURL, '/ ') . '/'
+ // Use the current baseURL for multiple domain support
+ : $request->getUri()->getBaseURL();
+
+ $config = $appConfig;
+ } else {
+ $baseURL = rtrim($config->baseURL, '/ ') . '/';
+ }
// Check for an index page
+ $indexPage = '';
if ($config->indexPage !== '') {
- $url .= $config->indexPage;
+ $indexPage = $config->indexPage;
// Check if we need a separator
if ($relativePath !== '' && $relativePath[0] !== '/' && $relativePath[0] !== '?') {
- $url .= '/';
+ $indexPage .= '/';
}
}
- $url .= $relativePath;
-
- $uri = new URI($url);
+ $uri = new URI($baseURL . $indexPage . $relativePath);
// Check if the baseURL scheme needs to be coerced into its secure version
if ($config->forceGlobalSecureRequests && $uri->getScheme() === 'http') {
@@ -94,20 +115,22 @@ function _get_uri(string $relativePath = '', ?App $config = null): URI
*/
function site_url($relativePath = '', ?string $scheme = null, ?App $config = null): string
{
- // Convert array of segments to a string
- if (is_array($relativePath)) {
- $relativePath = implode('/', $relativePath);
- }
-
$uri = _get_uri($relativePath, $config);
- return URI::createURIString(
+ $uriString = URI::createURIString(
$scheme ?? $uri->getScheme(),
$uri->getAuthority(),
$uri->getPath(),
$uri->getQuery(),
$uri->getFragment()
);
+
+ // For protocol-relative links
+ if ($scheme === '') {
+ $uriString = '//' . $uriString;
+ }
+
+ return $uriString;
}
}
@@ -121,37 +144,47 @@ function site_url($relativePath = '', ?string $scheme = null, ?App $config = nul
*/
function base_url($relativePath = '', ?string $scheme = null): string
{
- $config = clone config('App');
+ /** @var App $config */
+ $config = clone config('App');
+
+ // Use the current baseURL for multiple domain support
+ $request = Services::request();
+ $config->baseURL = $request instanceof CLIRequest
+ ? rtrim($config->baseURL, '/ ') . '/'
+ : $request->getUri()->getBaseURL();
+
$config->indexPage = '';
- return rtrim(site_url($relativePath, $scheme, $config), '/');
+ return site_url($relativePath, $scheme, $config);
}
}
if (! function_exists('current_url')) {
/**
* Returns the current full URL based on the Config\App settings and IncomingRequest.
- * String returns ignore query and fragment parts.
*
* @param bool $returnObject True to return an object instead of a string
* @param IncomingRequest|null $request A request to use when retrieving the path
*
- * @return string|URI
+ * @return string|URI When returning string, the query and fragment parts are removed.
+ * When returning URI, the query and fragment parts are preserved.
*/
function current_url(bool $returnObject = false, ?IncomingRequest $request = null)
{
$request ??= Services::request();
- $path = $request->getPath();
+ /** @var CLIRequest|IncomingRequest $request */
+ $routePath = $request->getPath();
+ $currentURI = $request->getUri();
// Append queries and fragments
- if ($query = $request->getUri()->getQuery()) {
- $path .= '?' . $query;
+ if ($query = $currentURI->getQuery()) {
+ $query = '?' . $query;
}
- if ($fragment = $request->getUri()->getFragment()) {
- $path .= '#' . $fragment;
+ if ($fragment = $currentURI->getFragment()) {
+ $fragment = '#' . $fragment;
}
- $uri = _get_uri($path);
+ $uri = _get_uri($routePath . $query . $fragment);
return $returnObject ? $uri : URI::createURIString($uri->getScheme(), $uri->getAuthority(), $uri->getPath());
}
diff --git a/system/I18n/TimeDifference.php b/system/I18n/TimeDifference.php
index 2fcd09b..4b0e1aa 100644
--- a/system/I18n/TimeDifference.php
+++ b/system/I18n/TimeDifference.php
@@ -271,7 +271,7 @@ public function humanize(?string $locale = null): string
*
* @param string $name
*
- * @return mixed
+ * @return float|int|null
*/
public function __get($name)
{
diff --git a/system/Model.php b/system/Model.php
index de646c6..2df1bb2 100644
--- a/system/Model.php
+++ b/system/Model.php
@@ -43,6 +43,7 @@
* @method $this groupBy($by, ?bool $escape = null)
* @method $this groupEnd()
* @method $this groupStart()
+ * @method $this having($key, $value = null, ?bool $escape = null)
* @method $this havingGroupEnd()
* @method $this havingGroupStart()
* @method $this havingIn(?string $key = null, $values = null, ?bool $escape = null)
diff --git a/system/Router/RouteCollection.php b/system/Router/RouteCollection.php
index 08741be..50b7361 100644
--- a/system/Router/RouteCollection.php
+++ b/system/Router/RouteCollection.php
@@ -722,7 +722,7 @@ public function group(string $name, ...$params)
* POST /photos/{id} update
*
* @param string $name The name of the resource/controller to route to.
- * @param array|null $options An list of possible ways to customize the routing.
+ * @param array|null $options A list of possible ways to customize the routing.
*/
public function resource(string $name, ?array $options = null): RouteCollectionInterface
{
@@ -816,7 +816,7 @@ public function resource(string $name, ?array $options = null): RouteCollectionI
* POST /photos/delete/{id} delete deleting the specified photo object
*
* @param string $name The name of the controller to route to.
- * @param array|null $options An list of possible ways to customize the routing.
+ * @param array|null $options A list of possible ways to customize the routing.
*/
public function presenter(string $name, ?array $options = null): RouteCollectionInterface
{
@@ -1043,7 +1043,7 @@ public function environment(string $env, Closure $callback): RouteCollectionInte
* // Equals 'path/$param1/$param2'
* reverseRoute('Controller::method', $param1, $param2);
*
- * @param string $search Named route or Controller::method
+ * @param string $search Route name or Controller::method
* @param int|string ...$params One or more parameters to be passed to the route.
* The last parameter allows you to set the locale.
*
@@ -1316,13 +1316,12 @@ protected function create(string $verb, string $from, $to, ?array $options = nul
// Hostname limiting?
if (! empty($options['hostname'])) {
// @todo determine if there's a way to whitelist hosts?
- if (isset($this->httpHost) && strtolower($this->httpHost) !== strtolower($options['hostname'])) {
+ if (! $this->checkHostname($options['hostname'])) {
return;
}
$overwrite = true;
}
-
// Limiting to subdomains?
elseif (! empty($options['subdomain'])) {
// If we don't match the current subdomain, then
@@ -1395,6 +1394,22 @@ protected function create(string $verb, string $from, $to, ?array $options = nul
}
}
+ /**
+ * Compares the hostname passed in against the current hostname
+ * on this page request.
+ *
+ * @param string $hostname Hostname in route options
+ */
+ private function checkHostname($hostname): bool
+ {
+ // CLI calls can't be on hostname.
+ if (! isset($this->httpHost)) {
+ return false;
+ }
+
+ return strtolower($this->httpHost) === strtolower($hostname);
+ }
+
private function processArrayCallableSyntax(string $from, array $to): string
{
// [classname, method]
@@ -1467,7 +1482,7 @@ private function checkSubdomains($subdomains): bool
}
/**
- * Examines the HTTP_HOST to get a best match for the subdomain. It
+ * Examines the HTTP_HOST to get the best match for the subdomain. It
* won't be perfect, but should work for our needs.
*
* It's especially not perfect since it's possible to register a domain
@@ -1577,41 +1592,52 @@ public function setPrioritize(bool $enabled = true)
* Get all controllers in Route Handlers
*
* @param string|null $verb HTTP verb. `'*'` returns all controllers in any verb.
+ *
+ * @return array controller name list
+ * @phpstan-return list
*/
public function getRegisteredControllers(?string $verb = '*'): array
{
- $routes = [];
+ $controllers = [];
if ($verb === '*') {
- $rawRoutes = [];
-
foreach ($this->defaultHTTPMethods as $tmpVerb) {
- $rawRoutes = array_merge($rawRoutes, $this->routes[$tmpVerb]);
- }
-
- foreach ($rawRoutes as $route) {
- $key = key($route['route']);
- $handler = $route['route'][$key];
-
- $routes[$key] = $handler;
+ foreach ($this->routes[$tmpVerb] as $route) {
+ $routeKey = key($route['route']);
+ $controller = $this->getControllerName($route['route'][$routeKey]);
+ if ($controller !== null) {
+ $controllers[] = $controller;
+ }
+ }
}
} else {
$routes = $this->getRoutes($verb);
- }
- $controllers = [];
-
- foreach ($routes as $handler) {
- if (! is_string($handler)) {
- continue;
+ foreach ($routes as $handler) {
+ $controller = $this->getControllerName($handler);
+ if ($controller !== null) {
+ $controllers[] = $controller;
+ }
}
+ }
- [$controller] = explode('::', $handler, 2);
+ return array_unique($controllers);
+ }
- $controllers[] = $controller;
+ /**
+ * @param Closure|string $handler Handler
+ *
+ * @return string|null Controller classname
+ */
+ private function getControllerName($handler)
+ {
+ if (! is_string($handler)) {
+ return null;
}
- return array_unique($controllers);
+ [$controller] = explode('::', $handler, 2);
+
+ return $controller;
}
/**
diff --git a/system/Router/RouteCollectionInterface.php b/system/Router/RouteCollectionInterface.php
index 00ac88f..701e893 100644
--- a/system/Router/RouteCollectionInterface.php
+++ b/system/Router/RouteCollectionInterface.php
@@ -21,7 +21,7 @@
* add a number of additional methods to customize how the routes are defined.
*
* The RouteCollection provides the Router with the routes so that it can determine
- * which controller should be ran.
+ * which controller should be run.
*/
interface RouteCollectionInterface
{
@@ -31,7 +31,7 @@ interface RouteCollectionInterface
* @param array|Closure|string $to
* @param array $options
*
- * @return mixed
+ * @return RouteCollectionInterface
*/
public function add(string $from, $to, ?array $options = null);
@@ -46,7 +46,7 @@ public function add(string $from, $to, ?array $options = null);
* @param array|string $placeholder
* @param string $pattern
*
- * @return mixed
+ * @return RouteCollectionInterface
*/
public function addPlaceholder($placeholder, ?string $pattern = null);
@@ -54,7 +54,7 @@ public function addPlaceholder($placeholder, ?string $pattern = null);
* Sets the default namespace to use for Controllers when no other
* namespace has been specified.
*
- * @return mixed
+ * @return RouteCollectionInterface
*/
public function setDefaultNamespace(string $value);
@@ -62,7 +62,7 @@ public function setDefaultNamespace(string $value);
* Sets the default controller to use when no other controller has been
* specified.
*
- * @return mixed
+ * @return RouteCollectionInterface
*/
public function setDefaultController(string $value);
@@ -70,7 +70,7 @@ public function setDefaultController(string $value);
* Sets the default method to call on the controller when no other
* method has been set in the route.
*
- * @return mixed
+ * @return RouteCollectionInterface
*/
public function setDefaultMethod(string $value);
@@ -81,7 +81,7 @@ public function setDefaultMethod(string $value);
* find words and meaning in the URI for better SEO. But it
* doesn't work well with PHP method names....
*
- * @return mixed
+ * @return RouteCollectionInterface
*/
public function setTranslateURIDashes(bool $value);
@@ -157,7 +157,7 @@ public function getRoutes();
public function getHTTPVerb();
/**
- * Attempts to look up a route based on it's destination.
+ * Attempts to look up a route based on its destination.
*
* If a route exists:
*
diff --git a/system/Router/Router.php b/system/Router/Router.php
index 83cb6b8..8dd35c6 100644
--- a/system/Router/Router.php
+++ b/system/Router/Router.php
@@ -155,6 +155,10 @@ public function __construct(RouteCollectionInterface $routes, ?Request $request
}
/**
+ * Finds the controller method corresponding to the URI.
+ *
+ * @param string|null $uri URI path relative to baseURL
+ *
* @return Closure|string Controller classname or Closure
*
* @throws PageNotFoundException
@@ -162,12 +166,9 @@ public function __construct(RouteCollectionInterface $routes, ?Request $request
*/
public function handle(?string $uri = null)
{
- // If we cannot find a URI to match against, then
- // everything runs off of its default settings.
+ // If we cannot find a URI to match against, then set it to root (`/`).
if ($uri === null || $uri === '') {
- return strpos($this->controller, '\\') === false
- ? $this->collection->getDefaultNamespace() . $this->controller
- : $this->controller;
+ $uri = '/';
}
// Decode URL-encoded string
@@ -324,7 +325,7 @@ public function getMatchedRouteOptions()
/**
* Sets the value that should be used to match the index.php file. Defaults
- * to index.php but this allows you to modify it in case your are using
+ * to index.php but this allows you to modify it in case you are using
* something like mod_rewrite to remove the page. This allows you to set
* it a blank.
*
@@ -376,7 +377,7 @@ public function getLocale()
}
/**
- * Checks Defined Routs.
+ * Checks Defined Routes.
*
* Compares the uri string against the routes that the
* RouteCollection class defined for us, attempting to find a match.
@@ -495,7 +496,7 @@ protected function checkRoutes(string $uri): bool
}
/**
- * Checks Auto Routs.
+ * Checks Auto Routes.
*
* Attempts to match a URI path against Controllers and directories
* found in APPPATH/Controllers, to find a matching route.
diff --git a/system/Router/RouterInterface.php b/system/Router/RouterInterface.php
index 1efeb2e..ffed59c 100644
--- a/system/Router/RouterInterface.php
+++ b/system/Router/RouterInterface.php
@@ -27,7 +27,7 @@ public function __construct(RouteCollectionInterface $routes, ?Request $request
/**
* Finds the controller method corresponding to the URI.
*
- * @param string $uri
+ * @param string|null $uri URI path relative to baseURL
*
* @return Closure|string Controller classname or Closure
*/
diff --git a/system/Security/Security.php b/system/Security/Security.php
index 422e589..2391567 100644
--- a/system/Security/Security.php
+++ b/system/Security/Security.php
@@ -342,20 +342,23 @@ private function getPostedToken(RequestInterface $request): ?string
assert($request instanceof IncomingRequest);
// Does the token exist in POST, HEADER or optionally php:://input - json data.
+
+ if ($tokenValue = $request->getPost($this->tokenName)) {
+ return $tokenValue;
+ }
+
if ($request->hasHeader($this->headerName) && ! empty($request->header($this->headerName)->getValue())) {
- $tokenName = $request->header($this->headerName)->getValue();
- } else {
- $body = (string) $request->getBody();
- $json = json_decode($body);
+ return $request->header($this->headerName)->getValue();
+ }
- if ($body !== '' && ! empty($json) && json_last_error() === JSON_ERROR_NONE) {
- $tokenName = $json->{$this->tokenName} ?? null;
- } else {
- $tokenName = null;
- }
+ $body = (string) $request->getBody();
+ $json = json_decode($body);
+
+ if ($body !== '' && ! empty($json) && json_last_error() === JSON_ERROR_NONE) {
+ return $json->{$this->tokenName} ?? null;
}
- return $request->getPost($this->tokenName) ?? $tokenName;
+ return null;
}
/**
diff --git a/system/Session/Handlers/BaseHandler.php b/system/Session/Handlers/BaseHandler.php
index f7d6ff1..f392c49 100644
--- a/system/Session/Handlers/BaseHandler.php
+++ b/system/Session/Handlers/BaseHandler.php
@@ -34,7 +34,7 @@ abstract class BaseHandler implements SessionHandlerInterface
/**
* Lock placeholder.
*
- * @var mixed
+ * @var bool|string
*/
protected $lock = false;
diff --git a/system/Session/Handlers/Database/PostgreHandler.php b/system/Session/Handlers/Database/PostgreHandler.php
index 2b730d8..963aa27 100644
--- a/system/Session/Handlers/Database/PostgreHandler.php
+++ b/system/Session/Handlers/Database/PostgreHandler.php
@@ -31,7 +31,7 @@ protected function setSelect(BaseBuilder $builder)
/**
* Decodes column data
*
- * @param mixed $data
+ * @param string $data
*
* @return false|string
*/
diff --git a/system/Session/Handlers/DatabaseHandler.php b/system/Session/Handlers/DatabaseHandler.php
index 42be98e..b566a3b 100644
--- a/system/Session/Handlers/DatabaseHandler.php
+++ b/system/Session/Handlers/DatabaseHandler.php
@@ -172,7 +172,7 @@ protected function setSelect(BaseBuilder $builder)
/**
* Decodes column data
*
- * @param mixed $data
+ * @param string $data
*
* @return false|string
*/
diff --git a/system/Session/Handlers/RedisHandler.php b/system/Session/Handlers/RedisHandler.php
index 4492c4d..9910637 100644
--- a/system/Session/Handlers/RedisHandler.php
+++ b/system/Session/Handlers/RedisHandler.php
@@ -24,7 +24,8 @@
*/
class RedisHandler extends BaseHandler
{
- private const DEFAULT_PORT = 6379;
+ private const DEFAULT_PORT = 6379;
+ private const DEFAULT_PROTOCOL = 'tcp';
/**
* phpRedis instance
@@ -102,20 +103,21 @@ protected function setSavePath(): void
throw SessionException::forEmptySavepath();
}
- if (preg_match('#(?:tcp://)?([^:?]+)(?:\:(\d+))?(\?.+)?#', $this->savePath, $matches)) {
- if (! isset($matches[3])) {
- $matches[3] = ''; // Just to avoid undefined index notices below
+ if (preg_match('#(?:(tcp|tls)://)?([^:?]+)(?:\:(\d+))?(\?.+)?#', $this->savePath, $matches)) {
+ if (! isset($matches[4])) {
+ $matches[4] = ''; // Just to avoid undefined index notices below
}
$this->savePath = [
- 'host' => $matches[1],
- 'port' => empty($matches[2]) ? self::DEFAULT_PORT : $matches[2],
- 'password' => preg_match('#auth=([^\s&]+)#', $matches[3], $match) ? $match[1] : null,
- 'database' => preg_match('#database=(\d+)#', $matches[3], $match) ? (int) $match[1] : 0,
- 'timeout' => preg_match('#timeout=(\d+\.\d+|\d+)#', $matches[3], $match) ? (float) $match[1] : 0.0,
+ 'protocol' => ! empty($matches[1]) ? $matches[1] : self::DEFAULT_PROTOCOL,
+ 'host' => $matches[2],
+ 'port' => empty($matches[3]) ? self::DEFAULT_PORT : $matches[3],
+ 'password' => preg_match('#auth=([^\s&]+)#', $matches[4], $match) ? $match[1] : null,
+ 'database' => preg_match('#database=(\d+)#', $matches[4], $match) ? (int) $match[1] : 0,
+ 'timeout' => preg_match('#timeout=(\d+\.\d+|\d+)#', $matches[4], $match) ? (float) $match[1] : 0.0,
];
- preg_match('#prefix=([^\s&]+)#', $matches[3], $match) && $this->keyPrefix = $match[1];
+ preg_match('#prefix=([^\s&]+)#', $matches[4], $match) && $this->keyPrefix = $match[1];
} else {
throw SessionException::forInvalidSavePathFormat($this->savePath);
}
@@ -135,7 +137,7 @@ public function open($path, $name): bool
$redis = new Redis();
- if (! $redis->connect($this->savePath['host'], ($this->savePath['host'][0] === '/' ? 0 : $this->savePath['port']), $this->savePath['timeout'])) {
+ if (! $redis->connect($this->savePath['protocol'] . '://' . $this->savePath['host'], ($this->savePath['host'][0] === '/' ? 0 : $this->savePath['port']), $this->savePath['timeout'])) {
$this->logger->error('Session: Unable to connect to Redis with the configured settings.');
} elseif (isset($this->savePath['password']) && ! $redis->auth($this->savePath['password'])) {
$this->logger->error('Session: Unable to authenticate to Redis instance.');
diff --git a/system/Session/Session.php b/system/Session/Session.php
index 497111b..4f536ca 100644
--- a/system/Session/Session.php
+++ b/system/Session/Session.php
@@ -232,7 +232,7 @@ public function start()
}
if (session_status() === PHP_SESSION_ACTIVE) {
- $this->logger->warning('Session: Sessions is enabled, and one exists.Please don\'t $session->start();');
+ $this->logger->warning('Session: Sessions is enabled, and one exists. Please don\'t $session->start();');
return;
}
@@ -272,21 +272,13 @@ public function start()
}
/**
- * Does a full stop of the session:
+ * Destroys the current session.
*
- * - destroys the session
- * - unsets the session id
- * - destroys the session cookie
+ * @deprecated Use destroy() instead.
*/
public function stop()
{
- setcookie(
- $this->sessionCookieName,
- session_id(),
- ['expires' => 1, 'path' => $this->cookie->getPath(), 'domain' => $this->cookie->getDomain(), 'secure' => $this->cookie->isSecure(), 'httponly' => true]
- );
-
- session_regenerate_id(true);
+ $this->destroy();
}
/**
diff --git a/system/Session/SessionInterface.php b/system/Session/SessionInterface.php
index f485f64..e78736b 100644
--- a/system/Session/SessionInterface.php
+++ b/system/Session/SessionInterface.php
@@ -37,8 +37,8 @@ public function destroy();
* If $data is an array, it is expected to be an array of key/value pairs
* to be set as session properties.
*
- * @param array|string $data Property name or associative array of properties
- * @param mixed $value Property value if single key provided
+ * @param array|string $data Property name or associative array of properties
+ * @param array|bool|float|int|object|string|null $value Property value if single key provided
*/
public function set($data, $value = null);
@@ -53,7 +53,7 @@ public function set($data, $value = null);
*
* @param string $key Identifier of the session property to retrieve
*
- * @return mixed The property value(s)
+ * @return array|bool|float|int|object|string|null The property value(s)
*/
public function get(?string $key = null);
@@ -135,9 +135,9 @@ public function getFlashKeys(): array;
* Sets new data into the session, and marks it as temporary data
* with a set lifespan.
*
- * @param array|string $data Session data key or associative array of items
- * @param mixed $value Value to store
- * @param int $ttl Time-to-live in seconds
+ * @param array|string $data Session data key or associative array of items
+ * @param array|bool|float|int|object|string|null $value Value to store
+ * @param int $ttl Time-to-live in seconds
*/
public function setTempdata($data, $value = null, int $ttl = 300);
@@ -147,7 +147,7 @@ public function setTempdata($data, $value = null, int $ttl = 300);
*
* @param string $key Session data key
*
- * @return mixed Session data value or null if not found.
+ * @return array|bool|float|int|object|string|null Session data value or null if not found.
*/
public function getTempdata(?string $key = null);
diff --git a/system/Test/Mock/MockCURLRequest.php b/system/Test/Mock/MockCURLRequest.php
index 635db36..9ee3824 100644
--- a/system/Test/Mock/MockCURLRequest.php
+++ b/system/Test/Mock/MockCURLRequest.php
@@ -34,6 +34,8 @@ public function setOutput($output)
protected function sendRequest(array $curlOptions = []): string
{
+ $this->response = clone $this->responseOrig;
+
// Save so we can access later.
$this->curl_options = $curlOptions;
diff --git a/system/Test/Mock/MockResult.php b/system/Test/Mock/MockResult.php
index ff40c94..87654b1 100644
--- a/system/Test/Mock/MockResult.php
+++ b/system/Test/Mock/MockResult.php
@@ -12,6 +12,7 @@
namespace CodeIgniter\Test\Mock;
use CodeIgniter\Database\BaseResult;
+use stdClass;
/**
* @extends BaseResult |