diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9f66a3a..a8cfb23 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,9 +22,7 @@ jobs: uses: php-forge/actions/.github/workflows/codeception.yml@main secrets: AUTH_TOKEN: ${{ secrets.AUTH_TOKEN }} + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} with: + coverage-file: runtime/output/coverage.xml extensions: gd, intl - os: >- - ['ubuntu-latest', 'windows-latest'] - php: >- - ['8.1', '8.2', '8.3', '8.4'] diff --git a/.github/workflows/dependency-check.yml b/.github/workflows/dependency-check.yml index 49a1e8a..3e588e2 100644 --- a/.github/workflows/dependency-check.yml +++ b/.github/workflows/dependency-check.yml @@ -22,8 +22,3 @@ jobs: uses: php-forge/actions/.github/workflows/composer-require-checker.yml@main secrets: AUTH_TOKEN: ${{ secrets.AUTH_TOKEN }} - with: - os: >- - ['ubuntu-latest'] - php: >- - ['8.4'] diff --git a/.github/workflows/ecs.yml b/.github/workflows/ecs.yml index 3d2fff5..0693163 100644 --- a/.github/workflows/ecs.yml +++ b/.github/workflows/ecs.yml @@ -22,7 +22,3 @@ jobs: uses: php-forge/actions/.github/workflows/ecs.yml@main with: extensions: mbstring - os: >- - ['ubuntu-latest'] - php: >- - ['8.4'] diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index b308b5e..6d1ad1b 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -23,7 +23,4 @@ jobs: secrets: AUTH_TOKEN: ${{ secrets.AUTH_TOKEN }} with: - os: >- - ['ubuntu-latest'] - php: >- - ['8.1', '8.2', '8.3', '8.4'] + hook: vendor/bin/codecept build diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..141a1f8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# Change Log + +## 0.1.0 Under development + +- Initial release diff --git a/codeception.yml b/codeception.yml index 45d7832..f05a2ae 100644 --- a/codeception.yml +++ b/codeception.yml @@ -1,25 +1,25 @@ -namespace: App\Tests +namespace: app\tests bootstrap: _bootstrap.php support_namespace: Support paths: - tests: tests - output: tests/_output - data: tests/Support/Data - support: tests/Support - envs: tests/_envs + tests: tests + output: runtime/output + data: tests/Support/data + support: tests/Support + envs: runtime/_envs actor_suffix: Tester settings: - memory_limit: 1024M - colors: true + memory_limit: 1024M + colors: true modules: - config: - Yii2: - configFile: 'config/build-test.php' + config: + Yii2: + configFile: config/web/app.php extensions: - enabled: - - Codeception\Extension\RunFailed + enabled: + - Codeception\Extension\RunFailed coverage: - enabled: true - whitelist: - include: - - src/* + enabled: true + whitelist: + include: + - src/* diff --git a/composer.json b/composer.json index 6219a0f..e730394 100644 --- a/composer.json +++ b/composer.json @@ -9,8 +9,6 @@ "yii2" ], "license": "mit", - "minimum-stability": "dev", - "prefer-stable": true, "require": { "php": ">=8.1", "php-forge/foxy": "^0.1", @@ -18,10 +16,9 @@ "ui-awesome/html-component-bootstrap5": "^1.0@dev", "ui-awesome/html-svg":"^0.2", "yii2-extensions/localeurls": "^0.1.0", - "yiisoft/config": "^1.4", - "yiisoft/yii2": "22.0.x-dev", - "yiisoft/yii2-bootstrap5": "22.x-dev", - "yiisoft/yii2-symfonymailer": "22.x-dev" + "yiisoft/yii2": "^2.0.53|^22", + "yiisoft/yii2-bootstrap5": "^2.0.50|^22", + "yiisoft/yii2-symfonymailer": "^4.0|^22" }, "require-dev": { "codeception/c3": "^2.8", @@ -38,9 +35,9 @@ "symfony/browser-kit": "^6.3", "symfony/process": "^6.3", "symplify/easy-coding-standard": "^12.3", - "yii2-extensions/phpstan": "^0.2.3", - "yiisoft/yii2-debug": "22.x-dev", - "yiisoft/yii2-gii": "22.x-dev" + "yii2-extensions/phpstan": "^0.3.0", + "yiisoft/yii2-debug": "^2.1.27|^22", + "yiisoft/yii2-gii": "^2.2.7|^22" }, "autoload": { "psr-4": { @@ -52,18 +49,23 @@ "app\\tests\\": "tests/" } }, + "provide": { + "bower-asset/inputmask": "5.0.9", + "bower-asset/jquery": "3.6.1", + "bower-asset/punycode": "^1.4", + "bower-asset/yii2-pjax": "~2.0.1", + "bower-asset/bootstrap": "^5.2" + }, "extra": { "branch-alias": { "dev-master": "0.1-dev" - }, - "config-plugin-file": "/config/config-plugin.php" + } }, "config": { "allow-plugins": { "codeception/c3": true, "yiisoft/yii2-composer": true, "composer/installers": true, - "yiisoft/config": true, "php-forge/foxy": true, "phpstan/extension-installer": true } diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..8719093 --- /dev/null +++ b/composer.lock @@ -0,0 +1,8273 @@ +{ + "_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": "53e1879ad59572550fd6803faa3cf37a", + "packages": [ + { + "name": "cebe/markdown", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/cebe/markdown.git", + "reference": "9bac5e971dd391e2802dca5400bbeacbaea9eb86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cebe/markdown/zipball/9bac5e971dd391e2802dca5400bbeacbaea9eb86", + "reference": "9bac5e971dd391e2802dca5400bbeacbaea9eb86", + "shasum": "" + }, + "require": { + "lib-pcre": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "cebe/indent": "*", + "facebook/xhprof": "*@dev", + "phpunit/phpunit": "4.1.*" + }, + "bin": [ + "bin/markdown" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "cebe\\markdown\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "http://cebe.cc/", + "role": "Creator" + } + ], + "description": "A super fast, highly extensible markdown parser for PHP", + "homepage": "https://github.com/cebe/markdown#readme", + "keywords": [ + "extensible", + "fast", + "gfm", + "markdown", + "markdown-extra" + ], + "support": { + "issues": "https://github.com/cebe/markdown/issues", + "source": "https://github.com/cebe/markdown" + }, + "time": "2018-03-26T11:24:36+00:00" + }, + { + "name": "composer/ca-bundle", + "version": "1.5.7", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "d665d22c417056996c59019579f1967dfe5c1e82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/d665d22c417056996c59019579f1967dfe5c1e82", + "reference": "d665d22c417056996c59019579f1967dfe5c1e82", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8 || ^9", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.5.7" + }, + "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": "2025-05-26T15:08:54+00:00" + }, + { + "name": "composer/class-map-generator", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "134b705ddb0025d397d8318a75825fe3c9d1da34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/134b705ddb0025d397d8318a75825fe3c9d1da34", + "reference": "134b705ddb0025d397d8318a75825fe3c9d1da34", + "shasum": "" + }, + "require": { + "composer/pcre": "^2.1 || ^3.1", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", + "phpunit/phpunit": "^8", + "symfony/filesystem": "^5.4 || ^6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.6.1" + }, + "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": "2025-03-24T13:50:44+00:00" + }, + { + "name": "composer/composer", + "version": "2.8.9", + "source": { + "type": "git", + "url": "https://github.com/composer/composer.git", + "reference": "b4e6bff2db7ce756ddb77ecee958a0f41f42bd9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/composer/zipball/b4e6bff2db7ce756ddb77ecee958a0f41f42bd9d", + "reference": "b4e6bff2db7ce756ddb77ecee958a0f41f42bd9d", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.5", + "composer/class-map-generator": "^1.4.0", + "composer/metadata-minifier": "^1.0", + "composer/pcre": "^2.2 || ^3.2", + "composer/semver": "^3.3", + "composer/spdx-licenses": "^1.5.7", + "composer/xdebug-handler": "^2.0.2 || ^3.0.3", + "justinrainbow/json-schema": "^6.3.1", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "react/promise": "^2.11 || ^3.2", + "seld/jsonlint": "^1.4", + "seld/phar-utils": "^1.2", + "seld/signal-handler": "^2.0", + "symfony/console": "^5.4.35 || ^6.3.12 || ^7.0.3", + "symfony/filesystem": "^5.4.35 || ^6.3.12 || ^7.0.3", + "symfony/finder": "^5.4.35 || ^6.3.12 || ^7.0.3", + "symfony/polyfill-php73": "^1.24", + "symfony/polyfill-php80": "^1.24", + "symfony/polyfill-php81": "^1.24", + "symfony/process": "^5.4.35 || ^6.3.12 || ^7.0.3" + }, + "require-dev": { + "phpstan/phpstan": "^1.11.8", + "phpstan/phpstan-deprecation-rules": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.0", + "phpstan/phpstan-symfony": "^1.4.0", + "symfony/phpunit-bridge": "^6.4.3 || ^7.0.1" + }, + "suggest": { + "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", + "ext-zip": "Enabling the zip extension allows you to unzip archives", + "ext-zlib": "Allow gzip compression of HTTP requests" + }, + "bin": [ + "bin/composer" + ], + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] + }, + "branch-alias": { + "dev-main": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\": "src/Composer/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "https://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", + "homepage": "https://getcomposer.org/", + "keywords": [ + "autoload", + "dependency", + "package" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/composer/issues", + "security": "https://github.com/composer/composer/security/policy", + "source": "https://github.com/composer/composer/tree/2.8.9" + }, + "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": "2025-05-13T12:01:37+00:00" + }, + { + "name": "composer/metadata-minifier", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/metadata-minifier.git", + "reference": "c549d23829536f0d0e984aaabbf02af91f443207" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", + "reference": "c549d23829536f0d0e984aaabbf02af91f443207", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "composer/composer": "^2", + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\MetadataMinifier\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Small utility library that handles metadata minification and expansion.", + "keywords": [ + "composer", + "compression" + ], + "support": { + "issues": "https://github.com/composer/metadata-minifier/issues", + "source": "https://github.com/composer/metadata-minifier/tree/1.0.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": "2021-04-07T13:37:33+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.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": "2024-11-12T16:29:46+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.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": "2024-09-19T14:15:21+00:00" + }, + { + "name": "composer/spdx-licenses", + "version": "1.5.9", + "source": { + "type": "git", + "url": "https://github.com/composer/spdx-licenses.git", + "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/edf364cefe8c43501e21e88110aac10b284c3c9f", + "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Spdx\\": "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": "SPDX licenses list and validation library.", + "keywords": [ + "license", + "spdx", + "validator" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/spdx-licenses/issues", + "source": "https://github.com/composer/spdx-licenses/tree/1.5.9" + }, + "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": "2025-05-12T21:07:07+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "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": "2024-02-05T11:56:58+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2025-03-06T22:45:56+00:00" + }, + { + "name": "enshrined/svg-sanitize", + "version": "0.18.0", + "source": { + "type": "git", + "url": "https://github.com/darylldoyle/svg-sanitizer.git", + "reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/6a2c069dab3843ca4d887ff09c972fc7033888d0", + "reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.5 || ^8.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "enshrined\\svgSanitize\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Daryll Doyle", + "email": "daryll@enshrined.co.uk" + } + ], + "description": "An SVG sanitizer for PHP", + "support": { + "issues": "https://github.com/darylldoyle/svg-sanitizer/issues", + "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.18.0" + }, + "time": "2024-02-22T17:51:05+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.18.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "cb56001e54359df7ae76dc522d08845dc741621b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/cb56001e54359df7ae76dc522d08845dc741621b", + "reference": "cb56001e54359df7ae76dc522d08845dc741621b", + "shasum": "" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.18.0" + }, + "time": "2024-11-01T03:51:45+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "6.4.2", + "source": { + "type": "git", + "url": "https://github.com/jsonrainbow/json-schema.git", + "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ce1fd2d47799bb60668643bc6220f6278a4c1d02", + "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02", + "shasum": "" + }, + "require": { + "ext-json": "*", + "marc-mabe/php-enum": "^4.0", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.3.0", + "json-schema/json-schema-test-suite": "1.2.0", + "marc-mabe/php-enum-phpstan": "^2.0", + "phpspec/prophecy": "^1.19", + "phpstan/phpstan": "^1.12", + "phpunit/phpunit": "^8.5" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/jsonrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/jsonrainbow/json-schema/issues", + "source": "https://github.com/jsonrainbow/json-schema/tree/6.4.2" + }, + "time": "2025-06-03T18:27:04+00:00" + }, + { + "name": "marc-mabe/php-enum", + "version": "v4.7.1", + "source": { + "type": "git", + "url": "https://github.com/marc-mabe/php-enum.git", + "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/7159809e5cfa041dca28e61f7f7ae58063aae8ed", + "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed", + "shasum": "" + }, + "require": { + "ext-reflection": "*", + "php": "^7.1 | ^8.0" + }, + "require-dev": { + "phpbench/phpbench": "^0.16.10 || ^1.0.4", + "phpstan/phpstan": "^1.3.1", + "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11", + "vimeo/psalm": "^4.17.0 | ^5.26.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.2-dev", + "dev-master": "4.7-dev" + } + }, + "autoload": { + "psr-4": { + "MabeEnum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Marc Bennewitz", + "email": "dev@mabe.berlin", + "homepage": "https://mabe.berlin/", + "role": "Lead" + } + ], + "description": "Simple and fast implementation of enumerations with native PHP", + "homepage": "https://github.com/marc-mabe/php-enum", + "keywords": [ + "enum", + "enum-map", + "enum-set", + "enumeration", + "enumerator", + "enummap", + "enumset", + "map", + "set", + "type", + "type-hint", + "typehint" + ], + "support": { + "issues": "https://github.com/marc-mabe/php-enum/issues", + "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.1" + }, + "time": "2024-11-28T04:54:44+00:00" + }, + { + "name": "php-forge/awesome-widget", + "version": "0.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-forge/awesome-widget.git", + "reference": "694dd30713e59e86b360030f62b0e27d4d21be7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-forge/awesome-widget/zipball/694dd30713e59e86b360030f62b0e27d4d21be7e", + "reference": "694dd30713e59e86b360030f62b0e27d4d21be7e", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "php-forge/support": "^0.1", + "phpunit/phpunit": "^10.5", + "roave/infection-static-analysis-plugin": "^1.34", + "symplify/easy-coding-standard": "^12.1", + "vimeo/psalm": "^5.20" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "PHPForge\\Widget\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "mit" + ], + "description": "Foundation classes and components used by Awesome Widget.", + "keywords": [ + "awesome-widget", + "php-forge" + ], + "support": { + "issues": "https://github.com/php-forge/awesome-widget/issues", + "source": "https://github.com/php-forge/awesome-widget/tree/0.1.4" + }, + "time": "2024-03-29T11:11:59+00:00" + }, + { + "name": "php-forge/foxy", + "version": "0.1.3", + "source": { + "type": "git", + "url": "https://github.com/php-forge/foxy.git", + "reference": "8a542f61727214cda76e0c34924130a51ffd0421" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-forge/foxy/zipball/8a542f61727214cda76e0c34924130a51ffd0421", + "reference": "8a542f61727214cda76e0c34924130a51ffd0421", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "composer/composer": "^2.8", + "composer/semver": "^3.4", + "ext-ctype": "*", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "php-forge/support": "^0.1", + "phpunit/phpunit": "^10.5", + "symplify/easy-coding-standard": "^12.5", + "vimeo/psalm": "^5.26.1|^6.4.1" + }, + "type": "composer-plugin", + "extra": { + "class": "Foxy\\Foxy", + "branch-alias": { + "dev-main": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Foxy\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Fast, reliable, and secure Bun/NPM/Yarn/pnpm bridge for Composer", + "homepage": "https://github.com/fxpio/foxy", + "keywords": [ + "Bridge", + "asset", + "bun", + "composer", + "dependency manager", + "nodejs", + "npm", + "package", + "yarn" + ], + "support": { + "issues": "https://github.com/php-forge/foxy/issues", + "source": "https://github.com/php-forge/foxy/tree/0.1.3" + }, + "funding": [ + { + "url": "https://github.com/sponsors/terabytesoftw", + "type": "github" + } + ], + "time": "2025-03-13T13:03:07+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/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "react/promise", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-05-24T10:39:05+00:00" + }, + { + "name": "seld/jsonlint", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/1748aaf847fc731cfad7725aec413ee46f0cc3a2", + "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" + }, + "bin": [ + "bin/jsonlint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "JSON Linter", + "keywords": [ + "json", + "linter", + "parser", + "validator" + ], + "support": { + "issues": "https://github.com/Seldaek/jsonlint/issues", + "source": "https://github.com/Seldaek/jsonlint/tree/1.11.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "type": "tidelift" + } + ], + "time": "2024-07-11T14:55:45+00:00" + }, + { + "name": "seld/phar-utils", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/phar-utils.git", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\PharUtils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "PHAR file format utilities, for when PHP phars you up", + "keywords": [ + "phar" + ], + "support": { + "issues": "https://github.com/Seldaek/phar-utils/issues", + "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" + }, + "time": "2022-08-31T10:31:18+00:00" + }, + { + "name": "seld/signal-handler", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\Signal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "keywords": [ + "posix", + "sigint", + "signal", + "sigterm", + "unix" + ], + "support": { + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" + }, + "time": "2023-09-03T09:24:00+00:00" + }, + { + "name": "symfony/console", + "version": "v7.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "9e27aecde8f506ba0fd1d9989620c04a87697101" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/9e27aecde8f506ba0fd1d9989620c04a87697101", + "reference": "9e27aecde8f506ba0fd1d9989620c04a87697101", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.3.1" + }, + "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": "2025-06-27T19:55:54+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.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": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "497f73ac996a598c92409b44ac43b6690c4f666d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d", + "reference": "497f73ac996a598c92409b44ac43b6690c4f666d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "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/v7.3.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": "2025-04-22T09:11:45+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "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.6.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": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v7.3.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": "2024-10-25T15:15:23+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/ec2344cf77a48253bbca6939aa3d2477773ea63d", + "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.3.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": "2024-12-30T19:00:26+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "b5db5105b290bdbea5ab27b89c69effcf1cb3368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/b5db5105b290bdbea5ab27b89c69effcf1cb3368", + "reference": "b5db5105b290bdbea5ab27b89c69effcf1cb3368", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/mime": "^7.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "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 sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v7.3.1" + }, + "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": "2025-06-27T19:55:54+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9", + "reference": "0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "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": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v7.3.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": "2025-02-19T08:51:26+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "5f3b930437ae03ae5dff61269024d8ea1b3774aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/5f3b930437ae03ae5dff61269024d8ea1b3774aa", + "reference": "5f3b930437ae03ae5dff61269024d8ea1b3774aa", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-iconv": "*" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } + }, + "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 Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.32.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": "2024-09-17T14:58:18+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.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": "2024-09-10T14:38:51+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.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": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "metapackage", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "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 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.31.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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "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 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.32.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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\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.32.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": "2025-01-02T08:10:11+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\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.32.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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v6.4.20", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "e2a61c16af36c9a07e5c9906498b73e091949a20" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/e2a61c16af36c9a07e5c9906498b73e091949a20", + "reference": "e2a61c16af36c9a07e5c9906498b73e091949a20", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "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.4.20" + }, + "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": "2025-03-10T17:11:00+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.6.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": "2025-04-25T09:37:31+00:00" + }, + { + "name": "symfony/string", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125", + "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125", + "shasum": "" + }, + "require": { + "php": ">=8.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.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.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/v7.3.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": "2025-04-20T20:19:01+00:00" + }, + { + "name": "ui-awesome/html", + "version": "0.3.0", + "source": { + "type": "git", + "url": "https://github.com/ui-awesome/html.git", + "reference": "bc6ae50a3abdea7a5e149a2752787e9d381159e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ui-awesome/html/zipball/bc6ae50a3abdea7a5e149a2752787e9d381159e0", + "reference": "bc6ae50a3abdea7a5e149a2752787e9d381159e0", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.1", + "php-forge/awesome-widget": "^0.1.2", + "ui-awesome/html-attribute": "^0.2", + "ui-awesome/html-concern": "^0.2", + "ui-awesome/html-core": "^0.1", + "ui-awesome/html-helper": "^0.2", + "ui-awesome/html-interop": "^0.1" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "php-forge/support": "^0.1", + "phpunit/phpunit": "^10.5", + "roave/infection-static-analysis-plugin": "^1.34", + "symplify/easy-coding-standard": "^12.1", + "vimeo/psalm": "^5.20" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "UIAwesome\\Html\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "description": "UI Awesome HTML Code Generator for PHP.", + "keywords": [ + "code-generator", + "html", + "php", + "ui-awesome" + ], + "support": { + "issues": "https://github.com/ui-awesome/html/issues", + "source": "https://github.com/ui-awesome/html/tree/0.3.0" + }, + "time": "2024-03-31T12:21:24+00:00" + }, + { + "name": "ui-awesome/html-attribute", + "version": "0.2.0", + "source": { + "type": "git", + "url": "https://github.com/ui-awesome/html-attribute.git", + "reference": "c3632a31b31e33e10fe70552901bdbbaeec24af4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ui-awesome/html-attribute/zipball/c3632a31b31e33e10fe70552901bdbbaeec24af4", + "reference": "c3632a31b31e33e10fe70552901bdbbaeec24af4", + "shasum": "" + }, + "require": { + "php": "^8.1", + "ui-awesome/html-helper": "^0.2", + "ui-awesome/html-interop": "^0.1", + "voku/anti-xss": "^4.1" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "roave/infection-static-analysis-plugin": "^1.34", + "symplify/easy-coding-standard": "^12.1", + "vimeo/psalm": "^5.20" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "UIAwesome\\Html\\Attribute\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "mit" + ], + "description": "UI Awesome HTML Attribute Code Generator for PHP.", + "keywords": [ + "code-generator", + "html-attribute", + "php", + "ui-awesome" + ], + "support": { + "issues": "https://github.com/ui-awesome/html-attribute/issues", + "source": "https://github.com/ui-awesome/html-attribute/tree/0.2.0" + }, + "time": "2024-03-30T17:55:29+00:00" + }, + { + "name": "ui-awesome/html-component-bootstrap5", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/ui-awesome/html-component-bootstrap5.git", + "reference": "aab2bcd36f19d4a3a19c011868a603e38ff023bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ui-awesome/html-component-bootstrap5/zipball/aab2bcd36f19d4a3a19c011868a603e38ff023bb", + "reference": "aab2bcd36f19d4a3a19c011868a603e38ff023bb", + "shasum": "" + }, + "require": { + "php": "^8.1", + "php-forge/awesome-widget": "^0.1", + "ui-awesome/html-core-component": "^0.1", + "ui-awesome/html-helper": "^0.2", + "ui-awesome/html-svg": "^0.2" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "php-forge/support": "^0.1", + "phpunit/phpunit": "^10.5", + "roave/infection-static-analysis-plugin": "^1.34", + "symplify/easy-coding-standard": "^12.1", + "vimeo/psalm": "^5.20" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "UIAwesome\\Html\\Component\\Bootstrap5\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "mit" + ], + "description": "UI Awesome HTML Component Bootstrap5 for PHP.", + "keywords": [ + "bootstrap5", + "html-component", + "php", + "ui-awesome" + ], + "support": { + "issues": "https://github.com/ui-awesome/html-component-bootstrap5/issues", + "source": "https://github.com/ui-awesome/html-component-bootstrap5/tree/main" + }, + "time": "2024-03-31T13:56:53+00:00" + }, + { + "name": "ui-awesome/html-concern", + "version": "0.2.0", + "source": { + "type": "git", + "url": "https://github.com/ui-awesome/html-concern.git", + "reference": "48147f18fa85640842e38af03104a9971818c62f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ui-awesome/html-concern/zipball/48147f18fa85640842e38af03104a9971818c62f", + "reference": "48147f18fa85640842e38af03104a9971818c62f", + "shasum": "" + }, + "require": { + "php": "^8.1", + "ui-awesome/html-helper": "^0.2", + "ui-awesome/html-interop": "^0.1", + "voku/anti-xss": "^4.1" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "roave/infection-static-analysis-plugin": "^1.34", + "symplify/easy-coding-standard": "^12.1", + "vimeo/psalm": "^5.20" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "UIAwesome\\Html\\Concern\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "mit" + ], + "description": "UI Awesome HTML Concern Code Generator for PHP.", + "keywords": [ + "code-generator", + "html-concern", + "php", + "ui-awesome" + ], + "support": { + "issues": "https://github.com/ui-awesome/html-concern/issues", + "source": "https://github.com/ui-awesome/html-concern/tree/0.2.0" + }, + "time": "2024-03-30T17:35:01+00:00" + }, + { + "name": "ui-awesome/html-core", + "version": "0.1.0", + "source": { + "type": "git", + "url": "https://github.com/ui-awesome/html-core.git", + "reference": "df5379cafc8dd44bcd16d3b2fc0fff634ce41ddf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ui-awesome/html-core/zipball/df5379cafc8dd44bcd16d3b2fc0fff634ce41ddf", + "reference": "df5379cafc8dd44bcd16d3b2fc0fff634ce41ddf", + "shasum": "" + }, + "require": { + "php": "^8.1", + "php-forge/awesome-widget": "^0.1", + "ui-awesome/html-attribute": "^0.2", + "ui-awesome/html-concern": "^0.2", + "ui-awesome/html-helper": "^0.2", + "ui-awesome/html-interop": "^0.1" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "php-forge/support": "^0.1", + "phpunit/phpunit": "^10.5", + "roave/infection-static-analysis-plugin": "^1.34", + "symplify/easy-coding-standard": "^12.1", + "vimeo/psalm": "^5.20" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "UIAwesome\\Html\\Core\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "mit" + ], + "description": "UI Awesome HTML Core Code Generator for PHP.", + "keywords": [ + "code-generator", + "html-core", + "php", + "ui-awesome" + ], + "support": { + "issues": "https://github.com/ui-awesome/html-core/issues", + "source": "https://github.com/ui-awesome/html-core/tree/0.1.0" + }, + "time": "2024-03-30T20:03:08+00:00" + }, + { + "name": "ui-awesome/html-core-component", + "version": "0.1.0", + "source": { + "type": "git", + "url": "https://github.com/ui-awesome/html-core-component.git", + "reference": "5d87762328528943a9a964adb75e43715fbca0dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ui-awesome/html-core-component/zipball/5d87762328528943a9a964adb75e43715fbca0dc", + "reference": "5d87762328528943a9a964adb75e43715fbca0dc", + "shasum": "" + }, + "require": { + "php": "^8.1", + "php-forge/awesome-widget": "^0.1", + "ui-awesome/html-attribute": "^0.2", + "ui-awesome/html-concern": "^0.2", + "ui-awesome/html-core": "^0.1", + "ui-awesome/html-helper": "^0.2", + "ui-awesome/html-interop": "^0.1", + "ui-awesome/html-svg": "^0.2" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "php-forge/support": "^0.1", + "phpunit/phpunit": "^10.5", + "roave/infection-static-analysis-plugin": "^1.34", + "symplify/easy-coding-standard": "^12.1", + "vimeo/psalm": "^5.20" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "UIAwesome\\Html\\Core\\Component\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "mit" + ], + "description": "UI Awesome HTML Core Component for PHP.", + "keywords": [ + "core-component", + "html", + "php", + "ui-awesome" + ], + "support": { + "issues": "https://github.com/ui-awesome/html-core-component/issues", + "source": "https://github.com/ui-awesome/html-core-component/tree/0.1.0" + }, + "time": "2024-03-31T13:16:51+00:00" + }, + { + "name": "ui-awesome/html-helper", + "version": "0.2.0", + "source": { + "type": "git", + "url": "https://github.com/ui-awesome/html-helper.git", + "reference": "6a6f810e35cea0dae1575b93f16f09982fe4e785" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ui-awesome/html-helper/zipball/6a6f810e35cea0dae1575b93f16f09982fe4e785", + "reference": "6a6f810e35cea0dae1575b93f16f09982fe4e785", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.1", + "ui-awesome/html-interop": "^0.1", + "voku/anti-xss": "^4.1" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "php-forge/support": "^0.1", + "phpunit/phpunit": "^10.5", + "roave/infection-static-analysis-plugin": "^1.34", + "symplify/easy-coding-standard": "^12.1", + "vimeo/psalm": "^5.20" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "UIAwesome\\Html\\Helper\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "mit" + ], + "description": "UI Awesome HTML Helpers Code Generator for PHP.", + "keywords": [ + "code-generator", + "html-helpers", + "php", + "ui-awesome" + ], + "support": { + "issues": "https://github.com/ui-awesome/html-helper/issues", + "source": "https://github.com/ui-awesome/html-helper/tree/0.2.0" + }, + "time": "2024-03-30T16:07:03+00:00" + }, + { + "name": "ui-awesome/html-interop", + "version": "0.1.1", + "source": { + "type": "git", + "url": "https://github.com/ui-awesome/html-interop.git", + "reference": "f9450b58aad98e6435fc340f1d744660cd29417c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ui-awesome/html-interop/zipball/f9450b58aad98e6435fc340f1d744660cd29417c", + "reference": "f9450b58aad98e6435fc340f1d744660cd29417c", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "symplify/easy-coding-standard": "^12.1", + "vimeo/psalm": "^5.20" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "UIAwesome\\Html\\Interop\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "mit" + ], + "description": "UI Awesome HTML Interop Common Interfaces for PHP.", + "keywords": [ + "common", + "html-interop", + "interfaces", + "php", + "ui-awesome" + ], + "support": { + "issues": "https://github.com/ui-awesome/html-interop/issues", + "source": "https://github.com/ui-awesome/html-interop/tree/0.1.1" + }, + "time": "2024-03-09T11:29:50+00:00" + }, + { + "name": "ui-awesome/html-svg", + "version": "0.2.0", + "source": { + "type": "git", + "url": "https://github.com/ui-awesome/html-svg.git", + "reference": "e3af01fec088ca6994123776c6b2f36c5f2de4bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ui-awesome/html-svg/zipball/e3af01fec088ca6994123776c6b2f36c5f2de4bf", + "reference": "e3af01fec088ca6994123776c6b2f36c5f2de4bf", + "shasum": "" + }, + "require": { + "enshrined/svg-sanitize": "^0.18", + "ext-dom": "*", + "ext-libxml": "*", + "php": "^8.1", + "php-forge/awesome-widget": "^0.1", + "ui-awesome/html-attribute": "^0.2", + "ui-awesome/html-concern": "^0.2", + "ui-awesome/html-core": "^0.1", + "ui-awesome/html-interop": "^0.1" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "php-forge/support": "^0.1", + "phpunit/phpunit": "^10.5", + "roave/infection-static-analysis-plugin": "^1.34", + "symplify/easy-coding-standard": "^12.1", + "vimeo/psalm": "^5.20" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "UIAwesome\\Html\\Graphic\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "mit" + ], + "description": "UI Awesome HTML SVG tag for PHP.", + "keywords": [ + "html", + "php", + "svg", + "tag", + "ui-awesome" + ], + "support": { + "issues": "https://github.com/ui-awesome/html-svg/issues", + "source": "https://github.com/ui-awesome/html-svg/tree/0.2.0" + }, + "time": "2024-03-31T13:02:29+00:00" + }, + { + "name": "voku/anti-xss", + "version": "4.1.42", + "source": { + "type": "git", + "url": "https://github.com/voku/anti-xss.git", + "reference": "bca1f8607e55a3c5077483615cd93bd8f11bd675" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/anti-xss/zipball/bca1f8607e55a3c5077483615cd93bd8f11bd675", + "reference": "bca1f8607e55a3c5077483615cd93bd8f11bd675", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "voku/portable-utf8": "~6.0.2" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "voku\\helper\\": "src/voku/helper/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "EllisLab Dev Team", + "homepage": "http://ellislab.com/" + }, + { + "name": "Lars Moelleken", + "email": "lars@moelleken.org", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "anti xss-library", + "homepage": "https://github.com/voku/anti-xss", + "keywords": [ + "anti-xss", + "clean", + "security", + "xss" + ], + "support": { + "issues": "https://github.com/voku/anti-xss/issues", + "source": "https://github.com/voku/anti-xss/tree/4.1.42" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/anti-xss", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/anti-xss", + "type": "tidelift" + } + ], + "time": "2023-07-03T14:40:46+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2024-11-21T01:49:47+00:00" + }, + { + "name": "voku/portable-utf8", + "version": "6.0.13", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-utf8.git", + "reference": "b8ce36bf26593e5c2e81b1850ef0ffb299d2043f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-utf8/zipball/b8ce36bf26593e5c2e81b1850ef0ffb299d2043f", + "reference": "b8ce36bf26593e5c2e81b1850ef0ffb299d2043f", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "symfony/polyfill-iconv": "~1.0", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.0", + "voku/portable-ascii": "~2.0.0" + }, + "require-dev": { + "phpstan/phpstan": "1.9.*@dev", + "phpstan/phpstan-strict-rules": "1.4.*@dev", + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0", + "thecodingmachine/phpstan-strict-rules": "1.0.*@dev", + "voku/phpstan-rules": "3.1.*@dev" + }, + "suggest": { + "ext-ctype": "Use Ctype for e.g. hexadecimal digit detection", + "ext-fileinfo": "Use Fileinfo for better binary file detection", + "ext-iconv": "Use iconv for best performance", + "ext-intl": "Use Intl for best performance", + "ext-json": "Use JSON for string detection", + "ext-mbstring": "Use Mbstring for best performance" + }, + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "(Apache-2.0 or GPL-2.0)" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Hamid Sarfraz", + "homepage": "http://pageconfig.com/" + }, + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable UTF-8 library - performance optimized (unicode) string functions for php.", + "homepage": "https://github.com/voku/portable-utf8", + "keywords": [ + "UTF", + "clean", + "php", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "issues": "https://github.com/voku/portable-utf8/issues", + "source": "https://github.com/voku/portable-utf8/tree/6.0.13" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-utf8", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-utf8", + "type": "tidelift" + } + ], + "time": "2023-03-08T08:35:38+00:00" + }, + { + "name": "yii2-extensions/localeurls", + "version": "0.1.2", + "source": { + "type": "git", + "url": "https://github.com/yii2-extensions/localeurls.git", + "reference": "c6efcdb3cae20b7098b9085585d7f1efc0806da5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yii2-extensions/localeurls/zipball/c6efcdb3cae20b7098b9085585d7f1efc0806da5", + "reference": "c6efcdb3cae20b7098b9085585d7f1efc0806da5", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "yiisoft/yii2": "^2.0.53|^22" + }, + "require-dev": { + "infection/infection": "^0.27|^0.30", + "maglnet/composer-require-checker": "^4.1", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan-strict-rules": "^2.0.3", + "phpunit/phpunit": "^10.5", + "rector/rector": "^2.1", + "symplify/easy-coding-standard": "^12.5", + "yii2-extensions/phpstan": "^0.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii2\\extensions\\localeurls\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Automatic locale/language management for URLs.", + "keywords": [ + "i18n", + "locale", + "yii2" + ], + "support": { + "issues": "https://github.com/yii2-extensions/localeurls/issues", + "source": "https://github.com/yii2-extensions/localeurls/tree/0.1.2" + }, + "funding": [ + { + "url": "https://github.com/terabytesoftw", + "type": "github" + } + ], + "time": "2025-07-04T14:01:43+00:00" + }, + { + "name": "yiisoft/yii2", + "version": "2.0.53", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-framework.git", + "reference": "6c622fb8243181d7912b62ad80821cc0e1c745db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/6c622fb8243181d7912b62ad80821cc0e1c745db", + "reference": "6c622fb8243181d7912b62ad80821cc0e1c745db", + "shasum": "" + }, + "require": { + "bower-asset/inputmask": "^5.0.8 ", + "bower-asset/jquery": "3.7.*@stable | 3.6.*@stable | 3.5.*@stable | 3.4.*@stable | 3.3.*@stable | 3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", + "bower-asset/punycode": "^1.4", + "bower-asset/yii2-pjax": "~2.0.1", + "cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0", + "ext-ctype": "*", + "ext-mbstring": "*", + "ezyang/htmlpurifier": "^4.17", + "lib-pcre": "*", + "php": ">=7.3.0", + "yiisoft/yii2-composer": "~2.0.4" + }, + "bin": [ + "yii" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com", + "homepage": "https://www.yiiframework.com/", + "role": "Founder and project lead" + }, + { + "name": "Alexander Makarov", + "email": "sam@rmcreative.ru", + "homepage": "https://rmcreative.ru/", + "role": "Core framework development" + }, + { + "name": "Maurizio Domba", + "homepage": "http://mdomba.info/", + "role": "Core framework development" + }, + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "https://www.cebe.cc/", + "role": "Core framework development" + }, + { + "name": "Timur Ruziev", + "email": "resurtm@gmail.com", + "homepage": "http://resurtm.com/", + "role": "Core framework development" + }, + { + "name": "Paul Klimov", + "email": "klimov.paul@gmail.com", + "role": "Core framework development" + }, + { + "name": "Dmitry Naumenko", + "email": "d.naumenko.a@gmail.com", + "role": "Core framework development" + }, + { + "name": "Boudewijn Vahrmeijer", + "email": "info@dynasource.eu", + "homepage": "http://dynasource.eu", + "role": "Core framework development" + } + ], + "description": "Yii PHP Framework Version 2", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "framework", + "yii2" + ], + "support": { + "forum": "https://forum.yiiframework.com/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii2/issues?state=open", + "source": "https://github.com/yiisoft/yii2", + "wiki": "https://www.yiiframework.com/wiki" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2", + "type": "tidelift" + } + ], + "time": "2025-06-27T07:42:53+00:00" + }, + { + "name": "yiisoft/yii2-bootstrap5", + "version": "2.0.50", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-bootstrap5.git", + "reference": "ad080a7ea063074888c2d801f6b05162064f8ae0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-bootstrap5/zipball/ad080a7ea063074888c2d801f6b05162064f8ae0", + "reference": "ad080a7ea063074888c2d801f6b05162064f8ae0", + "shasum": "" + }, + "require": { + "bower-asset/bootstrap": "^5.2.3", + "ext-json": "*", + "php": ">=7.3", + "yiisoft/yii2": "^2.0.42" + }, + "require-dev": { + "phpunit/phpunit": "^9.6", + "twbs/bootstrap-icons": "^1.7.2", + "yiisoft/yii2-coding-standards": "~2.0" + }, + "suggest": { + "twbs/bootstrap-icons": "Add this package to the `require` section of your `composer.json` if you'd like to use the bootstrap icon asset." + }, + "type": "yii2-extension", + "extra": { + "bootstrap": "yii\\bootstrap5\\i18n\\TranslationBootstrap", + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\bootstrap5\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sergey Zhukovskiy", + "email": "mylistryx@gmail.com", + "homepage": "https://net23.ru/" + }, + { + "name": "Simon Karlen", + "email": "simi.albi@outlook.com" + } + ], + "description": "The Twitter Bootstrap v5 extension for the Yii framework", + "keywords": [ + "bootstrap", + "bootstrap5", + "yii2" + ], + "support": { + "issues": "https://github.com/yiisoft/yii2-bootstrap5/issues", + "source": "https://github.com/yiisoft/yii2-bootstrap5" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-bootstrap5", + "type": "tidelift" + } + ], + "time": "2025-04-10T08:03:20+00:00" + }, + { + "name": "yiisoft/yii2-composer", + "version": "2.0.11", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-composer.git", + "reference": "b684b01ecb119c8287721def726a0e24fec2fef2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/b684b01ecb119c8287721def726a0e24fec2fef2", + "reference": "b684b01ecb119c8287721def726a0e24fec2fef2", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 | ^2.0" + }, + "require-dev": { + "composer/composer": "^1.0 | ^2.0@dev", + "phpunit/phpunit": "<7" + }, + "type": "composer-plugin", + "extra": { + "class": "yii\\composer\\Plugin", + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\composer\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com" + }, + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc" + } + ], + "description": "The composer plugin for Yii extension installer", + "keywords": [ + "composer", + "extension installer", + "yii2" + ], + "support": { + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii2-composer/issues", + "source": "https://github.com/yiisoft/yii2-composer", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-composer", + "type": "tidelift" + } + ], + "time": "2025-02-13T20:59:36+00:00" + }, + { + "name": "yiisoft/yii2-symfonymailer", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-symfonymailer.git", + "reference": "21f407239c51fc6d50d369e4469d006afa8c9b2c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-symfonymailer/zipball/21f407239c51fc6d50d369e4469d006afa8c9b2c", + "reference": "21f407239c51fc6d50d369e4469d006afa8c9b2c", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "1.0.0", + "symfony/mailer": "^6.4 || ^7.0", + "symfony/mime": "^6.4 || ^7.0", + "yiisoft/yii2": ">=2.0.4" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpunit/phpunit": "^10.5", + "roave/infection-static-analysis-plugin": "^1.34", + "symplify/easy-coding-standard": "^12.1", + "vimeo/psalm": "^5.20" + }, + "suggest": { + "yiisoft/yii2-psr-log-source": "Allows routing transport logs to your Yii2 logger" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "sort-packages": true + }, + "autoload": { + "psr-4": { + "yii\\symfonymailer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kirill Petrov", + "email": "archibeardrinker@gmail.com" + } + ], + "description": "The SymfonyMailer integration for the Yii framework", + "keywords": [ + "email", + "mail", + "mailer", + "symfony", + "symfonymailer", + "yii2" + ], + "support": { + "forum": "http://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii2-symfonymailer/issues", + "source": "https://github.com/yiisoft/yii2-symfonymailer", + "wiki": "http://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-symfonymailer", + "type": "tidelift" + } + ], + "time": "2024-01-29T14:13:45+00:00" + } + ], + "packages-dev": [ + { + "name": "behat/gherkin", + "version": "v4.14.0", + "source": { + "type": "git", + "url": "https://github.com/Behat/Gherkin.git", + "reference": "34c9b59c59355a7b4c53b9f041c8dbd1c8acc3b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/34c9b59c59355a7b4c53b9f041c8dbd1c8acc3b4", + "reference": "34c9b59c59355a7b4c53b9f041c8dbd1c8acc3b4", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "php": "8.1.* || 8.2.* || 8.3.* || 8.4.*" + }, + "require-dev": { + "cucumber/gherkin-monorepo": "dev-gherkin-v32.1.1", + "friendsofphp/php-cs-fixer": "^3.65", + "mikey179/vfsstream": "^1.6", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^2", + "phpstan/phpstan-phpunit": "^2", + "phpunit/phpunit": "^10.5", + "symfony/yaml": "^5.4 || ^6.4 || ^7.0" + }, + "suggest": { + "symfony/yaml": "If you want to parse features, represented in YAML files" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Behat\\Gherkin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "https://everzet.com" + } + ], + "description": "Gherkin DSL parser for PHP", + "homepage": "https://behat.org/", + "keywords": [ + "BDD", + "Behat", + "Cucumber", + "DSL", + "gherkin", + "parser" + ], + "support": { + "issues": "https://github.com/Behat/Gherkin/issues", + "source": "https://github.com/Behat/Gherkin/tree/v4.14.0" + }, + "time": "2025-05-23T15:06:40+00:00" + }, + { + "name": "codeception/c3", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/c3.git", + "reference": "e23298a1cd5e7745973ea26a53572a3d9b013439" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/c3/zipball/e23298a1cd5e7745973ea26a53572a3d9b013439", + "reference": "e23298a1cd5e7745973ea26a53572a3d9b013439", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.5.0" + }, + "require-dev": { + "composer/composer": "^1.0 || ^2.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Codeception\\c3\\Installer" + }, + "autoload": { + "psr-4": { + "Codeception\\c3\\": "." + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tiger Seo", + "email": "tiger.seo@gmail.com" + }, + { + "name": "Michael Bodnarchuk", + "email": "davert.php@codegyre.com", + "homepage": "http://codegyre.com" + } + ], + "description": "CodeCoverage collector for Codeception", + "homepage": "http://codeception.com/", + "keywords": [ + "code coverage", + "codecoverage" + ], + "support": { + "issues": "https://github.com/Codeception/c3/issues", + "source": "https://github.com/Codeception/c3/tree/2.9.0" + }, + "time": "2023-10-15T17:57:07+00:00" + }, + { + "name": "codeception/codeception", + "version": "5.3.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Codeception.git", + "reference": "582112d7a603d575e41638df1e96900b10ae91b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/582112d7a603d575e41638df1e96900b10ae91b8", + "reference": "582112d7a603d575e41638df1e96900b10ae91b8", + "shasum": "" + }, + "require": { + "behat/gherkin": "^4.12", + "codeception/lib-asserts": "^2.2", + "codeception/stub": "^4.1", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.2", + "phpunit/php-code-coverage": "^9.2 | ^10.0 | ^11.0 | ^12.0", + "phpunit/php-text-template": "^2.0 | ^3.0 | ^4.0 | ^5.0", + "phpunit/php-timer": "^5.0.3 | ^6.0 | ^7.0 | ^8.0", + "phpunit/phpunit": "^9.5.20 | ^10.0 | ^11.0 | ^12.0", + "psy/psysh": "^0.11.2 | ^0.12", + "sebastian/comparator": "^4.0.5 | ^5.0 | ^6.0 | ^7.0", + "sebastian/diff": "^4.0.3 | ^5.0 | ^6.0 | ^7.0", + "symfony/console": ">=5.4.24 <8.0", + "symfony/css-selector": ">=5.4.24 <8.0", + "symfony/event-dispatcher": ">=5.4.24 <8.0", + "symfony/finder": ">=5.4.24 <8.0", + "symfony/var-dumper": ">=5.4.24 <8.0", + "symfony/yaml": ">=5.4.24 <8.0" + }, + "conflict": { + "codeception/lib-innerbrowser": "<3.1.3", + "codeception/module-filesystem": "<3.0", + "codeception/module-phpbrowser": "<2.5" + }, + "replace": { + "codeception/phpunit-wrapper": "*" + }, + "require-dev": { + "codeception/lib-innerbrowser": "*@dev", + "codeception/lib-web": "*@dev", + "codeception/module-asserts": "*@dev", + "codeception/module-cli": "*@dev", + "codeception/module-db": "*@dev", + "codeception/module-filesystem": "*@dev", + "codeception/module-phpbrowser": "*@dev", + "codeception/module-webdriver": "*@dev", + "codeception/util-universalframework": "*@dev", + "doctrine/orm": "^3.3", + "ext-simplexml": "*", + "jetbrains/phpstorm-attributes": "^1.0", + "laravel-zero/phar-updater": "^1.4", + "php-webdriver/webdriver": "^1.15", + "stecman/symfony-console-completion": "^0.14", + "symfony/dotenv": ">=5.4.24 <8.0", + "symfony/error-handler": ">=5.4.24 <8.0", + "symfony/process": ">=5.4.24 <8.0", + "vlucas/phpdotenv": "^5.1" + }, + "suggest": { + "codeception/specify": "BDD-style code blocks", + "codeception/verify": "BDD-style assertions", + "ext-simplexml": "For loading params from XML files", + "stecman/symfony-console-completion": "For BASH autocompletion", + "symfony/dotenv": "For loading params from .env files", + "symfony/phpunit-bridge": "For phpunit-bridge support", + "vlucas/phpdotenv": "For loading params from .env files" + }, + "bin": [ + "codecept" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.2.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Codeception\\": "src/Codeception", + "Codeception\\Extension\\": "ext" + }, + "classmap": [ + "src/PHPUnit/TestCase.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert.ua@gmail.com", + "homepage": "https://codeception.com" + } + ], + "description": "BDD-style testing framework", + "homepage": "https://codeception.com/", + "keywords": [ + "BDD", + "TDD", + "acceptance testing", + "functional testing", + "unit testing" + ], + "support": { + "issues": "https://github.com/Codeception/Codeception/issues", + "source": "https://github.com/Codeception/Codeception/tree/5.3.2" + }, + "funding": [ + { + "url": "https://opencollective.com/codeception", + "type": "open_collective" + } + ], + "time": "2025-05-26T07:47:39+00:00" + }, + { + "name": "codeception/lib-asserts", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-asserts.git", + "reference": "06750a60af3ebc66faab4313981accec1be4eefc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/06750a60af3ebc66faab4313981accec1be4eefc", + "reference": "06750a60af3ebc66faab4313981accec1be4eefc", + "shasum": "" + }, + "require": { + "codeception/phpunit-wrapper": "^7.7.1 | ^8.0.3 | ^9.0", + "ext-dom": "*", + "php": "^7.4 | ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Assertion methods used by Codeception core and Asserts module", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-asserts/issues", + "source": "https://github.com/Codeception/lib-asserts/tree/2.2.0" + }, + "time": "2025-03-10T20:41:33+00:00" + }, + { + "name": "codeception/lib-innerbrowser", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-innerbrowser.git", + "reference": "74476dd019ec7900b26b7dca91a42fdcb04e549f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-innerbrowser/zipball/74476dd019ec7900b26b7dca91a42fdcb04e549f", + "reference": "74476dd019ec7900b26b7dca91a42fdcb04e549f", + "shasum": "" + }, + "require": { + "codeception/codeception": "^5.0.8", + "codeception/lib-web": "^1.0.1", + "ext-dom": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.1", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "symfony/browser-kit": "^4.4.24 || ^5.4 || ^6.0 || ^7.0", + "symfony/dom-crawler": "^4.4.30 || ^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "codeception/util-universalframework": "^1.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "https://codegyre.com" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Parent library for all Codeception framework modules and PhpBrowser", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-innerbrowser/issues", + "source": "https://github.com/Codeception/lib-innerbrowser/tree/4.0.6" + }, + "time": "2025-02-14T07:02:48+00:00" + }, + { + "name": "codeception/lib-web", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-web.git", + "reference": "1444ccc9b1d6721f3ced8703c8f4a9041b80df93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-web/zipball/1444ccc9b1d6721f3ced8703c8f4a9041b80df93", + "reference": "1444ccc9b1d6721f3ced8703c8f4a9041b80df93", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "guzzlehttp/psr7": "^2.0", + "php": "^8.1", + "phpunit/phpunit": "^9.5 | ^10.0 | ^11.0 | ^12", + "symfony/css-selector": ">=4.4.24 <8.0" + }, + "conflict": { + "codeception/codeception": "<5.0.0-alpha3" + }, + "require-dev": { + "php-webdriver/webdriver": "^1.12" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gintautas Miselis" + } + ], + "description": "Library containing files used by module-webdriver and lib-innerbrowser or module-phpbrowser", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-web/issues", + "source": "https://github.com/Codeception/lib-web/tree/1.0.7" + }, + "time": "2025-02-09T12:05:55+00:00" + }, + { + "name": "codeception/module-asserts", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-asserts.git", + "reference": "eb1f7c980423888f3def5116635754ae4a75bd47" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/eb1f7c980423888f3def5116635754ae4a75bd47", + "reference": "eb1f7c980423888f3def5116635754ae4a75bd47", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/lib-asserts": "^2.2", + "php": "^8.2" + }, + "conflict": { + "codeception/codeception": "<5.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Codeception module containing various assertions", + "homepage": "https://codeception.com/", + "keywords": [ + "assertions", + "asserts", + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/module-asserts/issues", + "source": "https://github.com/Codeception/module-asserts/tree/3.2.0" + }, + "time": "2025-05-02T02:33:11+00:00" + }, + { + "name": "codeception/module-filesystem", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-filesystem.git", + "reference": "0fd78cf941cb72dc2a650c6132c5999c26ad4f9a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-filesystem/zipball/0fd78cf941cb72dc2a650c6132c5999c26ad4f9a", + "reference": "0fd78cf941cb72dc2a650c6132c5999c26ad4f9a", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "php": "^8.0", + "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0" + }, + "conflict": { + "codeception/codeception": "<5.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Codeception module for testing local filesystem", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception", + "filesystem" + ], + "support": { + "issues": "https://github.com/Codeception/module-filesystem/issues", + "source": "https://github.com/Codeception/module-filesystem/tree/3.0.1" + }, + "time": "2023-12-08T19:23:28+00:00" + }, + { + "name": "codeception/module-yii2", + "version": "1.1.12", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-yii2.git", + "reference": "1ebe6bc2a7f307a6c246026a905612a40ef64859" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-yii2/zipball/1ebe6bc2a7f307a6c246026a905612a40ef64859", + "reference": "1ebe6bc2a7f307a6c246026a905612a40ef64859", + "shasum": "" + }, + "require": { + "codeception/codeception": "^5.0.8", + "codeception/lib-innerbrowser": "^3.0 | ^4.0", + "php": "^8.0" + }, + "require-dev": { + "codeception/module-asserts": ">= 3.0", + "codeception/module-filesystem": "> 3.0", + "codeception/verify": "^3.0", + "codemix/yii2-localeurls": "^1.7", + "phpstan/phpstan": "^1.10", + "yiisoft/yii2": "dev-master", + "yiisoft/yii2-app-advanced": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alexander Makarov" + }, + { + "name": "Sam Mouse" + }, + { + "name": "Michael Bodnarchuk" + } + ], + "description": "Codeception module for Yii2 framework", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception", + "yii2" + ], + "support": { + "issues": "https://github.com/Codeception/module-yii2/issues", + "source": "https://github.com/Codeception/module-yii2/tree/1.1.12" + }, + "time": "2024-12-09T14:34:26+00:00" + }, + { + "name": "codeception/stub", + "version": "4.1.4", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Stub.git", + "reference": "6ce453073a0c220b254dd7f4383645615e4071c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/6ce453073a0c220b254dd7f4383645615e4071c3", + "reference": "6ce453073a0c220b254dd7f4383645615e4071c3", + "shasum": "" + }, + "require": { + "php": "^7.4 | ^8.0", + "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | ^11 | ^12" + }, + "conflict": { + "codeception/codeception": "<5.0.6" + }, + "require-dev": { + "consolidation/robo": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", + "support": { + "issues": "https://github.com/Codeception/Stub/issues", + "source": "https://github.com/Codeception/Stub/tree/4.1.4" + }, + "time": "2025-02-14T06:56:33+00:00" + }, + { + "name": "codeception/verify", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Verify.git", + "reference": "2591031f88a38b3b679315eac2b95ddda025afde" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Verify/zipball/2591031f88a38b3b679315eac2b95ddda025afde", + "reference": "2591031f88a38b3b679315eac2b95ddda025afde", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": "^7.4 || ^8.0", + "phpunit/phpunit": "^9.6.11 || ^10.0 || ^11.0 || ^12.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Codeception/bootstrap.php" + ], + "psr-4": { + "Codeception\\": "src\\Codeception" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@codeception.com" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "BDD assertion library for PHPUnit", + "support": { + "issues": "https://github.com/Codeception/Verify/issues", + "source": "https://github.com/Codeception/Verify/tree/3.3.0" + }, + "time": "2025-04-16T07:12:02+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "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.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "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.7.1" + }, + "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": "2025-03-27T12:30:47+00:00" + }, + { + "name": "maglnet/composer-require-checker", + "version": "4.16.1", + "source": { + "type": "git", + "url": "https://github.com/maglnet/ComposerRequireChecker.git", + "reference": "2449a6298a0c39d940287d5d3afaf05a6f80fd0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maglnet/ComposerRequireChecker/zipball/2449a6298a0c39d940287d5d3afaf05a6f80fd0c", + "reference": "2449a6298a0c39d940287d5d3afaf05a6f80fd0c", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0.0", + "ext-phar": "*", + "nikic/php-parser": "^5.4.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", + "symfony/console": "^6.4.1 || ^7.0.1", + "webmozart/assert": "^1.11.0", + "webmozart/glob": "^4.7.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0.0", + "ext-zend-opcache": "*", + "phing/phing": "^3.0.1", + "phpstan/phpstan": "^2.1.2", + "phpunit/phpunit": "^11.5.7", + "psalm/plugin-phpunit": "^0.19.2", + "roave/infection-static-analysis-plugin": "^1.36.0", + "spatie/temporary-directory": "^2.3.0", + "vimeo/psalm": "^6.4.0" + }, + "bin": [ + "bin/composer-require-checker" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "ComposerRequireChecker\\": "src/ComposerRequireChecker" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.io/" + }, + { + "name": "Matthias Glaub", + "email": "magl@magl.net", + "homepage": "http://magl.net" + } + ], + "description": "CLI tool to analyze composer dependencies and verify that no unknown symbols are used in the sources of a package", + "homepage": "https://github.com/maglnet/ComposerRequireChecker", + "keywords": [ + "cli", + "composer", + "dependency", + "imports", + "require", + "requirements", + "static analysis" + ], + "support": { + "issues": "https://github.com/maglnet/ComposerRequireChecker/issues", + "source": "https://github.com/maglnet/ComposerRequireChecker/tree/4.16.1" + }, + "time": "2025-02-07T09:09:45+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + }, + "time": "2024-03-31T07:05:07+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.13.3", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "faed855a7b5f4d4637717c2b3863e277116beb36" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/faed855a7b5f4d4637717c2b3863e277116beb36", + "reference": "faed855a7b5f4d4637717c2b3863e277116beb36", + "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", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.3" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-07-05T12:25:42+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.5.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "ae59794362fe85e051a58ad36b289443f57be7a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9", + "reference": "ae59794362fe85e051a58ad36b289443f57be7a9", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0" + }, + "time": "2025-05-31T08:24:38+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpspec/php-diff", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/phpspec/php-diff.git", + "reference": "fc1156187f9f6c8395886fe85ed88a0a245d72e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/php-diff/zipball/fc1156187f9f6c8395886fe85ed88a0a245d72e9", + "reference": "fc1156187f9f6c8395886fe85ed88a0a245d72e9", + "shasum": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Diff": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Chris Boulton", + "homepage": "http://github.com/chrisboulton" + } + ], + "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", + "support": { + "source": "https://github.com/phpspec/php-diff/tree/v1.1.3" + }, + "time": "2020-09-18T13:47:07+00:00" + }, + { + "name": "phpstan/extension-installer", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.9.0 || ^2.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.4.3" + }, + "time": "2024-09-04T20:21:43+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "2.1.17", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/89b5ef665716fa2a52ecd2633f21007a6a349053", + "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2025-05-21T20:55:28+00:00" + }, + { + "name": "phpstan/phpstan-strict-rules", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-strict-rules.git", + "reference": "3e139cbe67fafa3588e1dbe27ca50f31fdb6236a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/3e139cbe67fafa3588e1dbe27ca50f31fdb6236a", + "reference": "3e139cbe67fafa3588e1dbe27ca50f31fdb6236a", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.0.4" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Extra strict and opinionated rules for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.4" + }, + "time": "2025-03-18T11:42:40+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "12.3.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "ddec29dfc128eba9c204389960f2063f3b7fa170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ddec29dfc128eba9c204389960f2063f3b7fa170", + "reference": "ddec29dfc128eba9c204389960f2063f3b7fa170", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.4.0", + "php": ">=8.3", + "phpunit/php-file-iterator": "^6.0", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.0", + "sebastian/lines-of-code": "^4.0", + "sebastian/version": "^6.0", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "12.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.3.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2025-06-18T08:58:13+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "961bc913d42fe24a257bfff826a5068079ac7782" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", + "reference": "961bc913d42fe24a257bfff826a5068079ac7782", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:37+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^12.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:58+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:16+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "8.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:38+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "12.2.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "638644c62a58f04974da115f98981c9b48564021" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/638644c62a58f04974da115f98981c9b48564021", + "reference": "638644c62a58f04974da115f98981c9b48564021", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.1", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.3.1", + "phpunit/php-file-iterator": "^6.0.0", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.0.0", + "sebastian/comparator": "^7.1.0", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.0.2", + "sebastian/exporter": "^7.0.0", + "sebastian/global-state": "^8.0.0", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/type": "^6.0.2", + "sebastian/version": "^6.0.0", + "staabm/side-effects-detector": "^1.0.5" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "12.2-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/12.2.6" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2025-07-04T06:00:16+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.9", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "1b801844becfe648985372cb4b12ad6840245ace" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/1b801844becfe648985372cb4b12ad6840245ace", + "reference": "1b801844becfe648985372cb4b12ad6840245ace", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.9" + }, + "time": "2025-06-23T02:35:06+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": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "d513dea45a94394b660e15c155d1fa27826f8e30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/d513dea45a94394b660e15c155d1fa27826f8e30", + "reference": "d513dea45a94394b660e15c155d1fa27826f8e30", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "phpstan/phpstan": "^2.1.17" + }, + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "suggest": { + "ext-dom": "To manipulate phpunit.xml via the custom-rule command" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "homepage": "https://getrector.com/", + "keywords": [ + "automation", + "dev", + "migration", + "refactoring" + ], + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2025-06-24T20:26:57+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "6d584c727d9114bcdc14c86711cd1cad51778e7c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/6d584c727d9114bcdc14c86711cd1cad51778e7c", + "reference": "6d584c727d9114bcdc14c86711cd1cad51778e7c", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:53:50+00:00" + }, + { + "name": "sebastian/comparator", + "version": "7.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "03d905327dccc0851c9a08d6a979dfc683826b6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/03d905327dccc0851c9a08d6a979dfc683826b6f", + "reference": "03d905327dccc0851c9a08d6a979dfc683826b6f", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.2" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2025-06-17T07:41:58+00:00" + }, + { + "name": "sebastian/complexity", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:55:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:55:46+00:00" + }, + { + "name": "sebastian/environment", + "version": "8.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "d364b9e5d0d3b18a2573351a1786fbf96b7e0792" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d364b9e5d0d3b18a2573351a1786fbf96b7e0792", + "reference": "d364b9e5d0d3b18a2573351a1786fbf96b7e0792", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/8.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2025-05-21T15:05:44+00:00" + }, + { + "name": "sebastian/exporter", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "76432aafc58d50691a00d86d0632f1217a47b688" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/76432aafc58d50691a00d86d0632f1217a47b688", + "reference": "76432aafc58d50691a00d86d0632f1217a47b688", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:56:42+00:00" + }, + { + "name": "sebastian/global-state", + "version": "8.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "570a2aeb26d40f057af686d63c4e99b075fb6cbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/570a2aeb26d40f057af686d63c4e99b075fb6cbc", + "reference": "570a2aeb26d40f057af686d63c4e99b075fb6cbc", + "shasum": "" + }, + "require": { + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:56:59+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:57:28+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "shasum": "" + }, + "require": { + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:57:48+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:17+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "c405ae3a63e01b32eb71577f8ec1604e39858a7c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/c405ae3a63e01b32eb71577f8ec1604e39858a7c", + "reference": "c405ae3a63e01b32eb71577f8ec1604e39858a7c", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T05:00:01+00:00" + }, + { + "name": "sebastian/type", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "1d7cd6e514384c36d7a390347f57c385d4be6069" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/1d7cd6e514384c36d7a390347f57c385d4be6069", + "reference": "1d7cd6e514384c36d7a390347f57c385d4be6069", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-18T13:37:31+00:00" + }, + { + "name": "sebastian/version", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T05:00:38+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "symfony/browser-kit", + "version": "v6.4.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "ce95f3e3239159e7fa3be7690c6ce95a4714637f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/ce95f3e3239159e7fa3be7690c6ce95a4714637f", + "reference": "ce95f3e3239159e7fa3be7690c6ce95a4714637f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/dom-crawler": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\BrowserKit\\": "" + }, + "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": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/browser-kit/tree/v6.4.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": "2025-02-14T11:23:16+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.3.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": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/dom-crawler", + "version": "v7.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "8b2ee2e06ab99fa5f067b6699296d4e35c156bb9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/8b2ee2e06ab99fa5f067b6699296d4e35c156bb9", + "reference": "8b2ee2e06ab99fa5f067b6699296d4e35c156bb9", + "shasum": "" + }, + "require": { + "masterminds/html5": "^2.6", + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "symfony/css-selector": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "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 DOM navigation for HTML and XML documents", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v7.3.1" + }, + "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": "2025-06-15T10:07:06+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "6e209fbe5f5a7b6043baba46fe5735a4b85d0d42" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6e209fbe5f5a7b6043baba46fe5735a4b85d0d42", + "reference": "6e209fbe5f5a7b6043baba46fe5735a4b85d0d42", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "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 mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.3.1" + }, + "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": "2025-06-27T19:55:54+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "0c3555045a46ab3cd4cc5a69d161225195230edb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/0c3555045a46ab3cd4cc5a69d161225195230edb", + "reference": "0c3555045a46ab3cd4cc5a69d161225195230edb", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "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/v7.3.1" + }, + "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": "2025-06-03T06:57:57+00:00" + }, + { + "name": "symplify/easy-coding-standard", + "version": "12.5.20", + "source": { + "type": "git", + "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", + "reference": "bb44b0fc70dd2148d8a6362bc66a35e23dc31bc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/bb44b0fc70dd2148d8a6362bc66a35e23dc31bc4", + "reference": "bb44b0fc70dd2148d8a6362bc66a35e23dc31bc4", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "conflict": { + "friendsofphp/php-cs-fixer": "<3.46", + "phpcsstandards/php_codesniffer": "<3.8", + "symplify/coding-standard": "<12.1" + }, + "suggest": { + "ext-dom": "Needed to support checkstyle output format in class CheckstyleOutputFormatter" + }, + "bin": [ + "bin/ecs" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Use Coding Standard with 0-knowledge of PHP-CS-Fixer and PHP_CodeSniffer", + "keywords": [ + "Code style", + "automation", + "fixer", + "static analysis" + ], + "support": { + "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.5.20" + }, + "funding": [ + { + "url": "https://www.paypal.me/rectorphp", + "type": "custom" + }, + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2025-05-30T11:42:07+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "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.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+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" + }, + { + "name": "webmozart/glob", + "version": "4.7.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/glob.git", + "reference": "8a2842112d6916e61e0e15e316465b611f3abc17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/glob/zipball/8a2842112d6916e61e0e15e316465b611f3abc17", + "reference": "8a2842112d6916e61e0e15e316465b611f3abc17", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "symfony/filesystem": "^5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Glob\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "A PHP implementation of Ant's glob.", + "support": { + "issues": "https://github.com/webmozarts/glob/issues", + "source": "https://github.com/webmozarts/glob/tree/4.7.0" + }, + "time": "2024-03-07T20:33:40+00:00" + }, + { + "name": "yii2-extensions/phpstan", + "version": "0.3.0", + "source": { + "type": "git", + "url": "https://github.com/yii2-extensions/phpstan.git", + "reference": "e3647c8bbd61bb85b3a4a21a1e2bc8ef0a86836c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yii2-extensions/phpstan/zipball/e3647c8bbd61bb85b3a4a21a1e2bc8ef0a86836c", + "reference": "e3647c8bbd61bb85b3a4a21a1e2bc8ef0a86836c", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.1|^5.4.0", + "php": ">=8.1", + "phpstan/phpstan": "^2.1", + "yiisoft/yii2": "^2.0.53|^22" + }, + "require-dev": { + "maglnet/composer-require-checker": "^4.7", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0.3", + "phpunit/phpunit": "^10.2", + "symplify/easy-coding-standard": "^12.1" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "0.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii2\\extensions\\phpstan\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PHPStan extension for Yii2", + "keywords": [ + "PHPStan", + "yii2" + ], + "support": { + "issues": "https://github.com/yii2-extensions/phpstan/issues", + "source": "https://github.com/yii2-extensions/phpstan/tree/0.3.0" + }, + "funding": [ + { + "url": "https://github.com/terabytesoftw", + "type": "github" + } + ], + "time": "2025-06-27T09:08:58+00:00" + }, + { + "name": "yiisoft/yii2-debug", + "version": "2.1.27", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-debug.git", + "reference": "44e158914911ef81cd7111fd6d46b918f65fae7c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/44e158914911ef81cd7111fd6d46b918f65fae7c", + "reference": "44e158914911ef81cd7111fd6d46b918f65fae7c", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.4", + "yiisoft/yii2": "~2.0.13" + }, + "require-dev": { + "cweagans/composer-patches": "^1.7", + "phpunit/phpunit": "4.8.34", + "yiisoft/yii2-coding-standards": "~2.0", + "yiisoft/yii2-swiftmailer": "*" + }, + "type": "yii2-extension", + "extra": { + "patches": { + "phpunit/phpunit": { + "Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch", + "Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch", + "Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php81.patch" + }, + "phpunit/phpunit-mock-objects": { + "Fix PHP 7 and 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_mock_objects.patch" + } + }, + "branch-alias": { + "dev-master": "2.0.x-dev" + }, + "composer-exit-on-patch-failure": true + }, + "autoload": { + "psr-4": { + "yii\\debug\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com" + }, + { + "name": "Simon Karlen", + "email": "simi.albi@outlook.com" + } + ], + "description": "The debugger extension for the Yii framework", + "keywords": [ + "debug", + "debugger", + "dev", + "yii2" + ], + "support": { + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii2-debug/issues", + "source": "https://github.com/yiisoft/yii2-debug", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-debug", + "type": "tidelift" + } + ], + "time": "2025-06-08T13:32:11+00:00" + }, + { + "name": "yiisoft/yii2-gii", + "version": "2.2.7", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-gii.git", + "reference": "f17c7ef7ef3081213f612b37ad0ceaa8e8cd3d3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-gii/zipball/f17c7ef7ef3081213f612b37ad0ceaa8e8cd3d3b", + "reference": "f17c7ef7ef3081213f612b37ad0ceaa8e8cd3d3b", + "shasum": "" + }, + "require": { + "phpspec/php-diff": "^1.1.0", + "yiisoft/yii2": "~2.0.46" + }, + "require-dev": { + "cweagans/composer-patches": "^1.7", + "phpunit/phpunit": "4.8.34", + "yiisoft/yii2-coding-standards": "~2.0" + }, + "type": "yii2-extension", + "extra": { + "patches": { + "phpunit/phpunit": { + "Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch", + "Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch", + "Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php81.patch" + }, + "phpunit/php-file-iterator": { + "Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_path_file_iterator.patch" + }, + "phpunit/phpunit-mock-objects": { + "Fix PHP 7 and 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_mock_objects.patch" + } + }, + "branch-alias": { + "dev-master": "2.0.x-dev" + }, + "composer-exit-on-patch-failure": true + }, + "autoload": { + "psr-4": { + "yii\\gii\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com" + } + ], + "description": "The Gii extension for the Yii framework", + "keywords": [ + "code generator", + "dev", + "gii", + "yii2" + ], + "support": { + "forum": "https://www.yiiframework.com/forum/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii2-gii/issues", + "source": "https://github.com/yiisoft/yii2-gii", + "wiki": "https://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-gii", + "type": "tidelift" + } + ], + "time": "2025-02-13T21:21:17+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "ui-awesome/html-component-bootstrap5": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=8.1" + }, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/config/build-test.php b/config/build-test.php deleted file mode 100644 index 326a615..0000000 --- a/config/build-test.php +++ /dev/null @@ -1,17 +0,0 @@ -get('web'); diff --git a/config/common/components.php b/config/common/components.php index 3aaad16..c6a318e 100644 --- a/config/common/components.php +++ b/config/common/components.php @@ -4,24 +4,28 @@ use yii\caching\FileCache; use yii\log\FileTarget; +use yii\symfonymailer\Mailer; -/** - * @var array $params - */ return [ - 'components' => [ - 'cache' => [ - 'class' => FileCache::class, - ], - 'log' => [ - 'traceLevel' => 'YII_DEBUG' ? 3 : 0, - 'targets' => [ - [ - 'class' => FileTarget::class, - 'levels' => $params['common.log.levels'], - 'logFile' => $params['common.log.logFile'], + 'cache' => [ + 'class' => FileCache::class, + ], + 'log' => [ + 'traceLevel' => YII_DEBUG ? 3 : 0, + 'targets' => [ + [ + 'class' => FileTarget::class, + 'levels' => [ + 'error', + 'info', + 'warning', ], + 'logFile' => '@runtime/logs/app.log', ], ], ], + 'mailer' => [ + 'class' => Mailer::class, + 'useFileTransport' => true, + ], ]; diff --git a/config/common/container.php b/config/common/container.php deleted file mode 100644 index 0e33de2..0000000 --- a/config/common/container.php +++ /dev/null @@ -1,18 +0,0 @@ - [ - 'definitions' => [ - Mailer::class => [ - 'useFileTransport' => $params['common.mailer.useFileTransport'], - ], - ], - ], -]; diff --git a/config/config-plugin.php b/config/config-plugin.php deleted file mode 100644 index 8afc730..0000000 --- a/config/config-plugin.php +++ /dev/null @@ -1,34 +0,0 @@ - [ - 'common' => 'common/*.php', - 'console' => [ - '$common', - 'console/*.php', - ], - 'web' => [ - '$common', - 'web/*.php', - ], - 'params' => 'params.php', - 'params-console' => [ - '$params', - 'params-console.php', - ], - 'params-web' => [ - '$params', - 'params-web.php', - ], - ], - 'config-plugin-options' => [ - 'package-types' => [ - 'composer-plugin', - 'library', - 'yii2-extension', - ], - 'source-directory' => 'config', - ], -]; diff --git a/config/console/app.php b/config/console/app.php index f797d18..1910665 100644 --- a/config/console/app.php +++ b/config/console/app.php @@ -2,15 +2,30 @@ declare(strict_types=1); -/** - * @var array $params - */ +use app\usecase\hello\HelloController; +use yii\console\controllers\ServeController; + +/** @var string[] $components */ +$components = require dirname(__DIR__) . '/common/components.php'; +/** @var string[] $params */ +$params = require dirname(__DIR__) . '/params-console.php'; + return [ - 'id' => $params['console.id'], - 'aliases' => $params['common.aliases'], + 'id' => 'console.basic', + 'aliases' => [ + '@root' => dirname(__DIR__, 2), + ], 'basePath' => dirname(__DIR__, 2), - 'bootstrap' => $params['common.bootstrap'], - 'controllerMap' => $params['console.controllerMap'], - 'params' => $params['console.params'], - 'runtimePath' => $params['common.runtime.path'], + 'bootstrap' => [ + 'log', + ], + 'components' => $components, + 'controllerMap' => [ + 'hello' => HelloController::class, + 'serve' => [ + 'class' => ServeController::class, + 'docroot' => '@app/public', + ], + ], + 'params' => $params, ]; diff --git a/config/messages.php b/config/messages.php index 77f9ac4..7f16a65 100644 --- a/config/messages.php +++ b/config/messages.php @@ -5,7 +5,7 @@ /** * This is a configuration file for the [[\yii\console\controllers\MessageController]] console command. * - * In order to update translations, run the following console command: + * To update translations, run the following console command: * php yii message messages/config.php * * @see yii\console\controllers\MessageController @@ -19,7 +19,7 @@ 'languages' => ['de', 'es', 'fr', 'pt', 'ru', 'zh'], // string, the name of the function for translating messages. // Defaults to 'Yii::t'. This is used as a mark to find the messages to be - // translated. You may use a string for single function name or an array for + // translated. You may use a string for a single function name or an array for // multiple function names. 'translator' => ['Yii::t'], // boolean, whether to sort messages by keys when merging new messages @@ -33,7 +33,7 @@ // If empty or not set, all files will be processed. // Please refer to "except" for details about the patterns. 'only' => ['*.php'], - // array, list of patterns that specify which files/directories should NOT be processed. + // array, list of patterns that specify which files/directories shouldn't be processed. // If empty or not set, all files/directories will be processed. // A path matches a pattern if it contains the pattern string at its end. For example, // '/a/b' will match all files and directories ending with '/a/b'; diff --git a/config/params-console.php b/config/params-console.php index 0e6983a..0dae23d 100644 --- a/config/params-console.php +++ b/config/params-console.php @@ -2,19 +2,4 @@ declare(strict_types=1); -use app\usecase\hello\HelloController; -use yii\console\controllers\ServeController; - -$rootDir = dirname(__DIR__); - -return [ - 'console.id' => 'console.basic', - 'console.controllerMap' => [ - 'hello' => HelloController::class, - 'serve' => [ - 'class' => ServeController::class, - 'docroot' => "$rootDir/public", - ], - ], - 'console.params' => [], -]; +return []; diff --git a/config/params-web.php b/config/params-web.php index 7cfe514..0dae23d 100644 --- a/config/params-web.php +++ b/config/params-web.php @@ -2,80 +2,4 @@ declare(strict_types=1); -use app\usecase\contact\ContactController; -use app\usecase\site\SiteController; - -return [ - // web application settings shared - 'common.aliases' => [ - '@npm' => '@app/node_modules', - '@public' => '@app/public', - '@web' => '@public', - '@runtime' => '@public/runtime', - ], - 'web.assetManager.basePath' => '@public/assets', - 'web.controllerMap' => [ - 'contact' => [ - 'class' => ContactController::class, - ], - 'site' => [ - 'class' => SiteController::class, - ], - ], - 'web.errorHandler.errorAction' => 'site/404', - 'web.id' => 'web.basic', - 'web.language' => 'en-US', - 'web.name' => 'Web application basic', - 'web.params' => [ - 'app.localeurls.languages' => [ - 'de' => 'de-DE', - 'en' => 'en-US', - 'es' => 'es-ES', - 'fr' => 'fr-FR', - 'pt' => 'pt-BR', - 'ru' => 'ru-RU', - 'zh' => 'zh-CN', - ], - 'app.mailer.sender' => 'noreply@example.com', - 'app.mailer.sender.name' => 'Web application basic', - 'app.menu.isguest' => [ - [ - 'label' => 'Home', - 'link' => ['/site/index'], - 'order' => 0, - 'category' => 'app.basic', - ], - [ - 'label' => 'About', - 'link' => ['/site/about'], - 'order' => 1, - 'category' => 'app.basic', - ], - [ - 'label' => 'Contact', - 'link' => ['/contact/index'], - 'order' => 2, - 'category' => 'app.basic', - ], - ], - 'app.menu.islogged' => [], - ], - 'web.request.cookieValidationKey' => 'your-cookie-validation-key', - 'web.request.enableCsrfValidation' => true, - 'web.urlManager.enablePrettyUrl' => true, - 'web.urlManager.showScriptName' => false, - - // yii2 extensions settings - 'yii2.debug' => false, - 'yii2.gii' => false, - 'yii2.localeurls.languages' => [ - 'de' => 'de-DE', - 'en' => 'en-US', - 'es' => 'es-ES', - 'fr' => 'fr-FR', - 'pt' => 'pt-BR', - 'ru' => 'ru-RU', - 'zh' => 'zh-CN', - ], - 'yii2.ulrManager.class' => null, -]; +return []; diff --git a/config/params.php b/config/params.php deleted file mode 100644 index d8ffb63..0000000 --- a/config/params.php +++ /dev/null @@ -1,18 +0,0 @@ - [ - '@app' => $rootDir, - '@resource' => '@app/src/framework/resource', - ], - 'common.bootstrap' => ['log'], - 'common.log.levels' => ['error', 'warning', 'info'], - 'common.log.logFile' => '@runtime/logs/app.log', - 'common.mailer.useFileTransport' => true, - 'common.root.dir' => $rootDir, - 'common.runtime.path' => $rootDir . '/public/runtime', -]; diff --git a/config/web/app.php b/config/web/app.php index 12aa799..5b31419 100644 --- a/config/web/app.php +++ b/config/web/app.php @@ -2,17 +2,69 @@ declare(strict_types=1); -/** - * @var array $params - */ -return [ - 'id' => $params['web.id'], - 'aliases' => $params['common.aliases'], - 'basePath' => $params['common.root.dir'], - 'bootstrap' => $params['common.bootstrap'], - 'controllerMap' => $params['web.controllerMap'], - 'language' => $params['web.language'], - 'name' => $params['web.name'], - 'params' => $params['web.params'], - 'runtimePath' => $params['common.runtime.path'], +use app\framework\event\ContactEventHandler; +use app\usecase\contact\ContactController; +use app\usecase\security\SecurityController; +use app\usecase\site\SiteController; + +/** @phpstan-var string[] $components */ +$components = require __DIR__ . '/components.php'; +/** @phpstan-var string[] $modules */ +$modules = require __DIR__ . '/modules.php'; +/** @phpstan-var string[] $params */ +$params = require dirname(__DIR__) . '/params-web.php'; + +$rootDir = dirname(__DIR__, 2); + +$config = [ + 'id' => 'web.basic', + 'aliases' => [ + '@root' => $rootDir, + '@npm' => '@root/node_modules', + '@bower' => '@npm', + '@public' => '@root/public', + '@resource' => '@root/src/framework/resource', + '@runtime' => '@root/runtime', + '@web' => '/', + ], + 'basePath' => $rootDir, + 'bootstrap' => [ + ContactEventHandler::class, + 'log', + ], + 'components' => $components, + 'controllerMap' => [ + 'contact' => [ + 'class' => ContactController::class, + ], + 'security' => [ + 'class' => SecurityController::class, + ], + 'site' => [ + 'class' => SiteController::class, + ], + ], + 'language' => 'en-US', + 'modules' => $modules, + 'name' => 'Web application basic', + 'params' => $params, ]; + +if (YII_ENV_DEV) { + // configuration adjustments for 'dev' environment + $config['bootstrap'][] = 'debug'; + $config['modules']['debug'] = [ + 'class' => yii\debug\Module::class, + // uncomment the following to add your IP if you aren't connecting from localhost. + //'allowedIPs' => ['127.0.0.1', '::1'], + ]; + + $config['bootstrap'][] = 'gii'; + $config['modules']['gii'] = [ + 'class' => yii\gii\Module::class, + // uncomment the following to add your IP if you aren't connecting from localhost. + //'allowedIPs' => ['127.0.0.1', '::1'], + ]; +} + +return $config; diff --git a/config/web/bootstrap.php b/config/web/bootstrap.php deleted file mode 100644 index 09ffbac..0000000 --- a/config/web/bootstrap.php +++ /dev/null @@ -1,11 +0,0 @@ - [ - ContactEventHandler::class, - ], -]; diff --git a/config/web/components.php b/config/web/components.php index 259afbb..de6d2d3 100644 --- a/config/web/components.php +++ b/config/web/components.php @@ -2,38 +2,54 @@ declare(strict_types=1); -use yii2\extensions\localeurls\UrlLanguageManager; +use app\usecase\security\Identity; use yii\i18n\PhpMessageSource; +use yii\web\User; +use yii2\extensions\localeurls\UrlLanguageManager; -/** - * @var array $params - */ -return [ - 'components' => [ - 'assetManager' => [ - 'basePath' => $params['web.assetManager.basePath'], - ], - 'errorHandler' => [ - 'errorAction' => $params['web.errorHandler.errorAction'], - ], - 'i18n' => [ - 'translations' => [ - 'app.basic' => [ - 'class' => PhpMessageSource::class, - 'basePath' => '@resource/message', - 'sourceLanguage' => 'en', - ], +/** @phpstan-var string[] $commonComponents */ +$commonComponents = require dirname(__DIR__) . '/common/components.php'; + +$config = [ + 'assetManager' => [ + 'basePath' => '@public/assets', + ], + 'errorHandler' => [ + 'errorAction' => 'site/404', + ], + 'i18n' => [ + 'translations' => [ + 'app.basic' => [ + 'class' => PhpMessageSource::class, + 'basePath' => '@resource/message', + 'sourceLanguage' => 'en', ], ], - 'request' => [ - 'cookieValidationKey' => $params['web.request.cookieValidationKey'], - 'enableCsrfValidation' => $params['web.request.enableCsrfValidation'], - ], - 'urlManager' => [ - 'class' => UrlLanguageManager::class, - 'languages' => $params['yii2.localeurls.languages'], - 'enablePrettyUrl' => $params['web.urlManager.enablePrettyUrl'], - 'showScriptName' => $params['web.urlManager.showScriptName'], + ], + 'request' => [ + 'cookieValidationKey' => 'your-cookie-validation-key', + 'enableCsrfValidation' => YII_ENV_DEV === false, + ], + 'urlManager' => [ + 'class' => UrlLanguageManager::class, + 'languages' => [ + 'de' => 'de-DE', + 'en' => 'en-US', + 'es' => 'es-ES', + 'fr' => 'fr-FR', + 'pt' => 'pt-BR', + 'ru' => 'ru-RU', + 'zh' => 'zh-CN', ], + 'enablePrettyUrl' => true, + 'showScriptName' => false, + ], + 'user' => [ + 'class' => User::class, + 'identityClass' => Identity::class, ], ]; + +$config += $commonComponents; + +return $config; diff --git a/config/web/container.php b/config/web/container.php deleted file mode 100644 index 533ae9c..0000000 --- a/config/web/container.php +++ /dev/null @@ -1,18 +0,0 @@ - [ - 'singletons' => [ - Session::class => static function (): Session { - return new Session(); - }, - ], - ], -]; diff --git a/config/web/extension.php b/config/web/extension.php deleted file mode 100644 index 8fab340..0000000 --- a/config/web/extension.php +++ /dev/null @@ -1,24 +0,0 @@ - 'yii\debug\Module', - // uncomment the following to add your IP if you are not connecting from localhost. - //'allowedIPs' => ['127.0.0.1', '::1'], - ]; - - $config['bootstrap'][] = 'gii'; - $config['modules']['gii'] = [ - 'class' => 'yii\gii\Module', - // uncomment the following to add your IP if you are not connecting from localhost. - //'allowedIPs' => ['127.0.0.1', '::1'], - ]; -} - -return $config; diff --git a/ecs.php b/ecs.php index 2b9a33f..71b62a9 100644 --- a/ecs.php +++ b/ecs.php @@ -2,31 +2,45 @@ declare(strict_types=1); -use PhpCsFixer\Fixer\ClassNotation\ClassDefinitionFixer; -use PhpCsFixer\Fixer\ClassNotation\OrderedClassElementsFixer; -use PhpCsFixer\Fixer\ClassNotation\OrderedTraitsFixer; -use PhpCsFixer\Fixer\ClassNotation\VisibilityRequiredFixer; -use PhpCsFixer\Fixer\Import\NoUnusedImportsFixer; -use PhpCsFixer\Fixer\Import\OrderedImportsFixer; -use PhpCsFixer\Fixer\StringNotation\SingleQuoteFixer; -use Symplify\EasyCodingStandard\Config\ECSConfig; - -return ECSConfig::configure() +return Symplify\EasyCodingStandard\Config\ECSConfig::configure() ->withConfiguredRule( - ClassDefinitionFixer::class, + PhpCsFixer\Fixer\ClassNotation\ClassDefinitionFixer::class, [ 'space_before_parenthesis' => true, ], ) ->withConfiguredRule( - OrderedImportsFixer::class, + PhpCsFixer\Fixer\ClassNotation\OrderedClassElementsFixer::class, + [ + 'order' => [ + 'use_trait', + 'constant_public', + 'constant_protected', + 'constant_private', + 'case', + 'property_public', + 'property_protected', + 'property_private', + 'construct', + 'destruct', + 'magic', + 'phpunit', + 'method_public', + 'method_protected', + 'method_private', + ], + 'sort_algorithm' => 'alpha', + ], + ) + ->withConfiguredRule( + PhpCsFixer\Fixer\Import\OrderedImportsFixer::class, [ 'imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha', ], ) ->withConfiguredRule( - VisibilityRequiredFixer::class, + PhpCsFixer\Fixer\ClassNotation\VisibilityRequiredFixer::class, [ 'elements' => [], ], @@ -48,16 +62,8 @@ ) ->withRules( [ - NoUnusedImportsFixer::class, - OrderedClassElementsFixer::class, - OrderedTraitsFixer::class, - SingleQuoteFixer::class, + PhpCsFixer\Fixer\ClassNotation\OrderedTraitsFixer::class, + PhpCsFixer\Fixer\Import\NoUnusedImportsFixer::class, + PhpCsFixer\Fixer\StringNotation\SingleQuoteFixer::class, ] - ) - ->withSkip( - [ - '*/src/framework/resource/layout/*', - '*/src/usecase/contact/view/*', - '*/src/usecase/site/view/*', - ], ); diff --git a/package.json b/package.json index 34c4ff4..e2ece03 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,28 @@ { + "name": "@yii2-extensions/app-basic", + "version": "0.1.0", + "description": "A modern PHP framework designed for professional Web development", "dependencies": { - "@fortawesome/fontawesome-free": "^6.7.2", - "flag-icons": "^7.5.0" + "bootstrap": "^5.3.2", + "bootstrap-icons": "^1.10.5", + "flag-icons": "^7.5.0", + "inputmask": "^5.0.8", + "jquery": "~3.6.4", + "jquery-pjax": "^2.0.1", + "punycode": "^1.4.0", + "yii2-pjax": "^2.0.8" + }, + "keywords": [ + "php", + "framework" + ], + "license": "BSD-3-Clause", + "bugs": { + "url": "https://github.com/yii2-extensions/app-basic/issues" + }, + "homepage": "https://github.com/yii2-extensions/app-basic", + "repository": { + "type": "git", + "url": "https://github.com/yii2-extensions/app-basic.git" } } diff --git a/phpstan.neon b/phpstan.neon index 0f7ce0b..ced0425 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,8 +1,29 @@ +includes: + - phar://phpstan.phar/conf/bleedingEdge.neon + parameters: bootstrapFiles: - tests/_bootstrap.php - level: 9 + level: max paths: + - config - src + - tests/Acceptance + - tests/Functional + - tests/Unit + + tmpDir: %currentWorkingDirectory%/runtime + + yii2: + config_path: %currentWorkingDirectory%/config/web/app.php + + # Enable strict advanced checks + checkImplicitMixed: true + checkBenevolentUnionTypes: true + checkUninitializedProperties: true + checkTooWideReturnTypesInProtectedAndPublicMethods: true + reportAnyTypeWideningInVarTag: true + reportPossiblyNonexistentConstantArrayOffset: true + reportPossiblyNonexistentGeneralArrayOffset: true diff --git a/public/index.php b/public/index.php index 763bf96..6f6f2bd 100644 --- a/public/index.php +++ b/public/index.php @@ -3,9 +3,6 @@ declare(strict_types=1); use yii\web\Application; -use Yiisoft\Config\Config; -use Yiisoft\Config\ConfigPaths; -use Yiisoft\Config\Modifier\RecursiveMerge; defined('YII_DEBUG') || define('YII_DEBUG', false); defined('YII_ENV') || define('YII_ENV', 'prod'); @@ -21,12 +18,7 @@ require_once __DIR__ . '/../vendor/autoload.php'; require_once __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; -$config = new Config( - new ConfigPaths(dirname(__DIR__), 'config', 'vendor'), - modifiers: [RecursiveMerge::groups('web', 'params', 'params-web')], - paramsGroup: 'params-web', -); +$config = require dirname(__DIR__) . '/config/web/app.php'; -$container = Yii::$container->setSingleton(Application::class, $config->get('web')); -$app = Yii::$container->get(Application::class); +$app = new Application($config); $app->run(); diff --git a/rector.php b/rector.php index e889653..4a7a938 100644 --- a/rector.php +++ b/rector.php @@ -16,8 +16,8 @@ $rectorConfig->sets( [ - Rector\Set\ValueObject\SetList::PHP_82, - Rector\Set\ValueObject\LevelSetList::UP_TO_PHP_82, + Rector\Set\ValueObject\SetList::PHP_81, + Rector\Set\ValueObject\LevelSetList::UP_TO_PHP_81, Rector\Set\ValueObject\SetList::TYPE_DECLARATION, ], ); diff --git a/tests/Support/_generated/.gitignore b/runtime/.gitignore similarity index 100% rename from tests/Support/_generated/.gitignore rename to runtime/.gitignore diff --git a/runtime/output/.gitkeep b/runtime/output/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/framework/ApplicationParameters.php b/src/framework/ApplicationParameters.php new file mode 100644 index 0000000..acf0c7f --- /dev/null +++ b/src/framework/ApplicationParameters.php @@ -0,0 +1,86 @@ +, + * order?: int, category?: string, + * linkAttributes?: array + * } + * > + */ +final class ApplicationParameters +{ + public static function getMailerSender(): string + { + return 'noreply@example.com'; + } + + public static function getMailerSenderName(): string + { + return 'Web application basic'; + } + + /** + * @phpstan-return MenuItem + */ + public static function getMenuIsGuest(): array + { + return [ + [ + 'label' => 'Home', + 'url' => [ + '/site/index', + ], + 'order' => 0, + 'category' => 'app.basic', + ], + [ + 'label' => 'About', + 'url' => [ + '/site/about', + ], + 'order' => 1, + 'category' => 'app.basic', + ], + [ + 'label' => 'Contact', + 'url' => [ + '/contact/index', + ], + 'order' => 2, + 'category' => 'app.basic', + ], + [ + 'label' => 'Login', + 'url' => [ + '/security/login', + ], + 'order' => 3, + ], + ]; + } + + /** + * @phpstan-return MenuItem + */ + public static function getMenuIsLogged(): array + { + return [ + [ + 'label' => 'Logout', + 'url' => ['/security/logout'], + 'linkOptions' => [ + 'class' => 'nav-link', + 'data-method' => 'post', + ], + 'order' => 1, + ], + ]; + } +} diff --git a/src/framework/asset/AppAsset.php b/src/framework/asset/AppAsset.php index 83b9e27..dc03f20 100644 --- a/src/framework/asset/AppAsset.php +++ b/src/framework/asset/AppAsset.php @@ -4,13 +4,13 @@ namespace app\framework\asset; -use yii\bootstrap5\{BootstrapAsset, BootstrapIconAsset, BootstrapPluginAsset}; -use yii\web\{AssetBundle, YiiAsset}; +use yii\bootstrap5\BootstrapAsset; +use yii\bootstrap5\BootstrapPluginAsset; +use yii\web\AssetBundle; +use yii\web\YiiAsset; final class AppAsset extends AssetBundle { - public $sourcePath = __DIR__ . '/../resource/'; - public $css = [ 'css/site.css', ]; @@ -22,9 +22,5 @@ final class AppAsset extends AssetBundle YiiAsset::class, ]; - public $publishOptions = [ - 'only' => [ - 'site.css', - ], - ]; + public $sourcePath = __DIR__ . '/../resource/'; } diff --git a/src/framework/asset/BootstrapIconAsset.php b/src/framework/asset/BootstrapIconAsset.php new file mode 100644 index 0000000..b610ef4 --- /dev/null +++ b/src/framework/asset/BootstrapIconAsset.php @@ -0,0 +1,16 @@ + View::POS_HEAD, ]; - public $depends = [ - BootstrapAsset::class, - ]; + public $sourcePath = __DIR__ . '/../resource/js/'; } diff --git a/src/framework/event/ContactEventHandler.php b/src/framework/event/ContactEventHandler.php index c741138..c5f9843 100644 --- a/src/framework/event/ContactEventHandler.php +++ b/src/framework/event/ContactEventHandler.php @@ -4,9 +4,10 @@ namespace app\framework\event; -use app\usecase\contact\{ContactEvent, IndexAction}; -use Yii; -use yii\base\{BootstrapInterface, Event}; +use app\usecase\contact\ContactEvent; +use app\usecase\contact\IndexAction; +use yii\base\BootstrapInterface; +use yii\base\Event; final class ContactEventHandler implements BootstrapInterface { @@ -16,11 +17,11 @@ public function bootstrap($app): void IndexAction::class, ContactEvent::EVENT_AFTER_SEND, static function () use ($app): void { - $title = Yii::t( + $title = \Yii::t( 'app.basic', 'Message sent successfully!.', ); - $message = Yii::t( + $message = \Yii::t( 'app.basic', 'Thank you for contacting us. We will respond to you as soon as possible.', ); diff --git a/src/framework/resource/css/site.css b/src/framework/resource/css/site.css index 9485f18..09cba52 100644 --- a/src/framework/resource/css/site.css +++ b/src/framework/resource/css/site.css @@ -1,7 +1,6 @@ /** * Css web application basic */ - :root { --input-padding-x: .75rem; --input-padding-y: .75rem; @@ -44,7 +43,16 @@ html, body { } [data-bs-theme=dark] #contactform-verifycode-image { - background-color: var(--bs-secondary-color); + background-color: var(--bs-secondary-bg); border: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 1px 3px rgba(0,0,0,0.3); + filter: invert(1) hue-rotate(180deg); +} + +[data-bs-theme=dark] .login-info { + background-color: var(--bs-secondary-bg); +} + +[data-bs-theme=dark] .login-info-user { + color: var(--bs-white); } diff --git a/src/framework/resource/js/toggle-theme.js b/src/framework/resource/js/toggle-theme.js index d43584c..07d1bb2 100644 --- a/src/framework/resource/js/toggle-theme.js +++ b/src/framework/resource/js/toggle-theme.js @@ -1,42 +1,119 @@ +/*! + * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/) + * Copyright 2011-2025 The Bootstrap Authors + * Licensed under the Creative Commons Attribution 3.0 Unported License. + */ + (() => { - 'use strict'; + 'use strict' + + const getStoredTheme = () => localStorage.getItem('theme') + const setStoredTheme = theme => localStorage.setItem('theme', theme) + + const getPreferredTheme = () => { + const storedTheme = getStoredTheme() + if (storedTheme) { + return storedTheme + } + + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' + } + + const setTheme = theme => { + if (theme === 'auto') { + document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')) + } else { + document.documentElement.setAttribute('data-bs-theme', theme) + } + } + + setTheme(getPreferredTheme()) + + const showActiveTheme = (theme, focus = false) => { + // Original Bootstrap theme switcher logic + const themeSwitcher = document.querySelector('#bd-theme') + + if (themeSwitcher) { + const themeSwitcherText = document.querySelector('#bd-theme-text') + const activeThemeIcon = document.querySelector('.theme-icon-active use') + const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`) - const getStoredTheme = () => localStorage.getItem('theme'); - const setStoredTheme = theme => localStorage.setItem('theme', theme); + if (btnToActive) { + const svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href') - const setTheme = theme => { - document.documentElement.setAttribute('data-bs-theme', theme); - }; + document.querySelectorAll('[data-bs-theme-value]').forEach(element => { + element.classList.remove('active') + element.setAttribute('aria-pressed', 'false') + }) - const showActiveTheme = (theme, focus = false) => { - const themeToggle = document.querySelector('#theme-toggle'); - const moonIcon = themeToggle.querySelector('#theme-dark-icon'); - const sunIcon = themeToggle.querySelector('#theme-light-icon'); + btnToActive.classList.add('active') + btnToActive.setAttribute('aria-pressed', 'true') + activeThemeIcon.setAttribute('href', svgOfActiveBtn) + const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})` + themeSwitcher.setAttribute('aria-label', themeSwitcherLabel) - if (!themeToggle || !moonIcon || !sunIcon) { - return; + if (focus) { + themeSwitcher.focus() } + } + } - if (theme === 'dark') { - moonIcon.classList.remove('d-none'); - sunIcon.classList.add('d-none'); + // Custom theme toggle icons logic + const themeToggle = document.querySelector('#theme-toggle') + if (themeToggle) { + const moonIcon = themeToggle.querySelector('#theme-dark-icon') + const sunIcon = themeToggle.querySelector('#theme-light-icon') + + if (moonIcon && sunIcon) { + // Determine effective theme (handle 'auto' case) + const effectiveTheme = theme === 'auto' + ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') + : theme + + if (effectiveTheme === 'dark') { + moonIcon.classList.remove('d-none') + sunIcon.classList.add('d-none') } else { - moonIcon.classList.add('d-none'); - sunIcon.classList.remove('d-none'); + moonIcon.classList.add('d-none') + sunIcon.classList.remove('d-none') } - }; - - window.addEventListener('DOMContentLoaded', () => { - const storedTheme = getStoredTheme() || 'auto'; - setTheme(storedTheme); - showActiveTheme(storedTheme); - - document.getElementById('theme-toggle').addEventListener('click', () => { - const currentTheme = getStoredTheme(); - const newTheme = currentTheme === 'dark' ? 'light' : 'dark'; - setStoredTheme(newTheme); - setTheme(newTheme); - showActiveTheme(newTheme); - }); - }); -})(); + } + } + } + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { + const storedTheme = getStoredTheme() + if (storedTheme !== 'light' && storedTheme !== 'dark') { + setTheme(getPreferredTheme()) + // Update icons when system preference changes + showActiveTheme(getPreferredTheme()) + } + }) + + window.addEventListener('DOMContentLoaded', () => { + showActiveTheme(getPreferredTheme()) + + document.querySelectorAll('[data-bs-theme-value]') + .forEach(toggle => { + toggle.addEventListener('click', () => { + const theme = toggle.getAttribute('data-bs-theme-value') + setStoredTheme(theme) + setTheme(theme) + showActiveTheme(theme, true) + }) + }) + + // Add event listener for custom theme toggle button + const customThemeToggle = document.querySelector('#theme-toggle') + if (customThemeToggle) { + customThemeToggle.addEventListener('click', () => { + const currentTheme = getStoredTheme() || getPreferredTheme() + const newTheme = currentTheme === 'dark' ? 'light' : 'dark' + + setStoredTheme(newTheme) + setTheme(newTheme) + showActiveTheme(newTheme, true) + }) + } + }) +})() diff --git a/src/framework/resource/layout/component/alert.php b/src/framework/resource/layout/component/alert.php index 9d080fa..2215455 100644 --- a/src/framework/resource/layout/component/alert.php +++ b/src/framework/resource/layout/component/alert.php @@ -2,18 +2,32 @@ declare(strict_types=1); -use UIAwesome\Html\{Component\Bootstrap5\Alert}; +use yii\bootstrap5\Alert; -$session = Yii::$app->session; -$flashMessages = $session->getAllFlashes(); -$html = []; +$alertTypes = [ + 'danger' => 'alert-danger', + 'dark' => 'alert-dark', + 'info' => 'alert-info', + 'light' => 'alert-light', + 'primary' => 'alert-primary', + 'secondary' => 'alert-secondary', + 'success' => 'alert-success', + 'warning' => 'alert-warning', +]; -foreach ($flashMessages as $type => $message) { - if (in_array($type, ['danger', 'dark', 'info', 'success', 'warning'], true) === true) { - $html[] = Alert::widget()->cookbook('dismissible', $type)->content($message); +$flashes = Yii::$app->session->getAllFlashes(); + +foreach ($flashes as $type => $message) { + if (isset($alertTypes[$type])) { + echo Alert::widget( + [ + 'body' => $message, + 'options' => [ + 'class' => $alertTypes[$type], + ], + ], + ); + + Yii::$app->session->removeFlash($type); } } -?> -
- -
diff --git a/src/framework/resource/layout/component/breadcrumbs.php b/src/framework/resource/layout/component/breadcrumbs.php new file mode 100644 index 0000000..5aff313 --- /dev/null +++ b/src/framework/resource/layout/component/breadcrumbs.php @@ -0,0 +1,26 @@ + +
+
+
+ '', + 'links' => $this->params['breadcrumbs'] ?? [], + 'itemTemplate' => '', + 'options' => [ + 'class' => 'breadcrumb bg-body-tertiary rounded-3 px-3 py-2 mb-0 border', + ], + ], + ) ?> +
+
+
diff --git a/src/framework/resource/layout/component/footer-icons.php b/src/framework/resource/layout/component/footer-icons.php index 365d0f5..133c92a 100644 --- a/src/framework/resource/layout/component/footer-icons.php +++ b/src/framework/resource/layout/component/footer-icons.php @@ -2,7 +2,7 @@ declare(strict_types=1); -use UIAwesome\Html\{Graphic\Svg}; +use UIAwesome\Html\Graphic\Svg; use yii\helpers\Html; $socialLinks = [ @@ -14,11 +14,10 @@ ]; foreach ($socialLinks as $link): ?> + + attributes(['height' => '24', 'width' => '24']) - ->filePath(Yii::getAlias('@npm/bootstrap-icons/icons/' . $link['icon'])) - ->render(), + Svg::widget()->attributes(['height' => '24', 'width' => '24'])->filePath($filePath)->render(), $link['url'], [ 'class' => 'd-none d-sm-block d-md-block d-lg-block d-xl-block text-muted text-decoration-none ms-3', diff --git a/src/framework/resource/layout/component/menu.php b/src/framework/resource/layout/component/menu.php index a4e2906..d9d49c7 100644 --- a/src/framework/resource/layout/component/menu.php +++ b/src/framework/resource/layout/component/menu.php @@ -2,51 +2,40 @@ declare(strict_types=1); -use UIAwesome\Html\{ - Component\Bootstrap5\Item, - Component\Bootstrap5\Menu, - Component\Bootstrap5\NavBar, - Multimedia\Img +use app\framework\ApplicationParameters; +use yii\bootstrap5\Nav; +use yii\bootstrap5\NavBar; +use yii\helpers\Html; + +$menuItems = match (Yii::$app->user->getIsGuest()) { + false => ApplicationParameters::getMenuIsLogged(), + default => ApplicationParameters::getMenuIsGuest(), }; -use yii\{helpers\Url, web\User}; -$user = null; - -if (Yii::$container->has(User::class)) { - $user = Yii::$container->get(User::class); -} - -$menuItems = match ($user?->getIsGuest()) { - false => Yii::$app->params['app.menu.islogged'], - default => Yii::$app->params['app.menu.isguest'], -}; - -$items = []; - -foreach ($menuItems as $key => $item) { - if (isset($item['label']) && is_string($item['label'])) { - $category = $item['category'] ?? 'app.basic'; - $menuItems[$key]['label'] = Yii::t($category, $item['label']); - } - - $items[$key] = Item::widget() - ->label($item['label'] ?? '') - ->link(Url::to($item['link'] ?? '#')) - ->linkAttributes($item['linkAttributes'] ?? []); -} - -$orders = array_column($menuItems, 'order'); -array_multisort($orders, SORT_ASC, $menuItems); - -echo NavBar::widget() - ->brandImage( - Img::widget() - ->alt(Yii::$app->name) - ->src(Yii::getAlias('@web/image/yiiframework.svg')) - ->title(Yii::$app->name) - ->width(200), - ) - ->brandLink(Yii::$app->homeUrl) - ->cookbook('align-right') - ->menu(Menu::widget()->currentPath(Yii::$app->request->url)->items(...$items)) - ->render(); +NavBar::begin( + [ + 'brandLabel' => Html::img( + Yii::getAlias('@web/image/yiiframework.svg'), + [ + 'alt' => Yii::$app->name, + 'title' => Yii::$app->name, + 'width' => 200, + ], + ), + 'brandUrl' => Yii::$app->homeUrl, + 'options' => [ + 'class' => 'navbar navbar-expand-lg bg-body-tertiary', + ], + ], +); + +echo Nav::widget( + [ + 'items' => $menuItems, + 'options' => [ + 'class' => 'navbar-nav justify-content-end navbar-collapse', + ], + ], +); + +NavBar::end(); diff --git a/src/framework/resource/layout/component/toggle_language.php b/src/framework/resource/layout/component/toggle_language.php index e0f5c67..b05fb45 100644 --- a/src/framework/resource/layout/component/toggle_language.php +++ b/src/framework/resource/layout/component/toggle_language.php @@ -5,7 +5,8 @@ use app\framework\asset\LocaleAsset; use UIAwesome\Html\Graphic\Svg; use yii\helpers\Html; -use yii\{helpers\Url, web\View}; +use yii\helpers\Url; +use yii\web\View; /** * @var View $this @@ -14,7 +15,7 @@ $items = []; -$locales = Yii::$app->params['app.localeurls.languages'] ?? []; +$locales = Yii::$app->urlManager->languages; foreach ($locales as $key => $value) { $classes = [ diff --git a/src/framework/resource/layout/main.php b/src/framework/resource/layout/main.php index 2c1be80..bdd0851 100644 --- a/src/framework/resource/layout/main.php +++ b/src/framework/resource/layout/main.php @@ -3,7 +3,7 @@ declare(strict_types=1); use app\framework\asset\AppAsset; -use yii\{bootstrap5\Breadcrumbs, web\View}; +use yii\web\View; /** * @var string $content @@ -21,11 +21,7 @@
render('component/menu') ?> render('component/alert') ?> - $this->params['breadcrumbs'] ?? [], - ], - ) ?> + render('component/breadcrumbs') ?>
render('footer') ?> diff --git a/src/usecase/Controller.php b/src/usecase/Controller.php index 35061eb..7362515 100644 --- a/src/usecase/Controller.php +++ b/src/usecase/Controller.php @@ -26,7 +26,9 @@ public function behaviors(): array 'verbs' => [ 'class' => VerbFilter::class, 'actions' => [ - 'logout' => ['post'], + 'logout' => [ + 'post', + ], ], ], ]; diff --git a/src/usecase/contact/ContactController.php b/src/usecase/contact/ContactController.php index 398ddaa..2990f0f 100644 --- a/src/usecase/contact/ContactController.php +++ b/src/usecase/contact/ContactController.php @@ -4,9 +4,11 @@ namespace app\usecase\contact; +use app\framework\ApplicationParameters; use app\usecase\Controller; use yii\captcha\CaptchaAction; use yii\helpers\ArrayHelper; +use yii\mail\MailerInterface; final class ContactController extends Controller { @@ -27,8 +29,25 @@ public function actions(): array ); } + public function getMailer(): MailerInterface + { + return $this->module->get('mailer'); + } + public function getViewPath(): string { return __DIR__ . '/view'; } + + public function sendEmail(ContactForm $form): bool + { + return $this->getMailer() + ->compose() + ->setTo($form->email) + ->setFrom([ApplicationParameters::getMailerSender() => ApplicationParameters::getMailerSenderName()]) + ->setReplyTo([$form->email => $form->name]) + ->setSubject($form->subject) + ->setTextBody($form->body) + ->send(); + } } diff --git a/src/usecase/contact/ContactForm.php b/src/usecase/contact/ContactForm.php index c989ef5..2f4704e 100644 --- a/src/usecase/contact/ContactForm.php +++ b/src/usecase/contact/ContactForm.php @@ -7,16 +7,15 @@ use Yii; use yii\base\Model; use yii\captcha\CaptchaValidator; -use yii\mail\MailerInterface; final class ContactForm extends Model { - public string $name = ''; + public string $body = ''; + public string $date = ''; public string $email = ''; + public string $name = ''; public string $subject = ''; - public string $body = ''; public string $verifyCode = ''; - public string $date = ''; public function attributeLabels(): array { @@ -40,18 +39,4 @@ public function rules(): array ['verifyCode', CaptchaValidator::class, 'captchaAction' => '/contact/captcha', 'message' => ''], ]; } - - /** - * @phpstan-param array $params - */ - public function sendContact(MailerInterface $mailer, array $params): bool - { - return $mailer->compose() - ->setTo($this->email) - ->setFrom([$params['app.mailer.sender'] => $params['app.mailer.sender.name']]) - ->setReplyTo([$this->email => $this->name]) - ->setSubject($this->subject) - ->setTextBody($this->body) - ->send(); - } } diff --git a/src/usecase/contact/IndexAction.php b/src/usecase/contact/IndexAction.php index d34113e..dcf0ce2 100644 --- a/src/usecase/contact/IndexAction.php +++ b/src/usecase/contact/IndexAction.php @@ -5,44 +5,23 @@ namespace app\usecase\contact; use yii\base\Action; -use yii\symfonymailer\Mailer; -use yii\web\{Controller, Request, Session}; /** * @extends Action */ final class IndexAction extends Action { - public function __construct( - string $id, - Controller $controller, - private readonly Mailer $mailer, - private readonly Request $request, - private readonly Session $session, - array $config = [], - ) { - parent::__construct($id, $controller, $config); - } - public function run(): string { - $contactForm = new ContactForm(); - - $post = $this->request->post(); + $form = new ContactForm(); + $post = $this->controller->request->post(); - if (is_array($post) && $contactForm->load($post) && $contactForm->validate()) { - if ($contactForm->sendContact($this->mailer, $this->controller->module->params)) { + if (is_array($post) && $form->load($post) && $form->validate()) { + if ($this->controller->sendEmail($form)) { $this->trigger(ContactEvent::EVENT_AFTER_SEND, new ContactEvent()); } } - return $this->controller->render( - 'index', - [ - 'model' => $contactForm, - 'mailer' => $this->mailer, - 'session' => $this->session, - ], - ); + return $this->controller->render('index', ['model' => $form]); } } diff --git a/src/usecase/contact/view/index.php b/src/usecase/contact/view/index.php index c55112a..7651f52 100644 --- a/src/usecase/contact/view/index.php +++ b/src/usecase/contact/view/index.php @@ -2,17 +2,16 @@ declare(strict_types=1); -use app\usecase\contact\ContactForm; -use yii\{bootstrap5\ActiveForm, captcha\Captcha, symfonymailer\Mailer, web\Session, web\View}; +use yii\bootstrap5\ActiveForm; +use yii\captcha\Captcha; use yii\helpers\Html; /** - * @var ContactForm $model - * @var Mailer $mailer - * @var Session $session - * @var View $this + * @var app\usecase\contact\ContactForm $model + * @var yii\web\View $this */ $this->title = Yii::t('app.basic', 'Contact'); +$this->params['breadcrumbs'] = [$this->title]; $tabInput = 1; ?> @@ -22,7 +21,7 @@

title) ?>

-

+


@@ -41,91 +40,113 @@ ], ) ?> -
-
- field($model, 'name')->textInput( + +
+
+ field($model, 'name')->textInput( + [ + 'autofocus' => true, + 'class' => 'form-control form-control-lg', + 'placeholder' => Yii::t( + 'app.basic', + 'Your full name', + ), + 'required' => true, + 'tabindex' => $tabInput++, + ], + ) ?> +
+
+ field($model, 'email')->textInput( + [ + 'class' => 'form-control form-control-lg', + 'placeholder' => Yii::t( + 'app.basic', + 'your.email@example.com', + ), + 'required' => true, + 'tabindex' => $tabInput++, + ], + ) ?> +
+
+ + +
+ field($model, 'subject')->textInput( [ - 'autofocus' => true, 'class' => 'form-control form-control-lg', - 'placeholder' => Yii::t('app.basic', 'Your full name'), + 'placeholder' => Yii::t('app.basic', 'What is this about?'), 'required' => true, 'tabindex' => $tabInput++, ], ) ?>
-
- field($model, 'email')->textInput( + + +
+ field($model, 'body')->textarea( [ - 'class' => 'form-control form-control-lg', - 'placeholder' => Yii::t('app.basic', 'your.email@example.com'), + 'class' => 'form-control', + 'rows' => 6, + 'placeholder' => Yii::t( + 'app.basic', + 'Tell us more about your inquiry...', + ), 'required' => true, + 'style' => 'resize: vertical; min-height: 150px;', 'tabindex' => $tabInput++, ], ) ?>
-
- - -
- field($model, 'subject')->textInput( - [ - 'class' => 'form-control form-control-lg', - 'placeholder' => Yii::t('app.basic', 'What is this about?'), - 'required' => true, - 'tabindex' => $tabInput++, - ], - ) ?> -
- -
- field($model, 'body')->textarea( - [ - 'class' => 'form-control', - 'rows' => 6, - 'placeholder' => Yii::t('app.basic', 'Tell us more about your inquiry...'), - 'required' => true, - 'style' => 'resize: vertical; min-height: 150px;', - 'tabindex' => $tabInput++, - ], - ) ?> -
- - -
-
-
Security Verification
-
-
-
- field($model, 'verifyCode', [ - 'template' => '{input}{error}', - 'options' => ['class' => 'mb-3'], - ])->widget(Captcha::class, [ - 'captchaAction' => 'contact/captcha', - 'template' => '
Captcha Code:{image}
{input}', - 'options' => [ - 'class' => 'form-control form-control-lg text-center', - 'placeholder' => Yii::t('app.basic', 'Enter the code above'), - 'required' => true, - 'tabindex' => $tabInput++, - ], - ]) ?> + +
+
+
Security Verification
+
+
+
+ field( + $model, + 'verifyCode', + [ + 'template' => '{input}{error}', + 'options' => [ + 'class' => 'mb-2', + ], + ], + )->widget( + Captcha::class, + [ + 'captchaAction' => 'contact/captcha', + 'template' => '
Captcha Code:{image}
{input}', + 'options' => [ + 'class' => 'form-control form-control-lg text-center', + 'placeholder' => Yii::t( + 'app.basic', + 'Enter the code above', + ), + 'required' => true, + 'tabindex' => $tabInput++, + ], + ], + ) ?> +
-
- -
- 'btn btn-primary btn-lg py fw-semibold rounded-3', - 'name' => 'contact-button', - 'tabindex' => $tabInput++, - ], - ) ?> -
+ +
+ 'btn btn-primary btn-lg py fw-semibold rounded-3', + 'name' => 'contact-button', + 'tabindex' => $tabInput++, + ], + ) ?> +
@@ -179,11 +200,11 @@
  • Monday - Friday - 9:00 AM - 6:00 PM + 9:00 AM to 6:00 PM
  • Saturday - 10:00 AM - 4:00 PM + 10:00 AM to 4:00 PM
  • Sunday diff --git a/src/usecase/security/Identity.php b/src/usecase/security/Identity.php new file mode 100644 index 0000000..3f1e8f0 --- /dev/null +++ b/src/usecase/security/Identity.php @@ -0,0 +1,91 @@ + + */ + private static array $users = [ + '100' => [ + 'id' => '100', + 'username' => 'admin', + 'password' => 'admin', + 'authKey' => 'test100key', + 'accessToken' => '100-token', + ], + '101' => [ + 'id' => '101', + 'username' => 'demo', + 'password' => 'demo', + 'authKey' => 'test101key', + 'accessToken' => '101-token', + ], + ]; + + public static function findByUsername(string $username): IdentityInterface|null + { + foreach (self::$users as $user) { + if (strcasecmp($user['username'], $username) === 0) { + return new self($user); + } + } + + return null; + } + + public static function findIdentity($id): IdentityInterface|null + { + return isset(self::$users[$id]) ? new self(self::$users[$id]) : null; + } + + public static function findIdentityByAccessToken($token, $type = null): IdentityInterface|null + { + foreach (self::$users as $user) { + if ($user['accessToken'] === $token) { + return new self($user); + } + } + + return null; + } + + public function getAuthKey(): string + { + return $this->authKey; + } + + public function getId(): string + { + return $this->id; + } + + public function validateAuthKey($authKey): bool + { + return $this->authKey === $authKey; + } + + public function validatePassword(string $password): bool + { + return $this->password === $password; + } +} diff --git a/src/usecase/security/LoginAction.php b/src/usecase/security/LoginAction.php new file mode 100644 index 0000000..4fee2b9 --- /dev/null +++ b/src/usecase/security/LoginAction.php @@ -0,0 +1,41 @@ + + */ +final class LoginAction extends Action +{ + public function run(): string|Response + { + if ($this->controller->getUser()->isGuest === false) { + return $this->controller->goHome(); + } + + $form = new LoginForm(); + $post = $this->controller->request->post(); + + if (is_array($post) && $form->load($post) && $this->login($form)) { + return $this->controller->goBack(); + } + + return $this->controller->render('login', ['model' => $form]); + } + + private function login(LoginForm $form): bool + { + $identity = $form->getIdentity(); + + if ($identity instanceof Identity && $form->validate()) { + return $this->controller->getUser()->login($identity, $form->rememberMe ? 3600 * 24 * 30 : 0); + } + + return false; + } +} diff --git a/src/usecase/security/LoginForm.php b/src/usecase/security/LoginForm.php new file mode 100644 index 0000000..134c827 --- /dev/null +++ b/src/usecase/security/LoginForm.php @@ -0,0 +1,73 @@ +_identity === false) { + $this->_identity = Identity::findByUsername($this->username); + } + + return $this->_identity; + } + + /** + * @phpstan-return array> + */ + public function rules(): array + { + return [ + // username and password are both required + [['username', 'password'], 'required'], + // rememberMe must be a boolean value + ['rememberMe', 'boolean'], + // password is validated by validatePassword() + ['password', 'validatePassword'], + ]; + } + + /** + * Validates the password. + * + * This method serves as the inline validation for password. + * + * @param string $attribute the attribute currently being validated + * + * @param array $params the additional name-value pairs given in the rule + * + * @phpstan-param array $params + */ + public function validatePassword($attribute, $params): void + { + if ($this->hasErrors() === false) { + $identity = $this->getIdentity(); + + if ($identity instanceof Identity && $identity->validatePassword($this->password) === false) { + $this->addError($attribute, 'Incorrect username or password.'); + } + } + } +} diff --git a/src/usecase/security/LogoutAction.php b/src/usecase/security/LogoutAction.php new file mode 100644 index 0000000..5067fc8 --- /dev/null +++ b/src/usecase/security/LogoutAction.php @@ -0,0 +1,21 @@ + + */ +final class LogoutAction extends Action +{ + public function run(): Response + { + $this->controller->getUser()->logout(); + + return $this->controller->goHome(); + } +} diff --git a/src/usecase/security/SecurityController.php b/src/usecase/security/SecurityController.php new file mode 100644 index 0000000..05c31a7 --- /dev/null +++ b/src/usecase/security/SecurityController.php @@ -0,0 +1,40 @@ + [ + 'class' => LogoutAction::class, + ], + 'login' => [ + 'class' => LoginAction::class, + ], + ], + parent::actions(), + ); + } + + /** + * @phpstan-return User + */ + public function getUser(): User + { + return $this->module->get('user'); + } + + public function getViewPath(): string + { + return __DIR__ . '/view'; + } +} diff --git a/src/usecase/security/view/login.php b/src/usecase/security/view/login.php new file mode 100644 index 0000000..994a205 --- /dev/null +++ b/src/usecase/security/view/login.php @@ -0,0 +1,121 @@ +title = 'Login'; +$this->params['breadcrumbs'] = [$this->title]; +$tabInput = 1; +?> + +
    +
    +
    +

    + title) ?> +

    + +
    +
    +
    +
    +
    +
    +
    + 'login-form', + 'layout' => ActiveForm::LAYOUT_FLOATING, + 'options' => ['class' => 'needs-validation', 'novalidate' => true], + ], + ) ?> + + +
    + field($model, 'username')->textInput( + [ + 'autofocus' => true, + 'class' => 'form-control form-control-lg', + 'placeholder' => Yii::t('app.basic', 'Enter your username'), + 'required' => true, + 'tabindex' => $tabInput++, + ], + ) ?> +
    + + +
    + field($model, 'password')->passwordInput( + [ + 'class' => 'form-control form-control-lg', + 'placeholder' => Yii::t('app.basic', 'Enter your password'), + 'required' => true, + 'tabindex' => $tabInput++, + ], + ) ?> +
    + + +
    +
    + field($model, 'rememberMe')->checkbox( + [ + 'labelOptions' => [ + 'class' => 'form-check-label fw-medium text-body', + ], + 'options' => [ + 'class' => 'form-check-input', + ], + ], + ) ?> +
    +
    + + +
    + 'btn btn-primary btn-lg py-3 fw-semibold rounded-3', + 'name' => 'login-button', + ], + ) ?> +
    + + + + +
    +
    Demo Credentials
    +
    +
    + +
    +
    + +
    +
    +
    + To modify credentials, check +
    +
    +
    +
    +
    +
    +
    diff --git a/src/usecase/site/SiteController.php b/src/usecase/site/SiteController.php index 59dc591..806911c 100644 --- a/src/usecase/site/SiteController.php +++ b/src/usecase/site/SiteController.php @@ -5,25 +5,29 @@ namespace app\usecase\site; use app\usecase\Controller; +use yii\helpers\ArrayHelper; use yii\web\ErrorAction; final class SiteController extends Controller { - public function actions(): array + public function actionIndex(): string { - return [ - '404' => [ - 'class' => ErrorAction::class, - ], - 'about' => [ - 'class' => AboutAction::class, - ], - ]; + return $this->render('index'); } - public function actionIndex(): string + public function actions(): array { - return $this->render('index'); + return ArrayHelper::merge( + [ + '404' => [ + 'class' => ErrorAction::class, + ], + 'about' => [ + 'class' => AboutAction::class, + ], + ], + parent::actions(), + ); } public function getViewPath(): string diff --git a/src/usecase/site/view/about.php b/src/usecase/site/view/about.php index 2b6b16c..2ba2595 100644 --- a/src/usecase/site/view/about.php +++ b/src/usecase/site/view/about.php @@ -3,10 +3,10 @@ declare(strict_types=1); use yii\helpers\Html; -use yii\web\View; -/** @var View $this */ +/** @var yii\web\View $this */ $this->title = Yii::t('app.basic', 'About'); +$this->params['breadcrumbs'] = [$this->title]; ?>

    title) ?>

    diff --git a/tests/Acceptance.suite.yml b/tests/Acceptance.suite.yml index 5b697a3..41b4461 100644 --- a/tests/Acceptance.suite.yml +++ b/tests/Acceptance.suite.yml @@ -3,7 +3,6 @@ # Suite for acceptance tests. # Perform tests in browser using the WebDriver or PhpBrowser. # If you need both WebDriver and PHPBrowser tests - create a separate suite. - actor: AcceptanceTester extensions: enabled: diff --git a/tests/Acceptance/AboutCest.php b/tests/Acceptance/AboutCest.php index 205e58b..509df46 100644 --- a/tests/Acceptance/AboutCest.php +++ b/tests/Acceptance/AboutCest.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace App\Tests\Acceptance; +namespace app\tests\Acceptance; -use App\Tests\Support\AcceptanceTester; +use app\tests\Support\AcceptanceTester; final class AboutCest { @@ -14,6 +14,7 @@ public function aboutPage(AcceptanceTester $I): void $I->amOnRoute('site/about'); $I->wantTo('ensure that About page works.'); + $I->expectTo('see page index.'); $I->see('About'); $I->see('This is the About page.'); diff --git a/tests/Acceptance/ContactCest.php b/tests/Acceptance/ContactCest.php index 11929e0..acfb3ca 100644 --- a/tests/Acceptance/ContactCest.php +++ b/tests/Acceptance/ContactCest.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace App\Tests\Acceptance; +namespace app\tests\Acceptance; -use App\Tests\Support\AcceptanceTester; +use app\tests\Support\AcceptanceTester; final class ContactCest { @@ -14,6 +14,7 @@ public function contactPage(AcceptanceTester $I): void $I->amOnRoute('contact/index'); $I->wantTo('ensure that Contact page works.'); + $I->expectTo('see page index.'); $I->see('Contact'); $I->see('Please fill out the following form to contact us.'); diff --git a/tests/Acceptance/SiteCest.php b/tests/Acceptance/SiteCest.php index 56fdbdf..776fb58 100644 --- a/tests/Acceptance/SiteCest.php +++ b/tests/Acceptance/SiteCest.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace App\Tests\Acceptance; +namespace app\tests\Acceptance; -use App\Tests\Support\AcceptanceTester; +use app\tests\Support\AcceptanceTester; final class SiteCest { @@ -14,6 +14,7 @@ public function homePage(AcceptanceTester $I): void $I->amOnRoute('/'); $I->wantTo('ensure that Home page works.'); + $I->expectTo('see page index.'); $I->see('Web Application'); $I->see('Yii v.22'); diff --git a/tests/Functional/ContactCest.php b/tests/Functional/ContactCest.php index 838b902..02e92df 100644 --- a/tests/Functional/ContactCest.php +++ b/tests/Functional/ContactCest.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace App\Tests\Functional; +namespace app\tests\Functional; -use App\Tests\Support\FunctionalTester; +use app\tests\Support\FunctionalTester; final class ContactCest { @@ -14,18 +14,6 @@ public function _before(FunctionalTester $I): void $I->amOnRoute('contact/index'); } - public function contactFormSubmitFormEmptyData(FunctionalTester $I): void - { - $I->amGoingTo('contact form submit form with empty data.'); - $I->submitForm('#contact-form', []); - - $I->expectTo('see validations errors.'); - $I->see('Name cannot be blank.'); - $I->see('Email cannot be blank.'); - $I->see('Subject cannot be blank.'); - $I->see('Body cannot be blank.'); - } - public function contactFormSubmitFormEmailWrongData(FunctionalTester $I): void { $I->amGoingTo('contact form submit form with email wrong.'); @@ -45,6 +33,18 @@ public function contactFormSubmitFormEmailWrongData(FunctionalTester $I): void $I->dontSee('The verification code is incorrect'); } + public function contactFormSubmitFormEmptyData(FunctionalTester $I): void + { + $I->amGoingTo('contact form submit form with empty data.'); + $I->submitForm('#contact-form', []); + + $I->expectTo('see validations errors.'); + $I->see('Name cannot be blank.'); + $I->see('Email cannot be blank.'); + $I->see('Subject cannot be blank.'); + $I->see('Body cannot be blank.'); + } + public function contactFormSubmitFormSuccessData(FunctionalTester $I): void { $I->amGoingTo('contact form submit form with success data.'); diff --git a/tests/Support/AcceptanceTester.php b/tests/Support/AcceptanceTester.php deleted file mode 100644 index ce29723..0000000 --- a/tests/Support/AcceptanceTester.php +++ /dev/null @@ -1,29 +0,0 @@ -id; - } - - public function getAuthKey(): string - { - return 'ABCD1234'; - } - - public function validateAuthKey($authKey): bool - { - return $authKey === 'ABCD1234'; - } - - public static function findIdentity($id): IdentityInterface|null - { - if (in_array($id, ['user1', 'user2', 'user3'], true)) { - $identitiy = new self(); - $identitiy->id = $id; - - return $identitiy; - } - - return null; - } - - public static function findIdentityByAccessToken($token, $type = null): void - { - throw new NotSupportedException(); - } -} diff --git a/tests/Support/FunctionalTester.php b/tests/Support/FunctionalTester.php deleted file mode 100644 index 5aa6fc8..0000000 --- a/tests/Support/FunctionalTester.php +++ /dev/null @@ -1,29 +0,0 @@ -attributes = [ + $form->attributes = [ 'name' => 'Tester', 'email' => 'tester@example.com', 'subject' => 'very important letter subject', @@ -27,15 +30,20 @@ public function testEmailIsSentOnContact(): void 'verifyCode' => 'testme', ]; - verify($formModel->sendContact(Yii::$app->mailer, Yii::$app->params))->notEmpty(); + verify($controller->sendEmail($form))->notEmpty(); + assert( + $this->tester instanceof Yii2, + '\'Yii2\' module should be available in the tester', + ); - // using Yii2 module actions to check email was sent $this->tester->seeEmailIsSent(); - - /** @var MessageInterface $emailMessage */ $emailMessage = $this->tester->grabLastSentEmail(); - verify($emailMessage)->instanceOf(MessageInterface::class); + assert( + $emailMessage instanceof MessageInterface, + 'Last sent email should be an instance of \'MessageInterface\'', + ); + verify($emailMessage->getTo())->arrayHasKey('tester@example.com'); verify($emailMessage->getFrom())->arrayHasKey('noreply@example.com'); verify($emailMessage->getReplyTo())->arrayHasKey('tester@example.com'); diff --git a/tests/Unit/HelloControllerTest.php b/tests/Unit/HelloControllerTest.php index 58fe88c..087a668 100644 --- a/tests/Unit/HelloControllerTest.php +++ b/tests/Unit/HelloControllerTest.php @@ -2,27 +2,46 @@ declare(strict_types=1); -namespace App\Tests\Unit; +namespace app\tests\Unit; use app\usecase\hello\HelloController; use Codeception\Test\Unit; use Yii; +use yii\base\InvalidRouteException; +use yii\console\Exception; use function ob_get_clean; use function ob_start; +/** + * Test suite for {@see HelloController} output behavior. + * + * Verifies that the HelloController's index action produces the expected output. + * + * This test ensures that the controller's action renders the correct string, providing confidence in the controller + * output logic and integration with the Yii application context. + * + * Test coverage. + * - Controller instantiation and action execution. + * - Output of the index action ("hello world\n"). + * + * @copyright Copyright (C) 2023 Terabytesoftw. + * @license https://opensource.org/license/bsd-3-clause BSD 3-Clause License. + */ final class HelloControllerTest extends Unit { - public mixed $tester; - - public function testIndex(): void + /** + * @throws Exception if an unexpected error occurs during execution. + * @throws InvalidRouteException if the action route is invalid. + */ + public function testIndexActionOutputsHelloWorld(): void { - $hellowControler = new HelloController('hello', Yii::$app); + $helloControler = new HelloController('hello', Yii::$app); ob_start(); - $hellowControler->runAction('index'); + $helloControler->runAction('index'); $result = ob_get_clean(); - $this->assertSame("hello world\n", $result); + self::assertSame("hello world\n", $result, 'Output should be \'hello world\''); } } diff --git a/tests/Unit/IdentityTest.php b/tests/Unit/IdentityTest.php new file mode 100644 index 0000000..6be84c5 --- /dev/null +++ b/tests/Unit/IdentityTest.php @@ -0,0 +1,95 @@ +getId(), "User ID for access token '100-token' should be '100'."); + self::assertSame('admin', $user->username, "Username property should be 'admin'."); + } + + public function testFindByAccessTokenReturnsNullForInvalidToken(): void + { + self::assertNull( + Identity::findIdentityByAccessToken('invalid-token'), + "Expected 'null' when finding a user by an invalid access token.", + ); + } + + public function testFindByUsernameReturnsIdentity(): void + { + $user = Identity::findByUsername('admin'); + + self::assertInstanceOf(Identity::class, $user, "Expected an instance of 'Identity' for username 'admin'."); + self::assertSame('100', $user->getId(), "User ID for 'admin' should be '100'."); + self::assertSame('admin', $user->username, "Username property should be 'admin'."); + } + + public function testFindByUsernameReturnsNullForNonexistentUser(): void + { + self::assertNull( + Identity::findByUsername('nonexistent'), + "Expected 'null' when finding a user by a 'nonexistent' username.", + ); + } + + public function testValidateAuthKeyReturnsTrueForCorrectAuthKey(): void + { + $user = Identity::findByUsername('admin'); + + self::assertInstanceOf( + Identity::class, + $user, + "Expected an instance of 'Identity' for username 'admin'.", + ); + self::assertTrue( + $user->validateAuthKey('test100key'), + 'Expected auth key validation to return `true` for correct auth key.', + ); + } + + public function testValidatePasswordReturnsTrueForCorrectPassword(): void + { + $user = Identity::findByUsername('admin'); + + self::assertInstanceOf( + Identity::class, + $user, + "Expected an instance of 'Identity' for username 'admin'.", + ); + self::assertTrue( + $user->validatePassword('admin'), + 'Expected password validation to return `true` for correct password.', + ); + } +} diff --git a/tests/Unit/MenuTest.php b/tests/Unit/MenuTest.php index 9db8985..9f5a0f2 100644 --- a/tests/Unit/MenuTest.php +++ b/tests/Unit/MenuTest.php @@ -2,36 +2,52 @@ declare(strict_types=1); -namespace App\Tests\Unit; +namespace app\tests\Unit; -use App\Tests\Support\Data\UserIdentity; +use app\usecase\security\Identity; use Codeception\Test\Unit; use Yii; -use yii\web\User; use yii\web\View; +/** + * Test suite for menu component rendering for authentication scenarios. + * + * Verifies correct rendering of the logout link in the navigation menu when a user is authenticated. + * + * This test ensures that the menu component displays the logout link only for logged-in users, validating the + * integration between the identity system and the view rendering logic. + * + * Test coverage. + * - Identity resolution and login simulation for test context. + * - Rendering of the logout link for authenticated users. + * - View rendering with expected HTML output. + * + * @copyright Copyright (C) 2023 Terabytesoftw. + * @license https://opensource.org/license/bsd-3-clause BSD 3-Clause License. + */ final class MenuTest extends Unit { - public mixed $tester; - - public function testMenu(): void + public function testRenderLogoutLinkWhenUserIsLoggedIn(): void { + $identity = Identity::findIdentity('100'); $view = new View(); - Yii::$app->request->setUrl('http://example.com'); - Yii::$app->params['app.menu.islogged'] = [ - [ - 'label' => 'Logout', - 'link' => ['/logout/index'], - 'order' => 1, - ], - ]; - Yii::$container->set(User::class, ['identityClass' => UserIdentity::class]); - - $user = Yii::$container->get(User::class); - $user->login(UserIdentity::findIdentity('user1'), 0); - $result = $view->render('@resource/layout/component/menu.php'); - - $this->assertStringContainsString('Logout', $result); + self::assertNotNull( + $identity, + "Failed asserting that the user identity with ID '100' exists.", + ); + self::assertInstanceOf( + Identity::class, + $identity, + "Failed asserting that the identity is an instance of 'Identity' class.", + ); + + Yii::$app->user->login($identity); + + self::assertStringContainsString( + 'Logout', + $view->render('@resource/layout/component/menu.php'), + 'Failed asserting that the logout link is rendered for a logged-in user.', + ); } } diff --git a/tests/_bootstrap.php b/tests/_bootstrap.php index caefaa9..3197513 100644 --- a/tests/_bootstrap.php +++ b/tests/_bootstrap.php @@ -5,5 +5,5 @@ define('YII_ENV', 'tests'); defined('YII_DEBUG') || define('YII_DEBUG', true); -require_once __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; require_once __DIR__ . '/../vendor/autoload.php'; +require_once __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; diff --git a/tests/_output/.gitignore b/tests/_output/.gitignore deleted file mode 100644 index d6b7ef3..0000000 --- a/tests/_output/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/yii b/yii index 07b8d6d..1e76885 100755 --- a/yii +++ b/yii @@ -4,9 +4,6 @@ declare(strict_types=1); use yii\console\Application; -use Yiisoft\Config\Config; -use Yiisoft\Config\ConfigPaths; -use Yiisoft\Config\Modifier\RecursiveMerge; defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'dev'); @@ -14,14 +11,9 @@ defined('YII_ENV') or define('YII_ENV', 'dev'); require __DIR__ . '/vendor/autoload.php'; require __DIR__ . '/vendor/yiisoft/yii2/Yii.php'; -$config = new Config( - new ConfigPaths(__DIR__, 'config', 'vendor'), - modifiers: [RecursiveMerge::groups('console', 'params', 'params-console')], - paramsGroup: 'params-console', -); +$config = require __DIR__ . '/config/console/app.php'; -$container = Yii::$container->setSingleton(Application::class, $config->get('console')); -$app = Yii::$container->get(Application::class); -$exitCode = $app->run(); +$application = new Application($config); +$exitCode = $application->run(); exit($exitCode);