diff --git a/.gitignore b/.gitignore index 85bf818..12036b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /vendor/ *.cache *.log +runtime/ # IDE support .idea/ diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index b9a08df..8c4e6a2 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -1,89 +1,16 @@ in([ + __DIR__ . '/publish', + __DIR__ . '/src', + __DIR__ . '/tests', +]); -@link https://www.hyperf.io -@document https://hyperf.wiki -@contact group@hyperf.io -@license https://github.com/hyperf/hyperf/blob/master/LICENSE -EOF; - -return (new PhpCsFixer\Config()) - ->setRiskyAllowed(true) - ->setRules([ - '@PSR2' => true, - '@Symfony' => true, - '@DoctrineAnnotation' => true, - '@PhpCsFixer' => true, - 'header_comment' => [ - 'comment_type' => 'PHPDoc', - 'header' => $header, - 'separate' => 'none', - 'location' => 'after_declare_strict', - ], - 'array_syntax' => [ - 'syntax' => 'short' - ], - 'list_syntax' => [ - 'syntax' => 'short' - ], - 'concat_space' => [ - 'spacing' => 'one' - ], - 'blank_line_before_statement' => [ - 'statements' => [ - 'declare', - ], - ], - 'general_phpdoc_annotation_remove' => [ - 'annotations' => [ - 'author' - ], - ], - 'ordered_imports' => [ - 'imports_order' => [ - 'class', 'function', 'const', - ], - 'sort_algorithm' => 'alpha', - ], - 'single_line_comment_style' => [ - 'comment_types' => [ - ], - ], - 'yoda_style' => [ - 'always_move_variable' => false, - 'equal' => false, - 'identical' => false, - ], - 'phpdoc_align' => [ - 'align' => 'left', - ], - 'multiline_whitespace_before_semicolons' => [ - 'strategy' => 'no_multi_line', - ], - 'constant_case' => [ - 'case' => 'lower', - ], - 'class_attributes_separation' => true, - 'combine_consecutive_unsets' => true, - 'declare_strict_types' => true, - 'linebreak_after_opening_tag' => true, - 'lowercase_static_reference' => true, - 'no_useless_else' => true, - 'no_unused_imports' => true, - 'not_operator_with_successor_space' => true, - 'not_operator_with_space' => false, - 'ordered_class_elements' => true, - 'php_unit_strict' => false, - 'phpdoc_separation' => false, - 'single_quote' => true, - 'standardize_not_equals' => true, - 'multiline_comment_opening_closing' => true, - ]) - ->setFinder( - PhpCsFixer\Finder::create() - ->exclude('vendor') - ->in(__DIR__) - ) - ->setUsingCache(false); +$config = new PhpCsFixer\Config(); +return $config->setRules([ + '@PSR12' => true, + 'strict_param' => true, + 'array_syntax' => ['syntax' => 'short'], +]) + ->setUsingCache(false) + ->setFinder($finder); diff --git a/composer.json b/composer.json index 39b95df..ce98bf4 100644 --- a/composer.json +++ b/composer.json @@ -19,6 +19,7 @@ }, "require": { "php": ">=8.1", + "ext-redis": "*", "hyperf/config": "3.1.*", "hyperf/constants": "3.1.*", "hyperf/di": "3.1.*", @@ -28,8 +29,7 @@ "litesaml/lightsaml": "~3.0.0", "singularity/hdk-core": "^1.0.0", "singularity/hdk-auth": "^1.0.0", - "teapot/status-code": "^1.1", - "ext-redis": "*" + "teapot/status-code": "^1.1" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.0", @@ -51,9 +51,19 @@ } }, "scripts": { - "test": "phpunit -c phpunit.xml --colors=always", - "analyse": "phpstan analyse --memory-limit 1024M -l 0 ./src", - "cs-fix": "php-cs-fixer fix $1" + "test": [ + "rm -rf runtime", + "Composer\\Config::disableProcessTimeout", + "pest --coroutine --prepend tests/bootstrap.php --colors=always" + ], + "cs-fix": "php-cs-fixer fix $1 --rules=@PSR12 --allow-risky=yes", + "analyse": "phpstan analyse $1", + "ci": [ + "@analyse publish/ src/ tests/", + "@cs-fix", + "@test", + "echo CI Success" + ] }, "extra": { "hyperf": { diff --git a/composer.lock b/composer.lock index 8f531c4..77357aa 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5fa18cb9227d594f8ab593b0337f9f93", + "content-hash": "380a03dafc587dd040e174d3d11f2ff9", "packages": [ { - "name": "casbin/casbin", - "version": "v3.21.4", + "name": "carbonphp/carbon-doctrine-types", + "version": "3.1.0", "source": { "type": "git", - "url": "https://github.com/php-casbin/php-casbin.git", - "reference": "c187bd0ee110f2aedf4be4bfd53553aa193571cf" + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "a31d3358a2a5d6ae947df1691d1f321418a5f3d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-casbin/php-casbin/zipball/c187bd0ee110f2aedf4be4bfd53553aa193571cf", - "reference": "c187bd0ee110f2aedf4be4bfd53553aa193571cf", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/a31d3358a2a5d6ae947df1691d1f321418a5f3d5", + "reference": "a31d3358a2a5d6ae947df1691d1f321418a5f3d5", "shasum": "", "mirrors": [ { @@ -27,126 +27,72 @@ ] }, "require": { - "php": ">=7.1.0", - "s1lentium/iptools": "^1.1", - "symfony/expression-language": "^3.4|^4.0|^5.0|^6.0" + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" }, "require-dev": { - "mockery/mockery": "^1.2", - "php-coveralls/php-coveralls": "^2.1", - "phpstan/phpstan": "^1.2", - "phpunit/phpunit": "~7.0|~8.0|~9.0" + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" }, "type": "library", "autoload": { "psr-4": { - "Casbin\\": "src/" + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache-2.0" + "MIT" ], "authors": [ { - "name": "TechLee", - "email": "techlee@qq.com" + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" } ], - "description": "a powerful and efficient open-source access control library for php projects.", + "description": "Types to use Carbon in Doctrine", "keywords": [ - "abac", - "access control", - "acl", - "authorization", - "casbin", - "permission", - "rbac" + "carbon", + "date", + "datetime", + "doctrine", + "time" ], "support": { - "issues": "https://github.com/php-casbin/php-casbin/issues", - "source": "https://github.com/php-casbin/php-casbin/tree/v3.21.4" + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.1.0" }, "funding": [ { - "url": "https://opencollective.com/casbin", - "type": "open_collective" - } - ], - "time": "2023-11-30T15:58:24+00:00" - }, - { - "name": "casbin/psr3-bridge", - "version": "v1.3.1", - "source": { - "type": "git", - "url": "https://github.com/php-casbin/psr3-bridge.git", - "reference": "4b8133c77f2dc1093b3adeb5fc3af1e8de3d0eb1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-casbin/psr3-bridge/zipball/4b8133c77f2dc1093b3adeb5fc3af1e8de3d0eb1", - "reference": "4b8133c77f2dc1093b3adeb5fc3af1e8de3d0eb1", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "casbin/casbin": "^2.0|^3.0", - "psr/log": "^1.1|^2.0|^3.0" - }, - "require-dev": { - "mockery/mockery": "^1.2", - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "~7.0|~8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Casbin\\Bridge\\Logger\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ + "url": "https://github.com/kylekatarnls", + "type": "github" + }, { - "name": "TechLee", - "email": "techlee@qq.com" + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" } ], - "description": "This library provides a PSR-3 compliant bridge for Casbin Logger.", - "keywords": [ - "acl", - "casbin", - "logger", - "permission", - "psr-3", - "rbac" - ], - "support": { - "issues": "https://github.com/php-casbin/psr3-bridge/issues", - "source": "https://github.com/php-casbin/psr3-bridge/tree/v1.3.1" - }, - "time": "2022-02-05T12:08:12+00:00" + "time": "2023-12-10T15:33:53+00:00" }, { "name": "composer/ca-bundle", - "version": "1.3.7", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" + "reference": "b66d11b7479109ab547f9405b97205640b17d385" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", - "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b66d11b7479109ab547f9405b97205640b17d385", + "reference": "b66d11b7479109ab547f9405b97205640b17d385", "shasum": "", "mirrors": [ { @@ -164,7 +110,7 @@ "phpstan/phpstan": "^0.12.55", "psr/log": "^1.0", "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", "extra": { @@ -199,7 +145,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.7" + "source": "https://github.com/composer/ca-bundle/tree/1.4.0" }, "funding": [ { @@ -215,7 +161,7 @@ "type": "tidelift" } ], - "time": "2023-08-30T09:31:38+00:00" + "time": "2023-12-18T12:05:55+00:00" }, { "name": "composer/class-map-generator", @@ -1123,88 +1069,6 @@ ], "time": "2022-12-14T08:49:07+00:00" }, - { - "name": "donjan-deng/hyperf-casbin", - "version": "3.22.2", - "source": { - "type": "git", - "url": "https://github.com/donjan-deng/hyperf-casbin.git", - "reference": "662377f3b5136083fe509a31cedaa24f47796d4d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/donjan-deng/hyperf-casbin/zipball/662377f3b5136083fe509a31cedaa24f47796d4d", - "reference": "662377f3b5136083fe509a31cedaa24f47796d4d", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "casbin/casbin": "~3.20", - "casbin/psr3-bridge": "~1.3", - "ext-bcmath": "*", - "ext-json": "*", - "ext-pdo": "*", - "ext-redis": "*", - "ext-swoole": ">=4.5", - "hyperf/cache": "~3.0", - "hyperf/command": "~3.0", - "hyperf/config": "~3.0", - "hyperf/database": "~3.0", - "hyperf/db-connection": "~3.0", - "hyperf/logger": "~3.0", - "hyperf/process": "~3.0", - "hyperf/redis": "~3.0", - "hyperf/utils": "~3.0", - "php": ">=8.0" - }, - "require-dev": { - "hyperf/testing": "~3.0", - "mockery/mockery": "^1.0" - }, - "type": "library", - "extra": { - "hyperf": { - "config": "Donjan\\Casbin\\ConfigProvider" - } - }, - "autoload": { - "psr-4": { - "Donjan\\Casbin\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Donjan", - "homepage": "https://github.com/donjan-deng", - "role": "Developer" - } - ], - "description": "An authorization library that supports access control models like ACL, RBAC, ABAC in hyperf. ", - "keywords": [ - "abac", - "access-control", - "acl", - "authorization", - "casbin", - "hyperf", - "permission", - "rbac" - ], - "support": { - "issues": "https://github.com/donjan-deng/hyperf-casbin/issues", - "source": "https://github.com/donjan-deng/hyperf-casbin/tree/3.22.2" - }, - "time": "2023-02-16T01:57:41+00:00" - }, { "name": "egulias/email-validator", "version": "3.2.6", @@ -1410,6 +1274,61 @@ }, "time": "2020-11-24T22:02:12+00:00" }, + { + "name": "friendsofhyperf/rector", + "version": "v0.1.5", + "source": { + "type": "git", + "url": "https://github.com/friendsofhyperf/rector.git", + "reference": "896ec187d0b85ac2b2db5e7201a21fbfdf4f3e54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/friendsofhyperf/rector/zipball/896ec187d0b85ac2b2db5e7201a21fbfdf4f3e54", + "reference": "896ec187d0b85ac2b2db5e7201a21fbfdf4f3e54", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0", + "rector/rector": "^0.15.12" + }, + "require-dev": { + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8.2", + "phpstan/phpstan-strict-rules": "^1.2", + "phpstan/phpstan-webmozart-assert": "^1.1", + "phpunit/phpunit": "^10.0", + "rector/phpstan-rules": "^0.6", + "rector/rector-debugging": "dev-main", + "symplify/easy-coding-standard": "^11.0", + "symplify/phpstan-extensions": "^11.0", + "symplify/phpstan-rules": "^11.0", + "symplify/rule-doc-generator": "^11.0", + "symplify/vendor-patches": "^11.0" + }, + "type": "rector-extension", + "autoload": { + "psr-4": { + "Rector\\Hyperf\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Rector upgrades rules for Hyperf.", + "support": { + "issues": "https://github.com/friendsofhyperf/rector/issues", + "source": "https://github.com/friendsofhyperf/rector/tree/v0.1.5" + }, + "time": "2023-06-26T23:32:12+00:00" + }, { "name": "graham-campbell/result-type", "version": "v1.1.2", @@ -1478,83 +1397,6 @@ ], "time": "2023-11-12T22:16:48+00:00" }, - { - "name": "hyperf/cache", - "version": "v3.1.0", - "source": { - "type": "git", - "url": "https://github.com/hyperf/cache.git", - "reference": "ee3baef629a943b793b712b6254c86827127b9d9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hyperf/cache/zipball/ee3baef629a943b793b712b6254c86827127b9d9", - "reference": "ee3baef629a943b793b712b6254c86827127b9d9", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "hyperf/codec": "~3.1.0", - "hyperf/collection": "~3.1.0", - "hyperf/contract": "~3.1.0", - "hyperf/support": "~3.1.0", - "hyperf/utils": "~3.1.0", - "php": ">=8.1", - "psr/container": "^1.0|^2.0", - "psr/simple-cache": "^1.0|^2.0|^3.0" - }, - "suggest": { - "hyperf/di": "Use cache annotations.", - "hyperf/event": "Use listener to delete annotation cache." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - }, - "hyperf": { - "config": "Hyperf\\Cache\\ConfigProvider" - } - }, - "autoload": { - "psr-4": { - "Hyperf\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A cache component for hyperf.", - "homepage": "https://hyperf.io", - "keywords": [ - "cache", - "hyperf", - "php" - ], - "support": { - "docs": "https://hyperf.wiki", - "issues": "https://github.com/hyperf/hyperf/issues", - "pull-request": "https://github.com/hyperf/hyperf/pulls", - "source": "https://github.com/hyperf/hyperf" - }, - "funding": [ - { - "url": "https://hyperf.wiki/#/zh-cn/donate", - "type": "custom" - }, - { - "url": "https://opencollective.com/hyperf", - "type": "open_collective" - } - ], - "time": "2023-11-24T03:10:53+00:00" - }, { "name": "hyperf/code-parser", "version": "v3.1.0", @@ -1755,73 +1597,6 @@ }, "time": "2023-11-17T14:22:59+00:00" }, - { - "name": "hyperf/command", - "version": "v3.1.0-rc.9", - "source": { - "type": "git", - "url": "https://github.com/hyperf/command.git", - "reference": "acb3f6c2860730950abf49f7871dc92676915d33" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hyperf/command/zipball/acb3f6c2860730950abf49f7871dc92676915d33", - "reference": "acb3f6c2860730950abf49f7871dc92676915d33", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "hyperf/collection": "~3.1.0", - "hyperf/context": "~3.1.0", - "hyperf/contract": "~3.1.0", - "hyperf/coroutine": "~3.1.0", - "hyperf/di": "~3.1.0", - "hyperf/stringable": "~3.1.0", - "hyperf/support": "~3.1.0", - "hyperf/tappable": "~3.1.0", - "php": ">=8.1", - "psr/event-dispatcher": "^1.0", - "symfony/console": "^5.0|^6.0" - }, - "suggest": { - "hyperf/di": "Required to use annotations.", - "hyperf/event": "Required to use listeners." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - }, - "hyperf": { - "config": "Hyperf\\Command\\ConfigProvider" - } - }, - "autoload": { - "psr-4": { - "Hyperf\\Command\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Command for hyperf", - "keywords": [ - "command", - "php", - "swoole" - ], - "support": { - "issues": "https://github.com/hyperf/command/issues", - "source": "https://github.com/hyperf/command/tree/v3.1.0-rc.9" - }, - "time": "2023-10-27T01:55:18+00:00" - }, { "name": "hyperf/conditionable", "version": "v3.1.0", @@ -1888,16 +1663,16 @@ }, { "name": "hyperf/config", - "version": "v3.1.0", + "version": "v3.1.2", "source": { "type": "git", "url": "https://github.com/hyperf/config.git", - "reference": "f619a0e6118704707932de56fa8e86ffeec042f1" + "reference": "1364385aeb0c64fa018d2655119a5ab176aadebc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/config/zipball/f619a0e6118704707932de56fa8e86ffeec042f1", - "reference": "f619a0e6118704707932de56fa8e86ffeec042f1", + "url": "https://api.github.com/repos/hyperf/config/zipball/1364385aeb0c64fa018d2655119a5ab176aadebc", + "reference": "1364385aeb0c64fa018d2655119a5ab176aadebc", "shasum": "", "mirrors": [ { @@ -1912,7 +1687,7 @@ "hyperf/support": "~3.1.0", "php": ">=8.1", "psr/container": "^1.0|^2.0", - "symfony/finder": "^5.0|^6.0" + "symfony/finder": "^5.0|^6.0|^7.0" }, "suggest": { "hyperf/context": "Required to use config()", @@ -1967,7 +1742,7 @@ "type": "open_collective" } ], - "time": "2023-11-24T03:10:53+00:00" + "time": "2023-12-08T02:35:39+00:00" }, { "name": "hyperf/constants", @@ -2101,16 +1876,16 @@ }, { "name": "hyperf/contract", - "version": "v3.1.0", + "version": "v3.1.2", "source": { "type": "git", "url": "https://github.com/hyperf/contract.git", - "reference": "2b2f3610fce6c080c6b61764cad2745f7c9a312b" + "reference": "f5379df6df65363d645506f373888372135ac0c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/contract/zipball/2b2f3610fce6c080c6b61764cad2745f7c9a312b", - "reference": "2b2f3610fce6c080c6b61764cad2745f7c9a312b", + "url": "https://api.github.com/repos/hyperf/contract/zipball/f5379df6df65363d645506f373888372135ac0c6", + "reference": "f5379df6df65363d645506f373888372135ac0c6", "shasum": "", "mirrors": [ { @@ -2160,7 +1935,7 @@ "type": "open_collective" } ], - "time": "2023-11-24T03:10:53+00:00" + "time": "2023-12-11T03:14:01+00:00" }, { "name": "hyperf/coordinator", @@ -2229,16 +2004,16 @@ }, { "name": "hyperf/coroutine", - "version": "v3.1.0", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/hyperf/coroutine.git", - "reference": "60ed5835ec00a07da9fb34fb605fd7a99c9f8a5e" + "reference": "cd5bad67724c5c7a7ad749d8e9eb045470488d75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/coroutine/zipball/60ed5835ec00a07da9fb34fb605fd7a99c9f8a5e", - "reference": "60ed5835ec00a07da9fb34fb605fd7a99c9f8a5e", + "url": "https://api.github.com/repos/hyperf/coroutine/zipball/cd5bad67724c5c7a7ad749d8e9eb045470488d75", + "reference": "cd5bad67724c5c7a7ad749d8e9eb045470488d75", "shasum": "", "mirrors": [ { @@ -2295,7 +2070,7 @@ "type": "open_collective" } ], - "time": "2023-11-24T03:10:53+00:00" + "time": "2023-12-01T06:59:45+00:00" }, { "name": "hyperf/database", @@ -2374,81 +2149,6 @@ ], "time": "2023-11-24T03:10:53+00:00" }, - { - "name": "hyperf/db-connection", - "version": "v3.1.0", - "source": { - "type": "git", - "url": "https://github.com/hyperf/db-connection.git", - "reference": "9647e9eeb1788022535988df88585253118554dc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hyperf/db-connection/zipball/9647e9eeb1788022535988df88585253118554dc", - "reference": "9647e9eeb1788022535988df88585253118554dc", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "hyperf/database": "~3.1.0", - "hyperf/di": "~3.1.0", - "hyperf/framework": "~3.1.0", - "hyperf/model-listener": "~3.1.0", - "hyperf/pool": "~3.1.0", - "hyperf/support": "~3.1.0", - "hyperf/utils": "~3.1.0", - "php": ">=8.1", - "psr/container": "^1.0|^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - }, - "hyperf": { - "config": "Hyperf\\DbConnection\\ConfigProvider" - } - }, - "autoload": { - "psr-4": { - "Hyperf\\DbConnection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A hyperf db connection handler for hyperf/database.", - "homepage": "https://hyperf.io", - "keywords": [ - "Connection", - "database", - "hyperf", - "php" - ], - "support": { - "docs": "https://hyperf.wiki", - "issues": "https://github.com/hyperf/hyperf/issues", - "pull-request": "https://github.com/hyperf/hyperf/pulls", - "source": "https://github.com/hyperf/hyperf" - }, - "funding": [ - { - "url": "https://hyperf.wiki/#/zh-cn/donate", - "type": "custom" - }, - { - "url": "https://opencollective.com/hyperf", - "type": "open_collective" - } - ], - "time": "2023-11-24T03:10:53+00:00" - }, { "name": "hyperf/di", "version": "v3.1.0", @@ -2606,16 +2306,16 @@ }, { "name": "hyperf/engine", - "version": "v2.10.3", + "version": "v2.10.4", "source": { "type": "git", "url": "https://github.com/hyperf/engine.git", - "reference": "7e7238708f29f39df643aba25485ba1c075943c1" + "reference": "34ba1825f5b596c677d027e60ec4e2b75c65d09e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/engine/zipball/7e7238708f29f39df643aba25485ba1c075943c1", - "reference": "7e7238708f29f39df643aba25485ba1c075943c1", + "url": "https://api.github.com/repos/hyperf/engine/zipball/34ba1825f5b596c677d027e60ec4e2b75c65d09e", + "reference": "34ba1825f5b596c677d027e60ec4e2b75c65d09e", "shasum": "", "mirrors": [ { @@ -2676,22 +2376,32 @@ ], "support": { "issues": "https://github.com/hyperf/engine/issues", - "source": "https://github.com/hyperf/engine/tree/v2.10.3" + "source": "https://github.com/hyperf/engine/tree/v2.10.4" }, - "time": "2023-09-30T14:57:09+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-12-15T07:47:12+00:00" }, { "name": "hyperf/engine-contract", - "version": "v1.9.0", + "version": "v1.9.1", "source": { "type": "git", "url": "https://github.com/hyperf/engine-contract.git", - "reference": "45c9c49766d8b0e539975fe4c5ed6807221c4b38" + "reference": "fec2e45f35404b2e5b4c3eaf1b0dce67d60771eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/engine-contract/zipball/45c9c49766d8b0e539975fe4c5ed6807221c4b38", - "reference": "45c9c49766d8b0e539975fe4c5ed6807221c4b38", + "url": "https://api.github.com/repos/hyperf/engine-contract/zipball/fec2e45f35404b2e5b4c3eaf1b0dce67d60771eb", + "reference": "fec2e45f35404b2e5b4c3eaf1b0dce67d60771eb", "shasum": "", "mirrors": [ { @@ -2739,9 +2449,19 @@ ], "support": { "issues": "https://github.com/hyperf/engine-contract/issues", - "source": "https://github.com/hyperf/engine-contract/tree/v1.9.0" + "source": "https://github.com/hyperf/engine-contract/tree/v1.9.1" }, - "time": "2023-07-14T02:21:02+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-12-15T07:37:14+00:00" }, { "name": "hyperf/event", @@ -3277,92 +2997,18 @@ ], "time": "2023-11-24T03:10:53+00:00" }, - { - "name": "hyperf/model-listener", - "version": "v3.1.0", - "source": { - "type": "git", - "url": "https://github.com/hyperf/model-listener.git", - "reference": "03ff9d027871fed6f1be784a7835f5e107c7de5f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hyperf/model-listener/zipball/03ff9d027871fed6f1be784a7835f5e107c7de5f", - "reference": "03ff9d027871fed6f1be784a7835f5e107c7de5f", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "hyperf/contract": "~3.1.0", - "hyperf/database": "~3.1.0", - "hyperf/di": "~3.1.0", - "hyperf/event": "~3.1.0", - "hyperf/support": "~3.1.0", - "hyperf/utils": "~3.1.0", - "php": ">=8.1", - "psr/container": "^1.0|^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - }, - "hyperf": { - "config": "Hyperf\\ModelListener\\ConfigProvider" - } - }, - "autoload": { - "psr-4": { - "Hyperf\\ModelListener\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A model listener for Hyperf.", - "homepage": "https://hyperf.io", - "keywords": [ - "hyperf", - "model-listener", - "php", - "swoole" - ], - "support": { - "docs": "https://hyperf.wiki", - "issues": "https://github.com/hyperf/hyperf/issues", - "pull-request": "https://github.com/hyperf/hyperf/pulls", - "source": "https://github.com/hyperf/hyperf" - }, - "funding": [ - { - "url": "https://hyperf.wiki/#/zh-cn/donate", - "type": "custom" - }, - { - "url": "https://opencollective.com/hyperf", - "type": "open_collective" - } - ], - "time": "2023-11-24T03:10:53+00:00" - }, { "name": "hyperf/paginator", - "version": "v3.1.0", + "version": "v3.1.2", "source": { "type": "git", "url": "https://github.com/hyperf/paginator.git", - "reference": "843d0eb4e7ae94907f4bb5bd466e8caa9df37951" + "reference": "0b0c6dda74fd8a8d9c75b5078252d5e1105ad752" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/paginator/zipball/843d0eb4e7ae94907f4bb5bd466e8caa9df37951", - "reference": "843d0eb4e7ae94907f4bb5bd466e8caa9df37951", + "url": "https://api.github.com/repos/hyperf/paginator/zipball/0b0c6dda74fd8a8d9c75b5078252d5e1105ad752", + "reference": "0b0c6dda74fd8a8d9c75b5078252d5e1105ad752", "shasum": "", "mirrors": [ { @@ -3423,7 +3069,7 @@ "type": "open_collective" } ], - "time": "2023-11-24T03:10:53+00:00" + "time": "2023-12-11T03:14:01+00:00" }, { "name": "hyperf/pipeline", @@ -3561,82 +3207,6 @@ ], "time": "2023-11-24T03:10:53+00:00" }, - { - "name": "hyperf/process", - "version": "v3.1.0", - "source": { - "type": "git", - "url": "https://github.com/hyperf/process.git", - "reference": "962149325efc5f762e85286f2cb1cc5511d8a21a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hyperf/process/zipball/962149325efc5f762e85286f2cb1cc5511d8a21a", - "reference": "962149325efc5f762e85286f2cb1cc5511d8a21a", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "hyperf/contract": "~3.1.0", - "hyperf/support": "~3.1.0", - "hyperf/utils": "~3.1.0", - "php": ">=8.1", - "psr/container": "^1.0|^2.0", - "psr/event-dispatcher": "^1.0" - }, - "suggest": { - "hyperf/di": "Required to use annotations.", - "hyperf/event": "Required to dump the message before and after process.", - "hyperf/framework": "Required to use BootProcessListener." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - }, - "hyperf": { - "config": "Hyperf\\Process\\ConfigProvider" - } - }, - "autoload": { - "psr-4": { - "Hyperf\\Process\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A process component for hyperf.", - "homepage": "https://hyperf.io", - "keywords": [ - "hyperf", - "php", - "process" - ], - "support": { - "docs": "https://hyperf.wiki", - "issues": "https://github.com/hyperf/hyperf/issues", - "pull-request": "https://github.com/hyperf/hyperf/pulls", - "source": "https://github.com/hyperf/hyperf" - }, - "funding": [ - { - "url": "https://hyperf.wiki/#/zh-cn/donate", - "type": "custom" - }, - { - "url": "https://opencollective.com/hyperf", - "type": "open_collective" - } - ], - "time": "2023-11-24T03:10:53+00:00" - }, { "name": "hyperf/redis", "version": "v3.1.0", @@ -3856,16 +3426,16 @@ }, { "name": "hyperf/server", - "version": "v3.1.0", + "version": "v3.1.2", "source": { "type": "git", "url": "https://github.com/hyperf/server.git", - "reference": "2c667e0977945d26a56bec53b1c946286cffc3a2" + "reference": "d92c3756ccadd02349fd417eef382d8d55c970bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/server/zipball/2c667e0977945d26a56bec53b1c946286cffc3a2", - "reference": "2c667e0977945d26a56bec53b1c946286cffc3a2", + "url": "https://api.github.com/repos/hyperf/server/zipball/d92c3756ccadd02349fd417eef382d8d55c970bf", + "reference": "d92c3756ccadd02349fd417eef382d8d55c970bf", "shasum": "", "mirrors": [ { @@ -3884,7 +3454,7 @@ "psr/container": "^1.0|^2.0", "psr/event-dispatcher": "^1.0", "psr/log": "^1.0|^2.0|^3.0", - "symfony/console": "^5.0|^6.0" + "symfony/console": "^5.0|^6.0|^7.0" }, "suggest": { "hyperf/event": "Dump the info after server start.", @@ -3932,7 +3502,7 @@ "type": "open_collective" } ], - "time": "2023-11-24T03:10:53+00:00" + "time": "2023-12-12T08:06:45+00:00" }, { "name": "hyperf/stdlib", @@ -4989,16 +4559,16 @@ }, { "name": "nesbot/carbon", - "version": "2.71.0", + "version": "2.72.1", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "98276233188583f2ff845a0f992a235472d9466a" + "reference": "2b3b3db0a2d0556a177392ff1a3bf5608fa09f78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/98276233188583f2ff845a0f992a235472d9466a", - "reference": "98276233188583f2ff845a0f992a235472d9466a", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/2b3b3db0a2d0556a177392ff1a3bf5608fa09f78", + "reference": "2b3b3db0a2d0556a177392ff1a3bf5608fa09f78", "shasum": "", "mirrors": [ { @@ -5008,6 +4578,7 @@ ] }, "require": { + "carbonphp/carbon-doctrine-types": "*", "ext-json": "*", "php": "^7.1.8 || ^8.0", "psr/clock": "^1.0", @@ -5019,8 +4590,8 @@ "psr/clock-implementation": "1.0" }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.1.4", - "doctrine/orm": "^2.7", + "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", "ondrejmirtes/better-reflection": "*", @@ -5097,7 +4668,7 @@ "type": "tidelift" } ], - "time": "2023-09-25T11:31:05+00:00" + "time": "2023-12-08T23:47:49+00:00" }, { "name": "nikic/fast-route", @@ -5157,16 +4728,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.17.1", + "version": "v4.18.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", "shasum": "", "mirrors": [ { @@ -5213,9 +4784,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" }, - "time": "2023-08-13T19:53:39+00:00" + "time": "2023-12-10T21:03:43+00:00" }, { "name": "php-di/phpdoc-reader", @@ -5347,17 +4918,17 @@ "time": "2023-11-12T21:59:55+00:00" }, { - "name": "psr/cache", - "version": "3.0.0", + "name": "phpstan/phpstan", + "version": "1.10.49", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + "url": "https://github.com/phpstan/phpstan.git", + "reference": "9367ba4c4f6ad53e9efb594d74a8941563caccf6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9367ba4c4f6ad53e9efb594d74a8941563caccf6", + "reference": "9367ba4c4f6ad53e9efb594d74a8941563caccf6", "shasum": "", "mirrors": [ { @@ -5367,39 +4938,52 @@ ] }, "require": { - "php": ">=8.0.0" + "php": "^7.2|^8.0" }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } + "files": [ + "bootstrap.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", + "description": "PHPStan - PHP Static Analysis Tool", "keywords": [ - "cache", - "psr", - "psr-6" + "dev", + "static analysis" ], "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" + "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" }, - "time": "2021-02-03T23:26:27+00:00" + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2023-12-12T10:05:12+00:00" }, { "name": "psr/clock", @@ -5929,63 +5513,6 @@ }, "time": "2021-07-14T16:46:02+00:00" }, - { - "name": "psr/simple-cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "support": { - "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" - }, - "time": "2021-10-29T13:26:27+00:00" - }, { "name": "react/promise", "version": "v3.0.0", @@ -6065,6 +5592,73 @@ ], "time": "2023-07-11T16:12:49+00:00" }, + { + "name": "rector/rector", + "version": "0.15.25", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "015935c7ed9e48a4f5895ba974f337e20a263841" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/015935c7ed9e48a4f5895ba974f337e20a263841", + "reference": "015935c7ed9e48a4f5895ba974f337e20a263841", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.10.14" + }, + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.15-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "keywords": [ + "automation", + "dev", + "migration", + "refactoring" + ], + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/0.15.25" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2023-04-20T16:07:39+00:00" + }, { "name": "roave/dont", "version": "1.6.0", @@ -6169,67 +5763,6 @@ }, "time": "2020-09-05T13:00:25+00:00" }, - { - "name": "s1lentium/iptools", - "version": "v1.2.0", - "source": { - "type": "git", - "url": "https://github.com/S1lentium/IPTools.git", - "reference": "88be1aaaab3c50fc131ebe778e246215ff006d8e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/S1lentium/IPTools/zipball/88be1aaaab3c50fc131ebe778e246215ff006d8e", - "reference": "88be1aaaab3c50fc131ebe778e246215ff006d8e", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-bcmath": "*", - "php": "^8.0" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.5", - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "IPTools\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Safarov Alisher", - "email": "alisher.safarov@outlook.com", - "homepage": "https://github.com/S1lentium" - } - ], - "description": "PHP Library for manipulating network addresses (IPv4 and IPv6)", - "keywords": [ - "IP", - "IP-Tools", - "cidr", - "ipv4", - "ipv6", - "network", - "subnet" - ], - "support": { - "issues": "https://github.com/S1lentium/IPTools/issues", - "source": "https://github.com/S1lentium/IPTools/tree/v1.2.0" - }, - "time": "2022-08-17T14:28:59+00:00" - }, { "name": "seld/jsonlint", "version": "1.10.0", @@ -6423,19 +5956,18 @@ }, { "name": "singularity/hdk-auth", - "version": "1.0.0-alpha.7", + "version": "1.0.0-beta.0", "dist": { "type": "zip", - "url": "https://nest.doylee.cn/api/packages/HDK/composer/files/singularity%2Fhdk-auth/1.0.0-alpha.7/singularity-hdk-auth.1.0.0-alpha.7.zip", - "shasum": "2b1b1f4e12d5c51136b1cdcb885c96209d6c07a1" + "url": "https://nest.doylee.cn/api/packages/HDK/composer/files/singularity%2Fhdk-auth/1.0.0-beta.0/singularity-hdk-auth.1.0.0-beta.0.zip", + "shasum": "d334f7fe7f3987243099b86d3bdb8b7b1850ae7b" }, "require": { "composer/composer": ">=2.5.8", - "donjan-deng/hyperf-casbin": "^3.22.2", "ext-redis": "*", "hyperf/validation": "3.1.*", "php": ">=8.1", - "singularity/hdk-core": "^1.0.0-alpha.16", + "singularity/hdk-core": "^1.0.0", "symfony/polyfill-php82": "*", "symfony/polyfill-php83": "*" }, @@ -6464,23 +5996,24 @@ "MIT" ], "description": "登录控制", - "time": "2023-12-04T17:36:14+08:00" + "time": "2023-12-25T16:40:23+08:00" }, { "name": "singularity/hdk-core", - "version": "1.0.0-alpha.16", + "version": "1.0.0-beta.1", "dist": { "type": "zip", - "url": "https://nest.doylee.cn/api/packages/HDK/composer/files/singularity%2Fhdk-core/1.0.0-alpha.16/singularity-hdk-core.1.0.0-alpha.16.zip", - "shasum": "b11b13994049f2896dac76a08aeb49afd0b4b3b1" + "url": "https://nest.doylee.cn/api/packages/HDK/composer/files/singularity%2Fhdk-core/1.0.0-beta.1/singularity-hdk-core.1.0.0-beta.1.zip", + "shasum": "6256a7175918c711bd3d5a8eb9e1e8b05a6137fc" }, "require": { "composer/composer": ">=2.0", - "ergebnis/http-method": "^2.2", + "ergebnis/http-method": "^2.5", "ext-dom": "*", "ext-libxml": "*", "ext-redis": "^5.3|^6.0", "ext-swoole": "*", + "friendsofhyperf/rector": "^0.1.5", "hyperf/config": "3.1.*", "hyperf/constants": "3.1.*", "hyperf/context": "3.1.*", @@ -6491,21 +6024,22 @@ "hyperf/resource": "3.1.*", "hyperf/translation": "3.1.*", "jetbrains/phpstorm-attributes": "^1.0", - "lmc/http-constants": "^1.2", - "myclabs/php-enum": "^1.8", + "lmc/http-constants": "^1.2.0", + "myclabs/php-enum": "^1.8.4", "php": ">=8.1", - "roave/dont": "^1.5", - "symfony/http-foundation": "^6.0", - "symfony/polyfill-php81": "^1.26", - "teapot/status-code": "^1.1" + "roave/dont": "^1.6.0", + "symfony/http-foundation": "^6.4", + "symfony/polyfill-php81": "^1.28", + "symfony/polyfill-php82": "^1.28", + "symfony/polyfill-php83": "^1.28", + "teapot/status-code": "^1.1.2" }, "require-dev": { "alibabacloud/dysmsapi-20170525": "^2.0", - "firebase/php-jwt": "^6.1", + "firebase/php-jwt": "^6.9", "friendsofhyperf/pest-plugin-hyperf": "3.1.*", - "friendsofhyperf/rector": "^0.1.5", - "friendsofphp/php-cs-fixer": "^3.13", - "guzzlehttp/guzzle": "^7.5", + "friendsofphp/php-cs-fixer": "^3.41.1", + "guzzlehttp/guzzle": "^7.8", "hyperf/crontab": "3.1.*", "hyperf/database": "3.1.*", "hyperf/db": "3.1.*", @@ -6514,12 +6048,13 @@ "hyperf/testing": "^3.1", "hyperf/validation": "3.1.*", "pestphp/pest": "^2.23", - "phpstan/phpstan": "^1.9", + "phpstan/phpstan": "^1.10.49", + "rector/rector": "^0.15.25", "roave/security-advisories": "dev-latest", "spatie/pest-plugin-test-time": "^2.0", "swoole/ide-helper": "*", - "symfony/mailer": "^6.0", - "symfony/serializer": "^6.0" + "symfony/mailer": "^6.4.0", + "symfony/serializer": "^6.4.1" }, "suggest": { "alibabacloud/dysmsapi-20170525": "阿里云短信服务必需", @@ -6557,7 +6092,7 @@ } ], "description": "Common Hyperf Development Kit", - "time": "2023-12-04T17:15:32+08:00" + "time": "2023-12-15T16:09:12+08:00" }, { "name": "swow/psr7-plus", @@ -6615,190 +6150,6 @@ }, "time": "2023-06-15T09:18:11+00:00" }, - { - "name": "symfony/cache", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "ac2d25f97b17eec6e19760b6b9962a4f7c44356a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/ac2d25f97b17eec6e19760b6b9962a4f7c44356a", - "reference": "ac2d25f97b17eec6e19760b6b9962a4f7c44356a", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=8.1", - "psr/cache": "^2.0|^3.0", - "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3", - "symfony/var-exporter": "^6.3.6|^7.0" - }, - "conflict": { - "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/var-dumper": "<5.4" - }, - "provide": { - "psr/cache-implementation": "2.0|3.0", - "psr/simple-cache-implementation": "1.0|2.0|3.0", - "symfony/cache-implementation": "1.1|2.0|3.0" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/dbal": "^2.13.1|^3|^4", - "predis/predis": "^1.1|^2.0", - "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Cache\\": "" - }, - "classmap": [ - "Traits/ValueWrapper.php" - ], - "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 extended PSR-6, PSR-16 (and tags) implementations", - "homepage": "https://symfony.com", - "keywords": [ - "caching", - "psr6" - ], - "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.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": "2023-11-24T19:28:07+00:00" - }, - { - "name": "symfony/cache-contracts", - "version": "v3.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache-contracts.git", - "reference": "1d74b127da04ffa87aa940abe15446fa89653778" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/1d74b127da04ffa87aa940abe15446fa89653778", - "reference": "1d74b127da04ffa87aa940abe15446fa89653778", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=8.1", - "psr/cache": "^3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Cache\\": "" - } - }, - "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 caching", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.4.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": "2023-09-25T12:52:38+00:00" - }, { "name": "symfony/console", "version": "v6.4.1", @@ -7140,76 +6491,6 @@ ], "time": "2023-05-23T14:45:45+00:00" }, - { - "name": "symfony/expression-language", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/expression-language.git", - "reference": "6c8b12f1e5ee5d91b812fb8628fca86e2fe5d152" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/6c8b12f1e5ee5d91b812fb8628fca86e2fe5d152", - "reference": "6c8b12f1e5ee5d91b812fb8628fca86e2fe5d152", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=8.1", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\ExpressionLanguage\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an engine that can compile and evaluate expressions", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/expression-language/tree/v6.4.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": "2023-07-27T06:52:43+00:00" - }, { "name": "symfony/filesystem", "version": "v6.4.0", @@ -8823,87 +8104,6 @@ ], "time": "2023-07-25T15:08:44+00:00" }, - { - "name": "symfony/var-exporter", - "version": "v6.4.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/2d08ca6b9cc704dce525615d1e6d1788734f36d9", - "reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "require-dev": { - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "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": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], - "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.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": "2023-11-30T10:32:10+00:00" - }, { "name": "teapot/status-code", "version": "v1.1.2", @@ -9364,16 +8564,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.40.1", + "version": "v3.42.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "7002f09c9593f515625a9f9717b10c2ab64dd3d5" + "reference": "632ef1be3447a9b890bef06147475facee535d0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7002f09c9593f515625a9f9717b10c2ab64dd3d5", - "reference": "7002f09c9593f515625a9f9717b10c2ab64dd3d5", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/632ef1be3447a9b890bef06147475facee535d0f", + "reference": "632ef1be3447a9b890bef06147475facee535d0f", "shasum": "", "mirrors": [ { @@ -9409,10 +8609,7 @@ "php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", - "phpspec/prophecy": "^1.17", - "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.6", - "symfony/phpunit-bridge": "^6.3.8 || ^7.0", "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { @@ -9451,7 +8648,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.40.1" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.42.0" }, "funding": [ { @@ -9459,7 +8656,7 @@ "type": "github" } ], - "time": "2023-12-02T23:18:26+00:00" + "time": "2023-12-24T14:38:51+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -10499,16 +9696,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.24.4", + "version": "1.24.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "6bd0c26f3786cd9b7c359675cb789e35a8e07496" + "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6bd0c26f3786cd9b7c359675cb789e35a8e07496", - "reference": "6bd0c26f3786cd9b7c359675cb789e35a8e07496", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fedf211ff14ec8381c9bf5714e33a7a552dd1acc", + "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc", "shasum": "", "mirrors": [ { @@ -10546,90 +9743,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.4" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.5" }, - "time": "2023-11-26T18:29:22+00:00" - }, - { - "name": "phpstan/phpstan", - "version": "1.10.46", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "90d3d25c5b98b8068916bbf08ce42d5cb6c54e70" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/90d3d25c5b98b8068916bbf08ce42d5cb6c54e70", - "reference": "90d3d25c5b98b8068916bbf08ce42d5cb6c54e70", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "php": "^7.2|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan - PHP Static Analysis Tool", - "keywords": [ - "dev", - "static analysis" - ], - "support": { - "docs": "https://phpstan.org/user-guide/getting-started", - "forum": "https://github.com/phpstan/phpstan/discussions", - "issues": "https://github.com/phpstan/phpstan/issues", - "security": "https://github.com/phpstan/phpstan/security/policy", - "source": "https://github.com/phpstan/phpstan-src" - }, - "funding": [ - { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://github.com/phpstan", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" - } - ], - "time": "2023-11-28T14:57:26+00:00" + "time": "2023-12-16T09:33:33+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.8", + "version": "10.1.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "84838eed9ded511f61dc3e8b5944a52d9017b297" + "reference": "78c3b7625965c2513ee96569a4dbb62601784145" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/84838eed9ded511f61dc3e8b5944a52d9017b297", - "reference": "84838eed9ded511f61dc3e8b5944a52d9017b297", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", + "reference": "78c3b7625965c2513ee96569a4dbb62601784145", "shasum": "", "mirrors": [ { @@ -10642,7 +9771,7 @@ "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1", "phpunit/php-file-iterator": "^4.0", "phpunit/php-text-template": "^3.0", @@ -10692,7 +9821,7 @@ "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/10.1.8" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" }, "funding": [ { @@ -10700,7 +9829,7 @@ "type": "github" } ], - "time": "2023-11-15T13:31:15+00:00" + "time": "2023-12-21T15:38:30+00:00" }, { "name": "phpunit/php-file-iterator", @@ -11346,16 +10475,16 @@ }, { "name": "sebastian/complexity", - "version": "3.1.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" + "reference": "68ff824baeae169ec9f2137158ee529584553799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", - "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", "shasum": "", "mirrors": [ { @@ -11365,7 +10494,7 @@ ] }, "require": { - "nikic/php-parser": "^4.10", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { @@ -11374,7 +10503,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.2-dev" } }, "autoload": { @@ -11398,7 +10527,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" }, "funding": [ { @@ -11406,7 +10535,7 @@ "type": "github" } ], - "time": "2023-09-28T11:50:59+00:00" + "time": "2023-12-21T08:37:17+00:00" }, { "name": "sebastian/diff", @@ -11705,16 +10834,16 @@ }, { "name": "sebastian/lines-of-code", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "shasum": "", "mirrors": [ { @@ -11724,7 +10853,7 @@ ] }, "require": { - "nikic/php-parser": "^4.10", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { @@ -11757,7 +10886,7 @@ "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/2.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" }, "funding": [ { @@ -11765,7 +10894,7 @@ "type": "github" } ], - "time": "2023-08-31T09:25:50+00:00" + "time": "2023-12-21T08:38:20+00:00" }, { "name": "sebastian/object-enumerator", diff --git a/phpstan.dist.neon b/phpstan.dist.neon new file mode 100644 index 0000000..521d10f --- /dev/null +++ b/phpstan.dist.neon @@ -0,0 +1,15 @@ +parameters: + level: 1 + reportUnmatchedIgnoredErrors: false + checkGenericClassInNonGenericObjectType: false + paths: + - publish + - src + - tests + ignoreErrors: + - '#Constant BASE_PATH not found#' + - '#Unknown parameter \$[a-zA-Z0-9]+ in call to callable Closure\.#' + - '#Property [a-zA-Z0-9\\_]+::\$[a-zA-Z0-9]+ is never written, only read\.#' + - '#Method [a-zA-Z0-9\\_]+::[a-zA-Z0-9]+\(\) is unused\.#' + - '#Method [a-zA-Z0-9\\_]+::[a-zA-Z0-9]+\(\) has parameter \$response with no value type specified in iterable type array\.#' + - '#Undefined variable: \$this#' diff --git a/phpunit.xml b/phpunit.xml index d2c615a..7fe4569 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,15 +1,20 @@ - - - ./tests/ - - \ No newline at end of file + + + + ./tests/ + + + + + ./src + + + diff --git a/publish/languages/en/saml_error.php b/publish/languages/en/saml_error.php index 41307e7..9c51e74 100644 --- a/publish/languages/en/saml_error.php +++ b/publish/languages/en/saml_error.php @@ -14,4 +14,4 @@ return [ 'saml_request' => 'SAMLRequest is required', 'saml_response' => 'SAMLResponse is required', ], -]; \ No newline at end of file +]; diff --git a/publish/languages/zh_CN/saml_error.php b/publish/languages/zh_CN/saml_error.php index c3200b3..dd7b903 100644 --- a/publish/languages/zh_CN/saml_error.php +++ b/publish/languages/zh_CN/saml_error.php @@ -14,4 +14,4 @@ return [ 'saml_request' => 'SAMLRequest 参数不能为空', 'saml_response' => 'SAMLResponse 参数不能为空', ], -]; \ No newline at end of file +]; diff --git a/publish/saml.php b/publish/saml.php index 5e966fb..a8fd4eb 100644 --- a/publish/saml.php +++ b/publish/saml.php @@ -2,21 +2,23 @@ declare(strict_types=1); +use function Hyperf\Support\env; + return [ // 当前项目类型 'type' => 'sp', // 可选值:sp/idp - + // 是否支持多用户同时在线 'allow_multi_online' => true, - + // IDP 相关配置 'server' => [ // common config 'idp_id' => env('IDP_ID', 'https://test-accountx.luxcreo.cn/api/v1/auth'), // 单点登录 - + // idp config - + // sp config // 以下内容向服务端申请 'idp_assertion_url' => env('IDP_ASSERTION_URL', 'https://test-accountx.luxcreo.cn/api/v1/auth/assertion'), @@ -24,16 +26,16 @@ return [ 'idp_logout_url' => env('IDP_LOGOUT_URL', 'https://test-accountx.luxcreo.cn/api/v1/slo'), //单点退出 ], - + // SP 相关配置 'client' => [ // sp config // 以下内容向服务端申请 'entity_id' => env('ENTITY_ID', ''), // TODO 业务系统唯一标识 'acs_url' => env('ACS_URL', ''), // TODO 回调地址 - 'landing_host' =>env('LANDING_HOST', ''), // TODO 站点 host + 'landing_host' => env('LANDING_HOST', ''), // TODO 站点 host ], - + // 证书 'credential' => [ 'enable' => false, @@ -42,4 +44,4 @@ return [ 'crt' => 'saml.crt', 'pem' => 'saml.pem', ], -]; \ No newline at end of file +]; diff --git a/src/Constants/SamlErrorCode.php b/src/Constants/SamlErrorCode.php index 86df1c5..29d4fc9 100644 --- a/src/Constants/SamlErrorCode.php +++ b/src/Constants/SamlErrorCode.php @@ -7,6 +7,7 @@ * Created on 2022/4/25 */ declare(strict_types=1); + namespace Singularity\HyperfSaml\Constants; use Hyperf\Constants\AbstractConstants; @@ -23,27 +24,26 @@ use Hyperf\Constants\Annotation\Constants; */ class SamlErrorCode extends AbstractConstants { - // 203 SAML 鉴权 /** * @Message("saml_error.default") */ public const AUTH_SAML_ERROR = 203000; - + // 20301 验证 /** * @Message("saml_error.params.default") */ public const AUTH_SAML_REQUEST_PARAMS_ERROR = 2030100; - + /** * @Message("saml_error.params.saml_request") */ public const AUTH_SAML_REQUEST_PARAMS_SAML_REQUEST = 2030101; - + /** * @Message("saml_error.params.saml_response") */ public const AUTH_SAML_REQUEST_PARAMS_SAML_RESPONSE = 2030102; - -} \ No newline at end of file + +} diff --git a/src/Exceptions/Handler/SamlIdpHandler.php b/src/Exceptions/Handler/SamlIdpHandler.php index 9541b8c..3fc8596 100644 --- a/src/Exceptions/Handler/SamlIdpHandler.php +++ b/src/Exceptions/Handler/SamlIdpHandler.php @@ -1,6 +1,7 @@ stopPropagation(); - + // IDP 相关 if ($throwable instanceof ValidationException) { $SAMLResponse = $this->logoutService->createLogoutResponse( @@ -84,7 +87,7 @@ class SamlIdpHandler extends ExceptionHandler messageId: $throwable->getMessageId(), ); } - + $error_type = get_class($throwable); $data = [ 'errorCode' => $throwable->getCode(), @@ -98,7 +101,7 @@ class SamlIdpHandler extends ExceptionHandler 'sp' => config('saml.client.entity_id'), 'messageId' => $throwable->getMessageId(), ], JSON_UNESCAPED_UNICODE); - + $this->logger->error( <<getRelayState(), [] ); - + $this->logger->error("location: $url"); return $response ->withStatus(302) ->withAddedHeader('Location', $url); } - + /** * @inheritDoc */ @@ -150,4 +153,4 @@ ERROR_LOG { return $throwable instanceof RuntimeException; } -} \ No newline at end of file +} diff --git a/src/Exceptions/Handler/SamlSpHandler.php b/src/Exceptions/Handler/SamlSpHandler.php index 2a0a9e6..72f0dca 100644 --- a/src/Exceptions/Handler/SamlSpHandler.php +++ b/src/Exceptions/Handler/SamlSpHandler.php @@ -1,14 +1,16 @@ stopPropagation(); - + $restful = config('common.response.restful'); $code_name = config('common.response.code_name'); $message_name = config('common.response.message_name'); - + $this->request?->url(); - + $error_type = get_class($throwable); - + $is_testing = config('app_status') === true; $is_debug = $this->request?->hasHeader('Postman-Token') || $this->request?->header('User-Agent') === 'apifox/2.1.8 (https://www.apifox.cn)'; - + $data = [ $code_name => $throwable->getCode(), $message_name => $throwable->getMessage(), ]; - + // 验证失败 if ($throwable instanceof ValidationException) { $code = $throwable->getCode(); @@ -82,8 +86,8 @@ class SamlSpHandler extends ExceptionHandler $data['availableValue'] = $throwable->getAvailableValue(); } } - - + + // 整理日志所需的数据 $request_time = date('Y-m-d H:i:s'); $request_headers = $this->request->getHeaders(); @@ -93,20 +97,19 @@ class SamlSpHandler extends ExceptionHandler 'sp' => config('saml.client.entity_id'), 'messageId' => $throwable->getMessageId(), ], JSON_UNESCAPED_UNICODE); - - + + $response = $response->withHeader( Header::CONTENT_TYPE, 'application/json; charset=utf-8' ); - + if ($is_debug && $is_testing) { $data['trace'] = [ 'errorType' => $error_type, 'errorTrack' => $throwable->getTrace(), ]; } - $cookies = json_encode($this->request->getCookieParams(), JSON_UNESCAPED_UNICODE); $this->logger->error( <<withStatus( - $status_code ?? $throwable->status ?? $throwable->statusCode ?? RFC7231::INTERNAL_SERVER_ERROR @@ -154,7 +156,7 @@ ERROR_LOG new SwooleStream($data) ); } - + /** * @inheritDoc */ @@ -162,4 +164,4 @@ ERROR_LOG { return $throwable instanceof RuntimeException; } -} \ No newline at end of file +} diff --git a/src/Exceptions/Logout/ValidationException.php b/src/Exceptions/Logout/ValidationException.php index 503b704..ca023a2 100644 --- a/src/Exceptions/Logout/ValidationException.php +++ b/src/Exceptions/Logout/ValidationException.php @@ -1,11 +1,11 @@ statusCode; } - + /** * @return string */ @@ -33,7 +34,7 @@ class RuntimeException extends \RuntimeException { return $this->relayState; } - + /** * @return string */ @@ -41,4 +42,4 @@ class RuntimeException extends \RuntimeException { return $this->messageId; } -} \ No newline at end of file +} diff --git a/src/Exceptions/ValidationException.php b/src/Exceptions/ValidationException.php index 0544976..484e33b 100644 --- a/src/Exceptions/ValidationException.php +++ b/src/Exceptions/ValidationException.php @@ -1,6 +1,7 @@ field; } - + /** * @return mixed */ @@ -47,7 +48,7 @@ class ValidationException extends RuntimeException { return $this->currentValue; } - + /** * @return array */ @@ -55,4 +56,4 @@ class ValidationException extends RuntimeException { return $this->availableValue; } -} \ No newline at end of file +} diff --git a/src/Services/AbstractService.php b/src/Services/AbstractService.php index 31bb837..33a3416 100644 --- a/src/Services/AbstractService.php +++ b/src/Services/AbstractService.php @@ -52,14 +52,14 @@ abstract class AbstractService try { $bindingFactory = new BindingFactory(); $binding = $bindingFactory->getBindingByRequest($requestInstance); - + // We prepare a message context to receive our SAML Request message. $messageContext = new MessageContext(); - + // The received method fills in the messageContext with the SAML Request data. /** @var \LightSaml\Model\Protocol\Response $response */ $binding->receive($requestInstance, $messageContext); - + return $messageContext; } catch (InvalidArgumentException $exception) { throw new ValidationException( @@ -68,7 +68,7 @@ abstract class AbstractService ); } } - + /** * 响应给 ACS * @@ -93,10 +93,10 @@ abstract class AbstractService } $messageContext = new MessageContext(); $messageContext->setMessage($responseInstance); - + $bindingFactory = new BindingFactory(); $redirectBinding = $bindingFactory->create($bindingType); - + // Ensure we include the RelayState. $message = $messageContext->getMessage(); $rs = $message->getRelayState(); @@ -104,29 +104,29 @@ abstract class AbstractService $message->setRelayState($relayState); $messageContext->setMessage($message); } - + // Return the Response. /** @var \Symfony\Component\HttpFoundation\RedirectResponse $httpResponse */ $httpResponse = $redirectBinding->send($messageContext); - + $url_parts = parse_url($httpResponse->getTargetUrl()); - + $query = []; parse_str($url_parts['query'], $query); // $query['Signature'] = $this->base64Wrapper->encode($query['Signature']); - + $query += $extraParams; $url_parts['query'] = http_build_query($query); $url_parts['port'] ??= '80'; if ($url_parts['port'] !== '80') { $url_parts['host'] .= ':' . $url_parts['port']; } - + $url = $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'] . '?' . $url_parts['query']; if (!$returnHtml) { return $url; } - + return sprintf( ' @@ -142,7 +142,7 @@ abstract class AbstractService ); // return $httpResponse->setTargetUrl($url)->getContent(); } - + public function requestParser($request): Request { $params = $request->getQueryParams(); @@ -152,7 +152,7 @@ abstract class AbstractService $params, ); } - + /** * Retrieves the certificate from the IdP. * @@ -162,7 +162,7 @@ abstract class AbstractService { return X509Certificate::fromFile('cert/server.crt'); } - + /** * Retrieves the private key from the Idp. * @@ -172,4 +172,4 @@ abstract class AbstractService { return KeyHelper::createPrivateKey('cert/server.key', '', true); } -} \ No newline at end of file +} diff --git a/src/Services/Base.php b/src/Services/Base.php index 67eb1ad..189f3da 100644 --- a/src/Services/Base.php +++ b/src/Services/Base.php @@ -37,6 +37,8 @@ use RobRichards\XMLSecLibs\XMLSecurityKey; use Singularity\HDK\Auth\Resource\User; use Throwable; +use function Hyperf\Config\config; + /** * Singularity\HyperfSaml\Lib\Base@HyperfSaml * @@ -424,4 +426,4 @@ class Base extends AbstractService { return $response->getRelayState(); } -} \ No newline at end of file +} diff --git a/src/Services/Idp/AbstractLoginService.php b/src/Services/Idp/AbstractLoginService.php index 49f7725..b85ab81 100644 --- a/src/Services/Idp/AbstractLoginService.php +++ b/src/Services/Idp/AbstractLoginService.php @@ -1,6 +1,7 @@ assertionBuilder( @@ -64,12 +65,12 @@ class AbstractLoginService extends AbstractService $messageId, $sp?->acsUrl ?? '' ); - + // 加密 $certificate = (new X509Certificate())->loadPem($sp->secret); $encryptedAssertion = new EncryptedAssertionWriter(); $encryptedAssertion->encrypt($assertion, KeyHelper::createPublicKey($certificate)); - + $response // ->addAssertion($assertion) ->addEncryptedAssertion($encryptedAssertion) @@ -79,21 +80,21 @@ class AbstractLoginService extends AbstractService ->setID(Helper::generateID()) ->setIssueInstant(new DateTime()) ->setDestination($sp->acsUrl); - + // Sign the response. // $response->setSignature( // new SignatureWriter($this->getCertificate(), $this->getPrivateKey()) // ); - + // Preparing the response XML $serializationContext = new SerializationContext(); - + // Serialize to XML. $response->serialize($serializationContext->getDocument(), $serializationContext); - + return $response; } - + /** * 断言构建器 * @@ -111,33 +112,33 @@ class AbstractLoginService extends AbstractService string $acsUrl = '' ): Assertion { $assertion = new Assertion(); - + $this->logger->info('生成 NameID: ' . $user?->uid ?? 'nil'); // 构建基本信息 $name_id = new NameID( $user?->uid ?? 'nil', SamlConstants::NAME_ID_FORMAT_PERSISTENT ); - + $subject = new Subject(); $subject_confirmation = new SubjectConfirmation(); $subject_confirmation_data = new SubjectConfirmationData(); - + $subject_confirmation_data = $subject_confirmation_data ->setInResponseTo($messageId) # SAML 请求的标识 ->setNotOnOrAfter(new DateTime('+1 MINUTE')) # 有效期 1 分钟内 ->setRecipient($acsUrl); # 断言消费服务的地址 - + /** @var SubjectConfirmation 验证数据 $subject_confirmation */ $subject_confirmation = $subject_confirmation ->setMethod(SamlConstants::CONFIRMATION_METHOD_BEARER) ->setSubjectConfirmationData($subject_confirmation_data); - + /** @var Subject 主题/标题 $subject */ $subject = $subject ->setNameID($name_id) ->addSubjectConfirmation($subject_confirmation); - + // 配置生效条件 $conditions = new Conditions(); $conditions = $conditions @@ -146,18 +147,18 @@ class AbstractLoginService extends AbstractService ->addItem( new AudienceRestriction([$issuerId])# 受众限制 ); - + $assertion = $assertion ->setId(Helper::generateID()) # 本次的 MessageID ->setIssueInstant(new DateTime()) # 当前时间戳 ->setIssuer(new Issuer($this->idpId)) # 发信人——IDP的entityID ->setSubject($subject)# 设置主题/标题 ->setConditions($conditions); - + // 补充更多内容 if (isset($user)) { $attribute_statement = new AttributeStatement(); - + // uid $attribute_statement = $attribute_statement ->addAttribute( @@ -172,7 +173,7 @@ class AbstractLoginService extends AbstractService $user->uid ?? null ) ); - + // secEmail $attribute_statement = $attribute_statement ->addAttribute( @@ -187,7 +188,7 @@ class AbstractLoginService extends AbstractService $user->secEmail ?? null ) ); - + // username $attribute_statement = $attribute_statement ->addAttribute( @@ -202,7 +203,7 @@ class AbstractLoginService extends AbstractService $user->username ?? null ) ); - + // 密码 $attribute_statement = $attribute_statement ->addAttribute( @@ -216,7 +217,7 @@ class AbstractLoginService extends AbstractService !empty($user->password) ) ); - + //其他 $attribute_statement = $attribute_statement ->addAttribute( @@ -236,11 +237,11 @@ class AbstractLoginService extends AbstractService $user->avatar ) ); - + $assertion->addItem($attribute_statement); } - + return $assertion; } - -} \ No newline at end of file + +} diff --git a/src/Services/Idp/AbstractLogoutService.php b/src/Services/Idp/AbstractLogoutService.php index 152a3a3..2cb5680 100644 --- a/src/Services/Idp/AbstractLogoutService.php +++ b/src/Services/Idp/AbstractLogoutService.php @@ -16,6 +16,8 @@ use Singularity\HDK\Core\Constants\CommonErrorCode; use Singularity\HyperfSaml\Exceptions\Logout\ValidationException; use Singularity\HyperfSaml\Services\AbstractService; +use function Hyperf\Config\config; + class AbstractLogoutService extends AbstractService { /** @@ -153,4 +155,4 @@ class AbstractLogoutService extends AbstractService return $user; } -} \ No newline at end of file +} diff --git a/src/Services/Sp/Assertion.php b/src/Services/Sp/Assertion.php index ac79290..c99845b 100644 --- a/src/Services/Sp/Assertion.php +++ b/src/Services/Sp/Assertion.php @@ -31,6 +31,8 @@ use Singularity\HyperfSaml\Exceptions\RuntimeException; use Singularity\HyperfSaml\Exceptions\ValidationException; use Singularity\HyperfSaml\Services\Base; +use function Hyperf\Config\config; + /** * 断言操作类 * 用于获取用户登录状态 @@ -181,4 +183,4 @@ class Assertion )->withHeader(Header::CONTENT_TYPE, 'text/html'); // return $this->response->redirect($landing_url, RFC7231::FOUND); } -} \ No newline at end of file +} diff --git a/src/Services/Sp/MetadataProfile.php b/src/Services/Sp/MetadataProfile.php index f4aefd5..7a9b061 100644 --- a/src/Services/Sp/MetadataProfile.php +++ b/src/Services/Sp/MetadataProfile.php @@ -8,9 +8,9 @@ */ declare(strict_types=1); + namespace Singularity\HyperfSaml\Services\Sp; class MetadataProfile { - -} \ No newline at end of file +} diff --git a/src/Services/Sp/Slo.php b/src/Services/Sp/Slo.php index 16139d1..ad8cf74 100644 --- a/src/Services/Sp/Slo.php +++ b/src/Services/Sp/Slo.php @@ -15,10 +15,13 @@ use Hyperf\HttpServer\Contract\RequestInterface; use Hyperf\HttpServer\Contract\ResponseInterface; use Hyperf\Redis\Redis; use Psr\Http\Message\ResponseInterface as PsrResponseInterface; +use RedisException; use Singularity\HDK\Auth\Services\AuthenticationInterface; use Singularity\HyperfSaml\Services\Base; use Teapot\StatusCode\RFC\RFC7231; +use function Hyperf\Config\config; + /** * 单点退出登录 * Singularity\HyperfSaml\Services\Sp\Slo@HyperfSaml @@ -30,30 +33,30 @@ use Teapot\StatusCode\RFC\RFC7231; class Slo { public function __construct( - private Base $base, - private RequestInterface $request, - private ResponseInterface $response, - private AuthenticationInterface $authentication, - private Redis $redis + private readonly Base $base, + private readonly RequestInterface $request, + private readonly ResponseInterface $response, + private readonly AuthenticationInterface $authentication, + private readonly Redis $redis ) { } - + /** * 重定向方式退出单点登录 * * @param string $uid * @param string $originToken * - * @return \Psr\Http\Message\ResponseInterface + * @return PsrResponseInterface */ public function redirect(string $uid, string $originToken): PsrResponseInterface { $idpId = config('saml.server.idp_logout_url'); $issuer = config('saml.client.entity_id'); $this->authentication->invalidByToken(); - + $relayState = $this->request->query('RelayState', ''); - + $url = $this->base->createLogoutRequest( uid: $uid, token: $originToken, @@ -61,27 +64,28 @@ class Slo issuer: $issuer, relayState: $relayState ); - + return $this->response->redirect($url, RFC7231::FOUND); } - + /** * 回调方式退出单点登录(IDP 通知 SP) * - * @return \Psr\Http\Message\ResponseInterface Account 只根据 StatusCode 判断, 符合 [200, 300) 即可 + * @return PsrResponseInterface Account 只根据 StatusCode 判断, 符合 [200, 300) 即可 + * @throws RedisException */ public function callback(): PsrResponseInterface { $redis_prefix = config('common.redis.prefix'); - + $uid = $this->request->query('uid'); $originToken = $this->request->query('token'); - + if (empty($originToken)) { $this->authentication->invalidByUser($uid); } else { $key = "{$redis_prefix}user:token_map:$uid"; - + $token = $this->redis->hGet($key, $originToken); $this->redis->hDel($key, $originToken); if ($token) { @@ -90,4 +94,4 @@ class Slo } return $this->response->raw('')->withStatus(RFC7231::NO_CONTENT); } -} \ No newline at end of file +} diff --git a/src/Services/Sp/Sso.php b/src/Services/Sp/Sso.php index 63e6040..f22a446 100644 --- a/src/Services/Sp/Sso.php +++ b/src/Services/Sp/Sso.php @@ -11,7 +11,7 @@ declare(strict_types=1); namespace Singularity\HyperfSaml\Services\Sp; -use Hyperf\Utils\Codec\Json; +use Hyperf\Codec\Json; use Singularity\HDK\Core\Constants\CommonErrorCode; use Singularity\HDK\Core\Exceptions\Forbidden; use Swoole\Exception; @@ -24,6 +24,8 @@ use Psr\Http\Message\ResponseInterface as PsrResponseInterface; use Singularity\HyperfSaml\Services\Base; use Teapot\StatusCode\RFC\RFC7231; +use function Hyperf\Config\config; + /** * SP 单点登录 * Singularity\HyperfSaml\Sp\Sso@HyperfSaml @@ -38,7 +40,7 @@ class Sso private string $idpAssertionUrl; private string $acsUrl; private string $issuer; - + public function __construct( private Base $base, private RequestInterface $request, @@ -48,11 +50,11 @@ class Sso ) { $this->idpId = config('saml.server.idp_id'); $this->idpAssertionUrl = config('saml.server.idp_assertion_url'); - + $this->issuer = config('saml.client.entity_id'); $this->acsUrl = config('saml.client.acs_url'); } - + /** * 自动重定向获取用户登录状态 * @@ -67,7 +69,7 @@ class Sso ); return $this->response->redirect($url, RFC7231::FOUND); } - + /** * 自动重定向到单点登录 * @@ -77,7 +79,7 @@ class Sso { $language = $this->request->query('language') ?? config('language') ?? 'zh_CN'; $relayState = $this->request->query('RelayState', ''); - + $url = $this->base->createSamlRequest( idpID: $this->idpId, acsUrl: $this->acsUrl, @@ -89,7 +91,7 @@ class Sso ); return $this->response->redirect($url, RFC7231::FOUND); } - + /** * 验证用户同时在多个设备登录 * @@ -104,7 +106,7 @@ class Sso public function checkMultiDeviceOnline($uid, $token): void { $allow_multi_online = config('saml.allow_multi_online'); - + // 只对限制为单设备登录的业务进行验证 if ($allow_multi_online) { return; @@ -112,7 +114,7 @@ class Sso $redis_prefix = config('common.redis.prefix'); $key = "{$redis_prefix}user:token_map:{$uid}"; $type = $this->redis->type($key); - + try { $this->stdoutLogger->info('user_token redis type: ' . $type); switch ($type) { @@ -131,7 +133,7 @@ class Sso $this->stdoutLogger->info('user_token redis key: ' . $origin_token); $latest_token = $this->redis->hGet($key, $origin_token); $this->stdoutLogger->info('user_token redis value isset: ' . $latest_token); - + if (empty($latest_token) || $latest_token !== $token) { throw new Exception(code: CommonErrorCode::AUTH_SESSION_CREATED_AT_ERROR); } @@ -144,8 +146,8 @@ class Sso } catch (Exception $e) { $code = $e->getCode(); $message = CommonErrorCode::getMessage($code); - + throw new Forbidden(code: $code, message: $message); } } -} \ No newline at end of file +} diff --git a/tests/Cases/AbstractTestCase.php b/tests/Cases/AbstractTestCase.php deleted file mode 100644 index 2274c20..0000000 --- a/tests/Cases/AbstractTestCase.php +++ /dev/null @@ -1,21 +0,0 @@ -assertTrue(true); - } -} diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php new file mode 100644 index 0000000..61cd84c --- /dev/null +++ b/tests/Feature/ExampleTest.php @@ -0,0 +1,5 @@ +toBeTrue(); +}); diff --git a/tests/Pest.php b/tests/Pest.php new file mode 100644 index 0000000..bdf0a5f --- /dev/null +++ b/tests/Pest.php @@ -0,0 +1,45 @@ +in('Feature'); + +/* +|-------------------------------------------------------------------------- +| Expectations +|-------------------------------------------------------------------------- +| +| When you're writing tests, you often need to check that values meet certain conditions. The +| "expect()" function gives you access to a set of "expectations" methods that you can use +| to assert different things. Of course, you may extend the Expectation API at any time. +| +*/ + +expect()->extend('toBeOne', function () { + return $this->toBe(1); +}); + +/* +|-------------------------------------------------------------------------- +| Functions +|-------------------------------------------------------------------------- +| +| While Pest is very powerful out-of-the-box, you may have some testing code specific to your +| project that you don't want to repeat in every file. Here you can also expose helpers as +| global functions to help you to reduce the number of lines of code in your test files. +| +*/ + +/*function something() +{ + // .. +}*/ diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..cfb05b6 --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,10 @@ +toBeTrue(); +}); diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 6ce15df..5cbe900 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,12 +1,31 @@