From 5176586417bd4747303a812ec01b40d5fc1c66c3 Mon Sep 17 00:00:00 2001 From: Leo Cavalcante Date: Tue, 11 Jul 2023 21:50:59 -0300 Subject: [PATCH 01/38] Create README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..834190404 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Hyperf Metric + +🔭 Drop-in replacement for the `hyperf/metric` component. + +Suited for special needs. From 68172121c002d31af1fa29afb8982ee7b09e939a Mon Sep 17 00:00:00 2001 From: leocavalcante Date: Wed, 12 Jul 2023 20:15:12 -0300 Subject: [PATCH 02/38] chore(dev): prepar devex --- .github/workflows/close-pull-request.yml | 13 ---- .github/workflows/release.yml | 25 ------ .php-cs-fixer.php | 97 ++++++++++++++++++++++++ composer.json | 51 ++++++++++--- phpstan.neon | 11 +++ phpunit.xml | 21 +++++ src/Adapter/InfluxDB/MetricFactory.php | 2 +- src/Adapter/Prometheus/Redis.php | 4 + src/Listener/DBPoolWatcher.php | 3 - src/Listener/RedisPoolWatcher.php | 3 - tests/bootstrap.php | 4 +- tests/ci.ini | 8 -- tests/swoole.install.sh | 10 --- 13 files changed, 177 insertions(+), 75 deletions(-) delete mode 100644 .github/workflows/close-pull-request.yml delete mode 100644 .github/workflows/release.yml create mode 100644 .php-cs-fixer.php create mode 100644 phpstan.neon create mode 100644 phpunit.xml delete mode 100644 tests/ci.ini delete mode 100644 tests/swoole.install.sh diff --git a/.github/workflows/close-pull-request.yml b/.github/workflows/close-pull-request.yml deleted file mode 100644 index 591822c0f..000000000 --- a/.github/workflows/close-pull-request.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: Close Pull Request - -on: - pull_request_target: - types: [opened] - -jobs: - run: - runs-on: ubuntu-latest - steps: - - uses: superbrothers/close-pull-request@v3 - with: - comment: "Hi, this is a READ-ONLY repository, please submit your PR on the https://github.com/hyperf/hyperf repository.

This Pull Request will close automatically.

Thanks! " diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 0f7d23faa..000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,25 +0,0 @@ -on: - push: - # Sequence of patterns matched against refs/tags - tags: - - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 - -name: Release - -jobs: - release: - name: Release - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v2 - - name: Create Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ github.ref }} - release_name: Release ${{ github.ref }} - draft: false - prerelease: false diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php new file mode 100644 index 000000000..00cc143d7 --- /dev/null +++ b/.php-cs-fixer.php @@ -0,0 +1,97 @@ +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', + ], + 'global_namespace_import' => [ + 'import_classes' => true, + 'import_constants' => true, + 'import_functions' => true, + ], + '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('bin') + ->exclude('public') + ->exclude('runtime') + ->exclude('vendor') + ->in(__DIR__) + ) + ->setUsingCache(false); diff --git a/composer.json b/composer.json index 3d6170a44..420c5a028 100644 --- a/composer.json +++ b/composer.json @@ -9,19 +9,38 @@ "metrics", "influxdb" ], - "description": "hyperf metric component", + "description": "Drop-in replacement for the Hyperf Metric component.", "require": { "php": ">=8.0", - "hyperf/codec": "~3.0.0", - "hyperf/contract": "~3.0.0", - "hyperf/engine": "^1.5|^2.3", - "hyperf/guzzle": "~3.0.0", - "hyperf/support": "~3.0.0", - "hyperf/utils": "~3.0.0", - "promphp/prometheus_client_php": "2.2.*", - "psr/container": "^1.0|^2.0", + "hyperf/codec": "^3.0", + "hyperf/contract": "^3.0", + "hyperf/engine": "^2.9", + "hyperf/guzzle": "^3.0", + "hyperf/support": "^3.0", + "hyperf/utils": "^3.0", + "promphp/prometheus_client_php": "^2.7", + "psr/container": "^2.0", "psr/event-dispatcher": "^1.0", - "psr/http-message": "^1.0|^2.0" + "psr/http-message": "^2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.21", + "hyperf/async-queue": "^3.0", + "hyperf/config": "^3.0", + "hyperf/db-connection": "^3.0", + "hyperf/di": "^3.0", + "hyperf/event": "^3.0", + "hyperf/framework": "^3.0", + "hyperf/process": "^3.0", + "hyperf/redis": "^3.0", + "hyperf/testing": "^3.0", + "influxdb/influxdb-php": "^1.15", + "mockery/mockery": "^1.6", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-mockery": "^1.1", + "rector/rector": "^0.17.5", + "slickdeals/statsd": "^3.1" }, "suggest": { "slickdeals/statsd": "Required to use StatdD driver.", @@ -42,11 +61,21 @@ "HyperfTest\\Metric\\": "tests/" } }, + "scripts": { + "test": "co-phpunit", + "test-coverage": "co-phpunit --coverage-clover clover.xml", + "cs-fix": "php-cs-fixer fix $1", + "analyse": "phpstan analyse --memory-limit=-1 -l 5 -c phpstan.neon", + "rector": "rector process --clear-cache" + }, "minimum-stability": "dev", "prefer-stable": true, "config": { "optimize-autoloader": true, - "sort-packages": true + "sort-packages": true, + "allow-plugins": { + "phpstan/extension-installer": true + } }, "extra": { "branch-alias": { diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 000000000..f25d7d97c --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,11 @@ +parameters: + bootstrapFiles: + - tests/bootstrap.php + paths: + - src + - tests + inferPrivatePropertyTypeFromConstructor: true + treatPhpDocTypesAsCertain: true + reportUnmatchedIgnoredErrors: false + ignoreErrors: + - '#Variable .* in PHPDoc tag @var does not exist#' diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 000000000..bb72997b5 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,21 @@ + + + + + src + + + + + tests + + + diff --git a/src/Adapter/InfluxDB/MetricFactory.php b/src/Adapter/InfluxDB/MetricFactory.php index 3d87049e5..0a2292e47 100644 --- a/src/Adapter/InfluxDB/MetricFactory.php +++ b/src/Adapter/InfluxDB/MetricFactory.php @@ -119,7 +119,7 @@ protected function createPoint(Sample $sample): Point { return new Point( $sample->getName(), - $sample->getValue(), + (float) $sample->getValue(), $labels = array_combine($sample->getLabelNames(), $sample->getLabelValues()), [], time() diff --git a/src/Adapter/Prometheus/Redis.php b/src/Adapter/Prometheus/Redis.php index 8d19ddba2..f6c844c27 100644 --- a/src/Adapter/Prometheus/Redis.php +++ b/src/Adapter/Prometheus/Redis.php @@ -63,6 +63,10 @@ public function collect(): array ); } + public function updateSummary(array $data): void + { + } + /** * @throws RedisException */ diff --git a/src/Listener/DBPoolWatcher.php b/src/Listener/DBPoolWatcher.php index 20dd5f5fd..f96e45aa7 100644 --- a/src/Listener/DBPoolWatcher.php +++ b/src/Listener/DBPoolWatcher.php @@ -27,9 +27,6 @@ public function getPrefix() return 'mysql'; } - /** - * {@inheritdoc} - */ public function process(object $event): void { $config = $this->container->get(ConfigInterface::class); diff --git a/src/Listener/RedisPoolWatcher.php b/src/Listener/RedisPoolWatcher.php index fc4817f3c..b15bc5063 100644 --- a/src/Listener/RedisPoolWatcher.php +++ b/src/Listener/RedisPoolWatcher.php @@ -27,9 +27,6 @@ public function getPrefix() return 'redis'; } - /** - * {@inheritdoc} - */ public function process(object $event): void { $config = $this->container->get(ConfigInterface::class); diff --git a/tests/bootstrap.php b/tests/bootstrap.php index d191304d9..0fab7438e 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -9,4 +9,6 @@ * @contact group@hyperf.io * @license https://github.com/hyperf/hyperf/blob/master/LICENSE */ -require_once dirname(__DIR__) . '/vendor/autoload.php'; +define('BASE_PATH', dirname(__DIR__, 1)); + +require_once BASE_PATH . '/vendor/autoload.php'; diff --git a/tests/ci.ini b/tests/ci.ini deleted file mode 100644 index 4ee69abc2..000000000 --- a/tests/ci.ini +++ /dev/null @@ -1,8 +0,0 @@ -[opcache] -opcache.enable_cli=1 - -[redis] -extension = "redis.so" - -[swoole] -extension = "swoole.so" diff --git a/tests/swoole.install.sh b/tests/swoole.install.sh deleted file mode 100644 index 04bedf4aa..000000000 --- a/tests/swoole.install.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash -wget https://github.com/swoole/swoole-src/archive/v${SW_VERSION}.tar.gz -O swoole.tar.gz -mkdir -p swoole -tar -xf swoole.tar.gz -C swoole --strip-components=1 -rm swoole.tar.gz -cd swoole -phpize -./configure --enable-openssl --enable-mysqlnd -make -j$(nproc) -make install From 3e7eeb6758335aae2bb36d20bcdb944c7e91d067 Mon Sep 17 00:00:00 2001 From: leocavalcante Date: Wed, 12 Jul 2023 20:44:32 -0300 Subject: [PATCH 03/38] feat: bring the changes --- .gitignore | 5 +- .php-cs-fixer.php | 18 +- LICENSE | 2 +- composer.json | 3 +- composer.lock | 8004 +++++++++++++++++ publish/metric.php | 12 +- src/Adapter/InfluxDB/MetricFactory.php | 8 +- src/Adapter/NoOp/Counter.php | 8 +- src/Adapter/NoOp/Gauge.php | 8 +- src/Adapter/NoOp/Histogram.php | 8 +- src/Adapter/NoOp/MetricFactory.php | 8 +- src/Adapter/Prometheus/Constants.php | 8 +- src/Adapter/Prometheus/Counter.php | 8 +- src/Adapter/Prometheus/Gauge.php | 8 +- src/Adapter/Prometheus/Histogram.php | 8 +- src/Adapter/Prometheus/MetricFactory.php | 8 +- src/Adapter/Prometheus/Redis.php | 8 +- .../Prometheus/RedisStorageFactory.php | 8 +- src/Adapter/RemoteProxy/Counter.php | 8 +- src/Adapter/RemoteProxy/Gauge.php | 8 +- src/Adapter/RemoteProxy/Histogram.php | 8 +- src/Adapter/RemoteProxy/MetricFactory.php | 8 +- src/Adapter/StatsD/Connection.php | 33 + src/Adapter/StatsD/Counter.php | 8 +- src/Adapter/StatsD/Gauge.php | 8 +- src/Adapter/StatsD/Histogram.php | 8 +- src/Adapter/StatsD/MetricFactory.php | 10 +- src/Annotation/Counter.php | 8 +- src/Annotation/Histogram.php | 8 +- src/Aspect/CounterAnnotationAspect.php | 8 +- src/Aspect/HistogramAnnotationAspect.php | 8 +- src/Aspect/HttpClientMetricAspect.php | 84 + src/Aspect/MongoCollectionMetricAspect.php | 60 + src/Aspect/RedisMetricAspect.php | 37 + src/ConfigProvider.php | 24 +- src/Contract/CounterInterface.php | 8 +- src/Contract/GaugeInterface.php | 8 +- src/Contract/HistogramInterface.php | 8 +- src/Contract/MetricFactoryInterface.php | 8 +- src/CoroutineServerStats.php | 8 +- src/Event/MetricFactoryReady.php | 8 +- src/Exception/InvalidArgumentException.php | 8 +- src/Exception/RuntimeException.php | 8 +- src/Listener/DBPoolWatcher.php | 8 +- .../DbQueryExecutedMetricListener.php | 44 + src/Listener/OnBeforeHandle.php | 8 +- src/Listener/OnCoroutineServerStart.php | 8 +- src/Listener/OnMetricFactoryReady.php | 8 +- src/Listener/OnPipeMessage.php | 8 +- src/Listener/OnWorkerStart.php | 8 +- src/Listener/PoolWatcher.php | 8 +- src/Listener/QueueWatcher.php | 8 +- src/Listener/RedisPoolWatcher.php | 8 +- src/Metric.php | 8 +- src/MetricFactoryPicker.php | 8 +- src/MetricSetter.php | 8 +- src/Middleware/MetricMiddleware.php | 55 +- src/Process/MetricProcess.php | 8 +- src/Support/Uri.php | 30 + src/Timer.php | 8 +- .../Prometheus/RedisStorageFactoryTest.php | 8 +- tests/Adapter/Prometheus/RedisTest.php | 8 +- tests/Cases/MetricFactoryPickerTest.php | 8 +- tests/Cases/MetricFactoryTest.php | 8 +- tests/Cases/OnWorkerStartTest.php | 8 +- tests/Cases/TimerTest.php | 8 +- tests/Cases/UriTest.php | 48 + tests/bootstrap.php | 8 +- 68 files changed, 8621 insertions(+), 264 deletions(-) create mode 100644 composer.lock create mode 100644 src/Adapter/StatsD/Connection.php create mode 100644 src/Aspect/HttpClientMetricAspect.php create mode 100644 src/Aspect/MongoCollectionMetricAspect.php create mode 100644 src/Aspect/RedisMetricAspect.php create mode 100644 src/Listener/DbQueryExecutedMetricListener.php create mode 100644 src/Support/Uri.php create mode 100644 tests/Cases/UriTest.php diff --git a/.gitignore b/.gitignore index 7e11e886d..07744cbac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -/vendor/ -composer.lock *.cache -*.log \ No newline at end of file +*.log +vendor/ diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index 00cc143d7..1b4f0b774 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -1,12 +1,12 @@ true, 'standardize_not_equals' => true, 'multiline_comment_opening_closing' => true, + 'global_namespace_import' => [ + 'import_classes' => true, + 'import_constants' => true, + 'import_functions' => true, + ], ]) ->setFinder( PhpCsFixer\Finder::create() - ->exclude('bin') - ->exclude('public') - ->exclude('runtime') ->exclude('vendor') ->in(__DIR__) ) - ->setUsingCache(false); + ->setUsingCache(true); diff --git a/LICENSE b/LICENSE index c35d3f5a8..36eac0473 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) Hyperf +Copyright (c) Hyperf & OpenCodeCo Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/composer.json b/composer.json index 420c5a028..7a1c391b3 100644 --- a/composer.json +++ b/composer.json @@ -40,7 +40,8 @@ "phpstan/phpstan": "^1.10", "phpstan/phpstan-mockery": "^1.1", "rector/rector": "^0.17.5", - "slickdeals/statsd": "^3.1" + "slickdeals/statsd": "^3.1", + "swoole/ide-helper": "^5.0" }, "suggest": { "slickdeals/statsd": "Required to use StatdD driver.", diff --git a/composer.lock b/composer.lock new file mode 100644 index 000000000..8c4af4401 --- /dev/null +++ b/composer.lock @@ -0,0 +1,8004 @@ +{ + "_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": "13a64b1c6c31e0cf6a1b5a835cda811e", + "packages": [ + { + "name": "doctrine/inflector", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.8" + }, + "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%2Finflector", + "type": "tidelift" + } + ], + "time": "2023-06-16T13:40:37+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5", + "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2023-05-21T14:04:53+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/3a494dc7dc1d7d12e511890177ae2d0e6c107da6", + "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-05-21T13:50:22+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.5.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-04-17T16:11:26+00:00" + }, + { + "name": "hyperf/code-parser", + "version": "v3.0.18", + "source": { + "type": "git", + "url": "https://github.com/hyperf/code-parser.git", + "reference": "f1812421150d7ef95067eb6657c6f84514b6dfea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/code-parser/zipball/f1812421150d7ef95067eb6657c6f84514b6dfea", + "reference": "f1812421150d7ef95067eb6657c6f84514b6dfea", + "shasum": "" + }, + "require": { + "hyperf/collection": "~3.0.0", + "hyperf/stringable": "~3.0.0", + "hyperf/support": "~3.0.0", + "php": ">=8.0" + }, + "suggest": { + "jean85/pretty-package-versions": "Required to use PrettyVersions. (^1.2|^2.0)", + "nikic/php-parser": "Required to use PhpParser. (^4.0)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\CodeParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A code parser component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "code-parser", + "hyperf", + "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" + }, + "time": "2023-04-26T03:02:31+00:00" + }, + { + "name": "hyperf/codec", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/hyperf/codec.git", + "reference": "7d3cbfa06c50ef52809acadfcbcd59424366f591" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/codec/zipball/7d3cbfa06c50ef52809acadfcbcd59424366f591", + "reference": "7d3cbfa06c50ef52809acadfcbcd59424366f591", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-xml": "*", + "hyperf/contract": "~3.0.0", + "php": ">=8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Codec\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A codec component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "codec", + "hyperf", + "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" + }, + "time": "2023-04-24T09:49:41+00:00" + }, + { + "name": "hyperf/collection", + "version": "v3.0.24", + "source": { + "type": "git", + "url": "https://github.com/hyperf/collection.git", + "reference": "25be1f5643565dd19c05ee2da4156cfaa8bb71eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/collection/zipball/25be1f5643565dd19c05ee2da4156cfaa8bb71eb", + "reference": "25be1f5643565dd19c05ee2da4156cfaa8bb71eb", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.0.0", + "hyperf/macroable": "~3.0.0", + "php": ">=7.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Collection package which come from illuminate/collections", + "homepage": "https://hyperf.io", + "keywords": [ + "collection", + "hyperf", + "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" + }, + "time": "2023-06-05T11:54:56+00:00" + }, + { + "name": "hyperf/conditionable", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/conditionable.git", + "reference": "4222cdc512e9e48e4375a480161c6365276ff803" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/conditionable/zipball/4222cdc512e9e48e4375a480161c6365276ff803", + "reference": "4222cdc512e9e48e4375a480161c6365276ff803", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Conditionable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Macroable package which come from illuminate/conditionable", + "homepage": "https://hyperf.io", + "keywords": [ + "conditionable", + "hyperf", + "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" + }, + "time": "2023-03-28T15:02:39+00:00" + }, + { + "name": "hyperf/context", + "version": "v3.0.18", + "source": { + "type": "git", + "url": "https://github.com/hyperf/context.git", + "reference": "8cff8cc1c70c1a8c390a13b97986ddd5e47fa2ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/context/zipball/8cff8cc1c70c1a8c390a13b97986ddd5e47fa2ec", + "reference": "8cff8cc1c70c1a8c390a13b97986ddd5e47fa2ec", + "shasum": "" + }, + "require": { + "hyperf/engine": "^1.2|^2.0", + "php": ">=8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Context\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A coroutine/application context library.", + "homepage": "https://hyperf.io", + "keywords": [ + "Context", + "hyperf", + "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" + }, + "time": "2023-04-26T03:02:31+00:00" + }, + { + "name": "hyperf/contract", + "version": "v3.0.10", + "source": { + "type": "git", + "url": "https://github.com/hyperf/contract.git", + "reference": "93488df36b1c4e2fc16c630fb77c110bafffb141" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/contract/zipball/93488df36b1c4e2fc16c630fb77c110bafffb141", + "reference": "93488df36b1c4e2fc16c630fb77c110bafffb141", + "shasum": "" + }, + "require": { + "php": ">=8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Contract\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The contracts of Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "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" + }, + "time": "2023-03-10T04:21:37+00:00" + }, + { + "name": "hyperf/coordinator", + "version": "v3.0.22", + "source": { + "type": "git", + "url": "https://github.com/hyperf/coordinator.git", + "reference": "a49c2d22995b4115e8b21f1de58b992047c4d0fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/coordinator/zipball/a49c2d22995b4115e8b21f1de58b992047c4d0fd", + "reference": "a49c2d22995b4115e8b21f1de58b992047c4d0fd", + "shasum": "" + }, + "require": { + "hyperf/engine": "^1.2|^2.0", + "php": ">=8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Coordinator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Coordinator", + "homepage": "https://hyperf.io", + "keywords": [ + "Coordinator", + "hyperf", + "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" + }, + "time": "2023-05-26T13:44:16+00:00" + }, + { + "name": "hyperf/coroutine", + "version": "v3.0.16", + "source": { + "type": "git", + "url": "https://github.com/hyperf/coroutine.git", + "reference": "4944ce69d5f35407e5dbcf7e9991f1db3366f254" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/coroutine/zipball/4944ce69d5f35407e5dbcf7e9991f1db3366f254", + "reference": "4944ce69d5f35407e5dbcf7e9991f1db3366f254", + "shasum": "" + }, + "require": { + "hyperf/context": "~3.0.0", + "hyperf/contract": "~3.0.0", + "hyperf/engine": "^1.2|^2.0", + "php": ">=8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Coroutine\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Coroutine", + "homepage": "https://hyperf.io", + "keywords": [ + "coroutine", + "hyperf", + "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" + }, + "time": "2023-04-12T05:34:25+00:00" + }, + { + "name": "hyperf/engine", + "version": "v2.9.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/engine.git", + "reference": "3e0920ad7ba15a965f129143d3248f8e85e0c2d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/engine/zipball/3e0920ad7ba15a965f129143d3248f8e85e0c2d9", + "reference": "3e0920ad7ba15a965f129143d3248f8e85e0c2d9", + "shasum": "" + }, + "require": { + "hyperf/engine-contract": "~1.8.0", + "php": ">=8.0" + }, + "conflict": { + "ext-swoole": "<5.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "hyperf/guzzle": "^3.0", + "hyperf/http-message": " 3.0.*", + "mockery/mockery": "^1.5", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^9.4", + "swoole/ide-helper": "dev-master" + }, + "suggest": { + "ext-sockets": "*", + "ext-swoole": ">=5.0", + "hyperf/http-message": "Required to use ResponseEmitter.", + "psr/http-message": "Required to use WebSocket Frame." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.9-dev" + }, + "hyperf": { + "config": "Hyperf\\Engine\\ConfigProvider" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Engine\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Coroutine engine provided by swoole.", + "keywords": [ + "engine", + "hyperf", + "php", + "swoole" + ], + "support": { + "issues": "https://github.com/hyperf/engine/issues", + "source": "https://github.com/hyperf/engine/tree/v2.9.0" + }, + "time": "2023-06-17T11:23:50+00:00" + }, + { + "name": "hyperf/engine-contract", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/engine-contract.git", + "reference": "69b9bb43d6c356be7c7eb2f55ff06282436a0e4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/engine-contract/zipball/69b9bb43d6c356be7c7eb2f55ff06282436a0e4d", + "reference": "69b9bb43d6c356be7c7eb2f55ff06282436a0e4d", + "shasum": "" + }, + "require": { + "php": ">=8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "mockery/mockery": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": ">=7.0", + "psr/http-message": "^1.0", + "swoole/ide-helper": "^4.5" + }, + "suggest": { + "psr/http-message": "Required to use WebSocket Frame." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Engine\\Contract\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Contract for Coroutine Engine", + "keywords": [ + "contract", + "coroutine", + "engine", + "hyperf", + "php" + ], + "support": { + "issues": "https://github.com/hyperf/engine-contract/issues", + "source": "https://github.com/hyperf/engine-contract/tree/v1.8.0" + }, + "time": "2023-06-17T11:16:19+00:00" + }, + { + "name": "hyperf/guzzle", + "version": "v3.0.24", + "source": { + "type": "git", + "url": "https://github.com/hyperf/guzzle.git", + "reference": "7791900eed289bd6584e2e52d2ec02b47f85740c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/guzzle/zipball/7791900eed289bd6584e2e52d2ec02b47f85740c", + "reference": "7791900eed289bd6584e2e52d2ec02b47f85740c", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.3|^7.0", + "php": ">=8.0", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.0|^2.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "hyperf/pool": "Required to use pool handler." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "hyperf": { + "config": "Hyperf\\Guzzle\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Swoole coroutine handler for guzzle", + "keywords": [ + "Guzzle", + "handler", + "php", + "swoole" + ], + "support": { + "issues": "https://github.com/hyperf/guzzle/issues", + "source": "https://github.com/hyperf/guzzle/tree/v3.0.24" + }, + "time": "2023-06-04T02:14:26+00:00" + }, + { + "name": "hyperf/macroable", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/macroable.git", + "reference": "822de69ba0c75aa9767a9cea487b84bf31d5240a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/macroable/zipball/822de69ba0c75aa9767a9cea487b84bf31d5240a", + "reference": "822de69ba0c75aa9767a9cea487b84bf31d5240a", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Macroable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Macroable package which come from illuminate/macroable", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "macroable", + "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" + }, + "time": "2022-11-01T02:50:54+00:00" + }, + { + "name": "hyperf/serializer", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/serializer.git", + "reference": "c4efedaa072c5ffe196e95e0c74a9d90fd1e4811" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/serializer/zipball/c4efedaa072c5ffe196e95e0c74a9d90fd1e4811", + "reference": "c4efedaa072c5ffe196e95e0c74a9d90fd1e4811", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.0.0", + "php": ">=8.0" + }, + "suggest": { + "hyperf/di": "Required to use ExceptionNormalizer", + "symfony/property-access": "Required to use SymfonyNormalizer (^5.0|^6.0)", + "symfony/serializer": "Required to use SymfonyNormalizer (^5.0|^6.0)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "hyperf": { + "config": "Hyperf\\Serializer\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Serializer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A serializer component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "swoole", + "tappable" + ], + "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" + }, + "time": "2023-04-24T07:07:56+00:00" + }, + { + "name": "hyperf/stringable", + "version": "v3.0.27", + "source": { + "type": "git", + "url": "https://github.com/hyperf/stringable.git", + "reference": "cd56584d5d7a2688e1c1a401c3c41c0a8143a920" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/stringable/zipball/cd56584d5d7a2688e1c1a401c3c41c0a8143a920", + "reference": "cd56584d5d7a2688e1c1a401c3c41c0a8143a920", + "shasum": "" + }, + "require": { + "hyperf/collection": "~3.0.0", + "hyperf/conditionable": "~3.0.0", + "hyperf/macroable": "~3.0.0", + "hyperf/tappable": "~3.0.0", + "php": ">=8.0" + }, + "suggest": { + "doctrine/inflector": "Required to use plural and singular methods.(^2.0|^3.0)", + "ramsey/uuid": "Required to use uuid and orderedUuid methods.(^4.7|^5.0)", + "symfony/uid": "Required to use ulid method.(^5.0|^6.0)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Stringable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Stringable package which come from illuminate/support", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "stringable", + "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" + }, + "time": "2023-06-25T06:10:37+00:00" + }, + { + "name": "hyperf/support", + "version": "v3.0.24", + "source": { + "type": "git", + "url": "https://github.com/hyperf/support.git", + "reference": "576838e7185bf8eb749920a3285b399cb9c3a24b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/support/zipball/576838e7185bf8eb749920a3285b399cb9c3a24b", + "reference": "576838e7185bf8eb749920a3285b399cb9c3a24b", + "shasum": "" + }, + "require": { + "hyperf/collection": "~3.0.0", + "hyperf/context": "~3.0.0", + "hyperf/contract": "~3.0.0", + "hyperf/coroutine": "~3.0.0", + "hyperf/macroable": "~3.0.0", + "hyperf/stringable": "~3.0.0", + "php": ">=8.0" + }, + "suggest": { + "nesbot/carbon": "Use Carbon as DateTime object.(^2.0)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Support\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A support component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "support", + "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" + }, + "time": "2023-06-08T06:55:09+00:00" + }, + { + "name": "hyperf/tappable", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/tappable.git", + "reference": "4f90b9026a5bdce5b3e6be29a2ab7a86c54f372a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/tappable/zipball/4f90b9026a5bdce5b3e6be29a2ab7a86c54f372a", + "reference": "4f90b9026a5bdce5b3e6be29a2ab7a86c54f372a", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Tappable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Macroable package which come from illuminate/tappable", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "swoole", + "tappable" + ], + "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" + }, + "time": "2023-03-28T15:02:39+00:00" + }, + { + "name": "hyperf/utils", + "version": "v3.0.18", + "source": { + "type": "git", + "url": "https://github.com/hyperf/utils.git", + "reference": "2e59cef3dd562053fe7c9b2a41e7243b4ee23bd6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/utils/zipball/2e59cef3dd562053fe7c9b2a41e7243b4ee23bd6", + "reference": "2e59cef3dd562053fe7c9b2a41e7243b4ee23bd6", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "hyperf/code-parser": "~3.0.0", + "hyperf/codec": "~3.0.0", + "hyperf/collection": "~3.0.0", + "hyperf/context": "~3.0.0", + "hyperf/contract": "~3.0.0", + "hyperf/coordinator": "~3.0.0", + "hyperf/coroutine": "~3.0.0", + "hyperf/engine": "^1.2|^2.0", + "hyperf/macroable": "~3.0.0", + "hyperf/serializer": "~3.0.0", + "hyperf/stringable": "~3.0.0", + "hyperf/support": "~3.0.0", + "php": ">=7.2" + }, + "suggest": { + "ext-swoole": "Required to use methods related to swoole (>=4.5).", + "hyperf/di": "Required to use ExceptionNormalizer", + "nikic/php-parser": "Required to use PhpParser. (^4.0)", + "ramsey/uuid": "Required to use uuid and orderedUuid methods", + "symfony/property-access": "Required to use SymfonyNormalizer (^5.0|^6.0)", + "symfony/serializer": "Required to use SymfonyNormalizer (^5.0|^6.0)", + "symfony/uid": "Required to use ulid method", + "symfony/var-dumper": "Required to use the dd function (^5.0|^6.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Utils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A tools package that could help developer solved the problem quickly.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "swoole", + "utils" + ], + "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" + }, + "time": "2023-04-26T03:02:31+00:00" + }, + { + "name": "promphp/prometheus_client_php", + "version": "v2.7.1", + "source": { + "type": "git", + "url": "https://github.com/PromPHP/prometheus_client_php.git", + "reference": "82e42b5a491ee94127110548ee835052b9765a78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PromPHP/prometheus_client_php/zipball/82e42b5a491ee94127110548ee835052b9765a78", + "reference": "82e42b5a491ee94127110548ee835052b9765a78", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.2|^8.0" + }, + "replace": { + "endclothing/prometheus_client_php": "*", + "jimdo/prometheus_client_php": "*", + "lkaemmerling/prometheus_client_php": "*" + }, + "require-dev": { + "guzzlehttp/guzzle": "^6.3|^7.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5.4", + "phpstan/phpstan-phpunit": "^1.1.0", + "phpstan/phpstan-strict-rules": "^1.1.0", + "phpunit/phpunit": "^9.4", + "squizlabs/php_codesniffer": "^3.6", + "symfony/polyfill-apcu": "^1.6" + }, + "suggest": { + "ext-apc": "Required if using APCu.", + "ext-redis": "Required if using Redis.", + "promphp/prometheus_push_gateway_php": "An easy client for using Prometheus PushGateway.", + "symfony/polyfill-apcu": "Required if you use APCu on PHP8.0+" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Prometheus\\": "src/Prometheus/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Lukas Kämmerling", + "email": "kontakt@lukas-kaemmerling.de" + } + ], + "description": "Prometheus instrumentation library for PHP applications.", + "support": { + "issues": "https://github.com/PromPHP/prometheus_client_php/issues", + "source": "https://github.com/PromPHP/prometheus_client_php/tree/v2.7.1" + }, + "time": "2023-04-24T18:11:52+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/1.0.2" + }, + "time": "2023-04-10T20:12:12+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.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": "2023-05-23T14:45:45+00:00" + } + ], + "packages-dev": [ + { + "name": "composer/pcre", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.1.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-11-17T09:50:14+00:00" + }, + { + "name": "composer/semver", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-04-01T19:23:25+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-02-25T21:32:43+00:00" + }, + { + "name": "doctrine/annotations", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2 || ^3", + "ext-tokenizer": "*", + "php": "^7.2 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^5.4 || ^6", + "vimeo/psalm": "^4.10" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/2.0.1" + }, + "time": "2023-02-02T22:02:53+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.30 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:15:36+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "84a527db05647743d50373e0ec53a152f2cde568" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-12-15T16:57:16+00:00" + }, + { + "name": "fig/http-message-util", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message-util.git", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0 || ^8.0" + }, + "suggest": { + "psr/http-message": "The package containing the PSR-7 interfaces" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Fig\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Utility classes and constants for use with PSR-7 (psr/http-message)", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-message-util/issues", + "source": "https://github.com/php-fig/http-message-util/tree/1.1.5" + }, + "time": "2020-11-24T22:02:12+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.21.1", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "229b55b3eae4729a8e2a321441ba40fcb3720b86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/229b55b3eae4729a8e2a321441ba40fcb3720b86", + "reference": "229b55b3eae4729a8e2a321441ba40fcb3720b86", + "shasum": "" + }, + "require": { + "composer/semver": "^3.3", + "composer/xdebug-handler": "^3.0.3", + "doctrine/annotations": "^2", + "doctrine/lexer": "^2 || ^3", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^8.0.1", + "sebastian/diff": "^4.0 || ^5.0", + "symfony/console": "^5.4 || ^6.0", + "symfony/event-dispatcher": "^5.4 || ^6.0", + "symfony/filesystem": "^5.4 || ^6.0", + "symfony/finder": "^5.4 || ^6.0", + "symfony/options-resolver": "^5.4 || ^6.0", + "symfony/polyfill-mbstring": "^1.27", + "symfony/polyfill-php80": "^1.27", + "symfony/polyfill-php81": "^1.27", + "symfony/process": "^5.4 || ^6.0", + "symfony/stopwatch": "^5.4 || ^6.0" + }, + "require-dev": { + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^2.0", + "mikey179/vfsstream": "^1.6.11", + "php-coveralls/php-coveralls": "^2.5.3", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", + "phpspec/prophecy": "^1.16", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "phpunitgoodpractices/polyfill": "^1.6", + "phpunitgoodpractices/traits": "^1.9.2", + "symfony/phpunit-bridge": "^6.2.3", + "symfony/yaml": "^5.4 || ^6.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.21.1" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2023-07-05T21:50:25+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-02-25T20:23:15+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "hyperf/async-queue", + "version": "v3.0.18", + "source": { + "type": "git", + "url": "https://github.com/hyperf/async-queue.git", + "reference": "7e7b558492a80ac29baeffe1942709a062d087aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/async-queue/zipball/7e7b558492a80ac29baeffe1942709a062d087aa", + "reference": "7e7b558492a80ac29baeffe1942709a062d087aa", + "shasum": "" + }, + "require": { + "hyperf/codec": "~3.0.0", + "hyperf/collection": "~3.0.0", + "hyperf/command": "~3.0.0", + "hyperf/contract": "~3.0.0", + "hyperf/support": "~3.0.0", + "hyperf/utils": "~3.0.0", + "php": ">=8.0", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1.0" + }, + "suggest": { + "hyperf/di": "Required to use annotations.", + "hyperf/event": "Required to dispatch a event.", + "hyperf/logger": "Required to use QueueHandleListener.", + "hyperf/process": "Auto register the consumer process for server." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "hyperf": { + "config": "Hyperf\\AsyncQueue\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\AsyncQueue\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A async queue component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "async-queue", + "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" + }, + "time": "2023-04-26T03:02:31+00:00" + }, + { + "name": "hyperf/command", + "version": "v3.0.27", + "source": { + "type": "git", + "url": "https://github.com/hyperf/command.git", + "reference": "06df0f8102ec4079591d937adaca507fe5191082" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/command/zipball/06df0f8102ec4079591d937adaca507fe5191082", + "reference": "06df0f8102ec4079591d937adaca507fe5191082", + "shasum": "" + }, + "require": { + "hyperf/support": "~3.0.0", + "hyperf/tappable": "~3.0.0", + "hyperf/utils": "~3.0.0", + "php": ">=8.0", + "psr/event-dispatcher": "^1.0", + "symfony/console": "^5.0|^6.0" + }, + "suggest": { + "hyperf/di": "Required to use annotations." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "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.0.27" + }, + "time": "2023-06-26T23:53:52+00:00" + }, + { + "name": "hyperf/config", + "version": "v3.0.20", + "source": { + "type": "git", + "url": "https://github.com/hyperf/config.git", + "reference": "6503882f8547809d609b9489170037ceaef04962" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/config/zipball/6503882f8547809d609b9489170037ceaef04962", + "reference": "6503882f8547809d609b9489170037ceaef04962", + "shasum": "" + }, + "require": { + "hyperf/collection": "~3.0.0", + "hyperf/contract": "~3.0.0", + "hyperf/support": "~3.0.0", + "hyperf/utils": "~3.0.0", + "php": ">=8.0", + "psr/container": "^1.0|^2.0", + "symfony/finder": "^5.0|^6.0" + }, + "suggest": { + "hyperf/di": "Allows using @Value annotation", + "hyperf/event": "Allows using @Value annotation", + "hyperf/framework": "Allows using @Value annotation", + "vlucas/phpdotenv": "Allows using enviroment value to override the config" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "hyperf": { + "config": "Hyperf\\Config\\ConfigProvider" + } + }, + "autoload": { + "files": [ + "./src/Functions.php" + ], + "psr-4": { + "Hyperf\\Config\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "An independent component that provides configuration container.", + "homepage": "https://hyperf.io", + "keywords": [ + "config", + "configuration", + "hyperf", + "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" + }, + "time": "2023-05-09T03:02:12+00:00" + }, + { + "name": "hyperf/database", + "version": "v3.0.27", + "source": { + "type": "git", + "url": "https://github.com/hyperf/database.git", + "reference": "a966a0d211df5a7c7eff62cbc83c9acb87d4cb71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/database/zipball/a966a0d211df5a7c7eff62cbc83c9acb87d4cb71", + "reference": "a966a0d211df5a7c7eff62cbc83c9acb87d4cb71", + "shasum": "" + }, + "require": { + "hyperf/code-parser": "~3.0.0", + "hyperf/collection": "~3.0.0", + "hyperf/macroable": "~3.0.0", + "hyperf/support": "~3.0.24", + "hyperf/tappable": "~3.0.0", + "hyperf/utils": "~3.0.0", + "nesbot/carbon": "^2.0", + "php": ">=8.0", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1.0" + }, + "suggest": { + "doctrine/dbal": "Required to rename columns (^3.0).", + "nikic/php-parser": "Required to use ModelCommand. (^4.0)", + "php-di/phpdoc-reader": "Required to use ModelCommand. (^2.2)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Database\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A flexible database library.", + "homepage": "https://hyperf.io", + "keywords": [ + "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" + }, + "time": "2023-06-30T01:20:59+00:00" + }, + { + "name": "hyperf/db-connection", + "version": "v3.0.24", + "source": { + "type": "git", + "url": "https://github.com/hyperf/db-connection.git", + "reference": "609325db39debbfb8df24e16e1bad299a0d12d55" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/db-connection/zipball/609325db39debbfb8df24e16e1bad299a0d12d55", + "reference": "609325db39debbfb8df24e16e1bad299a0d12d55", + "shasum": "" + }, + "require": { + "hyperf/database": "~3.0.0", + "hyperf/di": "~3.0.0", + "hyperf/framework": "~3.0.0", + "hyperf/model-listener": "~3.0.0", + "hyperf/pool": "~3.0.0", + "hyperf/support": "~3.0.0", + "hyperf/utils": "~3.0.0", + "php": ">=8.0", + "psr/container": "^1.0|^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-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" + }, + "time": "2023-06-07T02:28:52+00:00" + }, + { + "name": "hyperf/di", + "version": "v3.0.24", + "source": { + "type": "git", + "url": "https://github.com/hyperf/di.git", + "reference": "4fa46897ffe0e1f2d1260a65a1e25dadaacbdcd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/di/zipball/4fa46897ffe0e1f2d1260a65a1e25dadaacbdcd2", + "reference": "4fa46897ffe0e1f2d1260a65a1e25dadaacbdcd2", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0", + "hyperf/code-parser": "~3.0.0", + "hyperf/pipeline": "~3.0.0", + "hyperf/support": "~3.0.0", + "nikic/php-parser": "^4.1", + "php": ">=8.0", + "php-di/phpdoc-reader": "^2.2", + "psr/container": "^1.0|^2.0", + "symfony/finder": "^5.0|^6.0", + "vlucas/phpdotenv": "^5.0" + }, + "suggest": { + "ext-pcntl": "Required to scan annotations.", + "hyperf/config": "Require this component for annotation scan progress to retrieve the scan path." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "hyperf": { + "config": "Hyperf\\Di\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Di\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A DI for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "annotation", + "di", + "hyperf", + "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" + }, + "time": "2023-06-05T07:53:17+00:00" + }, + { + "name": "hyperf/dispatcher", + "version": "v3.0.24", + "source": { + "type": "git", + "url": "https://github.com/hyperf/dispatcher.git", + "reference": "af232ac01c3dcb91ad565d6202e3e3bfb2fcf560" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/dispatcher/zipball/af232ac01c3dcb91ad565d6202e3e3bfb2fcf560", + "reference": "af232ac01c3dcb91ad565d6202e3e3bfb2fcf560", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.0.0", + "php": ">=8.0", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-middleware": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "hyperf": { + "config": "Hyperf\\Dispatcher\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Dispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A HTTP Server for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "dispatcher", + "filter", + "hyperf", + "middleware", + "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" + }, + "time": "2023-06-04T02:14:26+00:00" + }, + { + "name": "hyperf/event", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/event.git", + "reference": "e10cd5e8b7f02bad9c542c3592b495debba9a39a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/event/zipball/e10cd5e8b7f02bad9c542c3592b495debba9a39a", + "reference": "e10cd5e8b7f02bad9c542c3592b495debba9a39a", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.0.0", + "php": ">=8.0", + "psr/event-dispatcher": "^1.0" + }, + "suggest": { + "hyperf/di": "Required to use annotatioins." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "hyperf": { + "config": "Hyperf\\Event\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "an event manager that implements PSR-14.", + "homepage": "https://hyperf.io", + "keywords": [ + "event", + "hyperf", + "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" + }, + "time": "2022-10-13T02:40:13+00:00" + }, + { + "name": "hyperf/exception-handler", + "version": "v3.0.24", + "source": { + "type": "git", + "url": "https://github.com/hyperf/exception-handler.git", + "reference": "bcadcd90f2d4f71e8e85f769256afdd4ea712ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/exception-handler/zipball/bcadcd90f2d4f71e8e85f769256afdd4ea712ad3", + "reference": "bcadcd90f2d4f71e8e85f769256afdd4ea712ad3", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.0.0", + "hyperf/dispatcher": "~3.0.0", + "hyperf/support": "~3.0.0", + "hyperf/utils": "~3.0.0", + "php": ">=8.0", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.0|^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "hyperf": { + "config": "Hyperf\\ExceptionHandler\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\ExceptionHandler\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Exception handler for hyperf", + "homepage": "https://hyperf.io", + "keywords": [ + "exception-handler", + "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" + }, + "time": "2023-06-04T02:14:26+00:00" + }, + { + "name": "hyperf/framework", + "version": "v3.0.23", + "source": { + "type": "git", + "url": "https://github.com/hyperf/framework.git", + "reference": "38e0fdfd097e73efbe7391795a695cea874d4ca6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/framework/zipball/38e0fdfd097e73efbe7391795a695cea874d4ca6", + "reference": "38e0fdfd097e73efbe7391795a695cea874d4ca6", + "shasum": "" + }, + "require": { + "fig/http-message-util": "^1.1.2", + "hyperf/contract": "~3.0.0", + "hyperf/support": "~3.0.0", + "hyperf/utils": "~3.0.0", + "php": ">=8.0", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1.0", + "psr/log": "^1.0|^2.0|^3.0" + }, + "suggest": { + "ext-swoole": "Required to use swoole engine.", + "hyperf/command": "Required to use Command annotation.", + "hyperf/di": "Required to use Command annotation.", + "hyperf/dispatcher": "Required to use BootApplication event.", + "symfony/event-dispatcher": "Required to use symfony event dispatcher (^5.0|^6.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "hyperf": { + "config": "Hyperf\\Framework\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Framework\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A coroutine framework that focuses on hyperspeed and flexible, specifically use for build microservices and middlewares.", + "homepage": "https://hyperf.io", + "keywords": [ + "Microservice", + "framework", + "hyperf", + "middleware", + "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" + }, + "time": "2023-05-30T01:25:37+00:00" + }, + { + "name": "hyperf/http-message", + "version": "v3.0.18", + "source": { + "type": "git", + "url": "https://github.com/hyperf/http-message.git", + "reference": "23affffb7a15842f990144b5bd49641e4de8dda4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/http-message/zipball/23affffb7a15842f990144b5bd49641e4de8dda4", + "reference": "23affffb7a15842f990144b5bd49641e4de8dda4", + "shasum": "" + }, + "require": { + "hyperf/codec": "~3.0.0", + "hyperf/engine": "^1.9|^2.7", + "hyperf/support": "~3.0.0", + "hyperf/utils": "~3.0.0", + "laminas/laminas-mime": "^2.7", + "php": ">=8.0", + "psr/http-message": "^1.0|^2.0" + }, + "suggest": { + "psr/container": "Required to replace RequestParserInterface." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "hyperf": { + "config": "Hyperf\\HttpMessage\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\HttpMessage\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "microservice framework base on swoole", + "keywords": [ + "http-message", + "hyperf", + "php", + "swoole" + ], + "support": { + "issues": "https://github.com/hyperf/http-message/issues", + "source": "https://github.com/hyperf/http-message/tree/v3.0.18" + }, + "time": "2023-04-26T03:02:31+00:00" + }, + { + "name": "hyperf/http-server", + "version": "v3.0.24", + "source": { + "type": "git", + "url": "https://github.com/hyperf/http-server.git", + "reference": "d8a3256a6b32879b6d7bfd308cc1dca9d8d27de1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/http-server/zipball/d8a3256a6b32879b6d7bfd308cc1dca9d8d27de1", + "reference": "d8a3256a6b32879b6d7bfd308cc1dca9d8d27de1", + "shasum": "" + }, + "require": { + "hyperf/codec": "~3.0.0", + "hyperf/collection": "~3.0.0", + "hyperf/contract": "~3.0.0", + "hyperf/coroutine": "~3.0.0", + "hyperf/dispatcher": "~3.0.0", + "hyperf/event": "~3.0.0", + "hyperf/exception-handler": "~3.0.0", + "hyperf/http-message": "~3.0.0", + "hyperf/macroable": "~3.0.0", + "hyperf/serializer": "~3.0.0", + "hyperf/server": "~3.0.0", + "hyperf/support": "~3.0.0", + "hyperf/utils": "~3.0.0", + "nikic/fast-route": "^1.3", + "php": ">=8.0", + "psr/container": "^1.0|^2.0" + }, + "suggest": { + "hyperf/di": "Required to use annotations." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "hyperf": { + "config": "Hyperf\\HttpServer\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\HttpServer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A HTTP Server for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "http", + "http-server", + "hyperf", + "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" + }, + "time": "2023-06-06T12:33:49+00:00" + }, + { + "name": "hyperf/model-listener", + "version": "v3.0.18", + "source": { + "type": "git", + "url": "https://github.com/hyperf/model-listener.git", + "reference": "2167252ea7bdc8626cfd3d44f0f4709502c10432" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/model-listener/zipball/2167252ea7bdc8626cfd3d44f0f4709502c10432", + "reference": "2167252ea7bdc8626cfd3d44f0f4709502c10432", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.0.0", + "hyperf/database": "~3.0.0", + "hyperf/di": "~3.0.0", + "hyperf/event": "~3.0.0", + "hyperf/support": "~3.0.0", + "hyperf/utils": "~3.0.0", + "php": ">=8.0", + "psr/container": "^1.0|^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-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" + }, + "time": "2023-04-26T03:02:31+00:00" + }, + { + "name": "hyperf/pipeline", + "version": "v3.0.16", + "source": { + "type": "git", + "url": "https://github.com/hyperf/pipeline.git", + "reference": "a3f48561f5cfef5f697e7005446e16560024a443" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/pipeline/zipball/a3f48561f5cfef5f697e7005446e16560024a443", + "reference": "a3f48561f5cfef5f697e7005446e16560024a443", + "shasum": "" + }, + "require": { + "php": ">=8.0", + "psr/container": "^1.0|^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Pipeline\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Macroable package which come from illuminate/pipeline", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "pipeline", + "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" + }, + "time": "2023-04-11T07:57:32+00:00" + }, + { + "name": "hyperf/pool", + "version": "v3.0.18", + "source": { + "type": "git", + "url": "https://github.com/hyperf/pool.git", + "reference": "44c87d46a1619554deed3879e8db675654ffd051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/pool/zipball/44c87d46a1619554deed3879e8db675654ffd051", + "reference": "44c87d46a1619554deed3879e8db675654ffd051", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.0.0", + "hyperf/support": "~3.0.0", + "hyperf/utils": "~3.0.0", + "php": ">=8.0", + "psr/container": "^1.0|^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "hyperf": { + "config": "Hyperf\\Pool\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Pool\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "An independent universal connection pool component.", + "homepage": "https://hyperf.io", + "keywords": [ + "connection-pool", + "hyperf", + "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" + }, + "time": "2023-04-26T03:02:31+00:00" + }, + { + "name": "hyperf/process", + "version": "v3.0.22", + "source": { + "type": "git", + "url": "https://github.com/hyperf/process.git", + "reference": "e804c32bf7497bedcdee28994257aeaf71a1fde7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/process/zipball/e804c32bf7497bedcdee28994257aeaf71a1fde7", + "reference": "e804c32bf7497bedcdee28994257aeaf71a1fde7", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.0.0", + "hyperf/support": "~3.0.0", + "hyperf/utils": "~3.0.0", + "php": ">=8.0", + "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.0-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" + }, + "time": "2023-05-27T06:08:52+00:00" + }, + { + "name": "hyperf/redis", + "version": "v3.0.21", + "source": { + "type": "git", + "url": "https://github.com/hyperf/redis.git", + "reference": "65ec6cbecb64793670ef1a512bd15369b683c746" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/redis/zipball/65ec6cbecb64793670ef1a512bd15369b683c746", + "reference": "65ec6cbecb64793670ef1a512bd15369b683c746", + "shasum": "" + }, + "require": { + "ext-redis": "*", + "hyperf/contract": "~3.0.0", + "hyperf/pool": "~3.0.0", + "hyperf/support": "~3.0.0", + "hyperf/tappable": "~3.0.0", + "hyperf/utils": "~3.0.0", + "php": ">=8.0", + "psr/container": "^1.0|^2.0" + }, + "suggest": { + "ext-redis": "Required to use sentinel mode (>=5.2).", + "hyperf/di": "Create the RedisPool via dependency injection." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "hyperf": { + "config": "Hyperf\\Redis\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Redis\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A redis component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "pool", + "redis" + ], + "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" + }, + "time": "2023-05-15T04:08:45+00:00" + }, + { + "name": "hyperf/server", + "version": "v3.0.24", + "source": { + "type": "git", + "url": "https://github.com/hyperf/server.git", + "reference": "0a2bfa37355631a0f0484bfd08d815ad858d279c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/server/zipball/0a2bfa37355631a0f0484bfd08d815ad858d279c", + "reference": "0a2bfa37355631a0f0484bfd08d815ad858d279c", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.0.0", + "hyperf/engine": "^1.10|^2.8", + "hyperf/support": "~3.0.0", + "hyperf/tappable": "~3.0.0", + "hyperf/utils": "~3.0.0", + "php": ">=8.0", + "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" + }, + "suggest": { + "hyperf/event": "Dump the info after server start.", + "hyperf/framework": "Dump the info after server start." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + }, + "hyperf": { + "config": "Hyperf\\Server\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A base server library for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "server", + "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" + }, + "time": "2023-06-07T05:27:29+00:00" + }, + { + "name": "hyperf/testing", + "version": "v3.0.23", + "source": { + "type": "git", + "url": "https://github.com/hyperf/testing.git", + "reference": "e660ba6f6f4c1dd46cc6203feeefd4638454108c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/testing/zipball/e660ba6f6f4c1dd46cc6203feeefd4638454108c", + "reference": "e660ba6f6f4c1dd46cc6203feeefd4638454108c", + "shasum": "" + }, + "require": { + "hyperf/codec": "~3.0.0", + "hyperf/collection": "~3.0.0", + "hyperf/contract": "~3.0.0", + "hyperf/coroutine": "~3.0.0", + "hyperf/http-message": "~3.0.0", + "hyperf/http-server": "~3.0.0", + "hyperf/support": "~3.0.0", + "hyperf/utils": "~3.0.0", + "php": ">=8.0", + "phpunit/phpunit": "^9.5", + "psr/container": "^1.0|^2.0", + "symfony/http-foundation": "^5.4|^6.0" + }, + "bin": [ + "co-phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Testing\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Testing for hyperf", + "keywords": [ + "php", + "swoole", + "testing" + ], + "support": { + "source": "https://github.com/hyperf/testing/tree/v3.0.23" + }, + "time": "2023-06-01T08:26:57+00:00" + }, + { + "name": "influxdb/influxdb-php", + "version": "1.15.2", + "source": { + "type": "git", + "url": "https://github.com/influxdata/influxdb-php.git", + "reference": "d6e59f4f04ab9107574fda69c2cbe36671253d03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/influxdata/influxdb-php/zipball/d6e59f4f04ab9107574fda69c2cbe36671253d03", + "reference": "d6e59f4f04ab9107574fda69c2cbe36671253d03", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0|^7.0", + "php": "^5.5 || ^7.0 || ^8.0" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": "^0.2.1", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "ext-curl": "Curl extension, needed for Curl driver", + "stefanotorresi/influxdb-php-async": "An asyncronous client for InfluxDB, implemented via ReactPHP." + }, + "type": "library", + "autoload": { + "psr-4": { + "InfluxDB\\": "src/InfluxDB" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stephen Hoogendijk", + "email": "stephen@tca0.nl" + }, + { + "name": "Daniel Martinez", + "email": "danimartcas@hotmail.com" + }, + { + "name": "Gianluca Arbezzano", + "email": "gianarb92@gmail.com" + } + ], + "description": "InfluxDB client library for PHP", + "keywords": [ + "client", + "influxdata", + "influxdb", + "influxdb class", + "influxdb client", + "influxdb library", + "time series" + ], + "support": { + "issues": "https://github.com/influxdata/influxdb-php/issues", + "source": "https://github.com/influxdata/influxdb-php/tree/1.15.2" + }, + "abandoned": true, + "time": "2020-12-26T17:45:17+00:00" + }, + { + "name": "laminas/laminas-mime", + "version": "2.11.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-mime.git", + "reference": "60ec04b755821c79c1987ce291b44e69f2c0831f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-mime/zipball/60ec04b755821c79c1987ce291b44e69f2c0831f", + "reference": "60ec04b755821c79c1987ce291b44e69f2c0831f", + "shasum": "" + }, + "require": { + "laminas/laminas-stdlib": "^2.7 || ^3.0", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0" + }, + "conflict": { + "zendframework/zend-mime": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.4.0", + "laminas/laminas-mail": "^2.19.0", + "phpunit/phpunit": "~9.5.25" + }, + "suggest": { + "laminas/laminas-mail": "Laminas\\Mail component" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Mime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Create and parse MIME messages and parts", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "mime" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-mime/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-mime/issues", + "rss": "https://github.com/laminas/laminas-mime/releases.atom", + "source": "https://github.com/laminas/laminas-mime" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2022-10-18T08:38:15+00:00" + }, + { + "name": "laminas/laminas-stdlib", + "version": "3.17.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-stdlib.git", + "reference": "dd35c868075bad80b6718959740913e178eb4274" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/dd35c868075bad80b6718959740913e178eb4274", + "reference": "dd35c868075bad80b6718959740913e178eb4274", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0" + }, + "conflict": { + "zendframework/zend-stdlib": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^2.5", + "phpbench/phpbench": "^1.2.9", + "phpunit/phpunit": "^10.0.16", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "SPL extensions, array utilities, error handlers, and more", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "stdlib" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-stdlib/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-stdlib/issues", + "rss": "https://github.com/laminas/laminas-stdlib/releases.atom", + "source": "https://github.com/laminas/laminas-stdlib" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2023-03-20T13:51:37+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.2", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "13a7fa2642c76c58fa2806ef7f565344c817a191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/13a7fa2642c76c58fa2806ef7f565344c817a191", + "reference": "13a7fa2642c76c58fa2806ef7f565344c817a191", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.3", + "psalm/plugin-phpunit": "^0.18", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.6.x-dev" + } + }, + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "issues": "https://github.com/mockery/mockery/issues", + "source": "https://github.com/mockery/mockery/tree/1.6.2" + }, + "time": "2023-06-07T09:07:52+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.68.1", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "4f991ed2a403c85efbc4f23eb4030063fdbe01da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4f991ed2a403c85efbc4f23eb4030063fdbe01da", + "reference": "4f991ed2a403c85efbc4f23eb4030063fdbe01da", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2023-06-20T18:29:04+00:00" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "FastRoute\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "support": { + "issues": "https://github.com/nikic/FastRoute/issues", + "source": "https://github.com/nikic/FastRoute/tree/master" + }, + "time": "2018-02-13T20:26:39+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.16.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "19526a33fb561ef417e822e85f08a00db4059c17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17", + "reference": "19526a33fb561ef417e822e85f08a00db4059c17", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0" + }, + "time": "2023-06-25T14:52:30+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "php-di/phpdoc-reader", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/PhpDocReader.git", + "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/66daff34cbd2627740ffec9469ffbac9f8c8185c", + "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpDocReader\\": "src/PhpDocReader" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)", + "keywords": [ + "phpdoc", + "reflection" + ], + "support": { + "issues": "https://github.com/PHP-DI/PhpDocReader/issues", + "source": "https://github.com/PHP-DI/PhpDocReader/tree/2.2.1" + }, + "time": "2020-10-12T12:39:22+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2023-02-25T19:38:58+00:00" + }, + { + "name": "phpstan/extension-installer", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "f45734bfb9984c6c56c4486b71230355f066a58a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/f45734bfb9984c6c56c4486b71230355f066a58a", + "reference": "f45734bfb9984c6c56c4486b71230355f066a58a", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.9.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", + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.3.1" + }, + "time": "2023-05-24T08:59:17+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.10.25", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "578f4e70d117f9a90699324c555922800ac38d8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/578f4e70d117f9a90699324c555922800ac38d8c", + "reference": "578f4e70d117f9a90699324c555922800ac38d8c", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2023-07-06T12:11:37+00:00" + }, + { + "name": "phpstan/phpstan-mockery", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-mockery.git", + "reference": "6aa86bd8e9c9a1be97baf0558d4a2ed1374736a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-mockery/zipball/6aa86bd8e9c9a1be97baf0558d4a2ed1374736a6", + "reference": "6aa86bd8e9c9a1be97baf0558d4a2ed1374736a6", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.10" + }, + "require-dev": { + "mockery/mockery": "^1.2.4", + "nikic/php-parser": "^4.13.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan Mockery extension", + "support": { + "issues": "https://github.com/phpstan/phpstan-mockery/issues", + "source": "https://github.com/phpstan/phpstan-mockery/tree/1.1.1" + }, + "time": "2023-02-18T13:54:03+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.26", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.15", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-03-06T12:58:08+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.6.10", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "a6d351645c3fe5a30f5e86be6577d946af65a328" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a6d351645c3fe5a30f5e86be6577d946af65a328", + "reference": "a6d351645c3fe5a30f5e86be6577d946af65a328", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.5", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.2", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.10" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2023-07-10T04:04:23+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "rector/rector", + "version": "0.17.5", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "f4a5f45c420b797d8e8e9c540e14c8bbdddff62d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/f4a5f45c420b797d8e8e9c540e14c8bbdddff62d", + "reference": "f4a5f45c420b797d8e8e9c540e14c8bbdddff62d", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.10.20" + }, + "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.17.5" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2023-07-12T08:42:12+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-05-07T05:35:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T06:03:37+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-02-14T08:28:10+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "slickdeals/statsd", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/Slickdeals/statsd-php.git", + "reference": "03fc5d8d51aff9f651f97101033aad31c08d00de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Slickdeals/statsd-php/zipball/03fc5d8d51aff9f651f97101033aad31c08d00de", + "reference": "03fc5d8d51aff9f651f97101033aad31c08d00de", + "shasum": "" + }, + "require": { + "php": ">= 7.3 || ^8" + }, + "replace": { + "domnikl/statsd": "<=3.0.2" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "phpunit/phpunit": "^9", + "vimeo/psalm": "^4.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Domnikl\\Statsd\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dominik Liebler", + "email": "liebler.dominik@gmail.com" + } + ], + "description": "a PHP client for statsd", + "homepage": "https://github.com/Slickdeals/statsd-php", + "keywords": [ + "Metrics", + "monitoring", + "statistics", + "statsd", + "udp" + ], + "support": { + "issues": "https://github.com/Slickdeals/statsd-php/issues", + "source": "https://github.com/Slickdeals/statsd-php/tree/3.1.2" + }, + "time": "2022-08-15T16:22:48+00:00" + }, + { + "name": "swoole/ide-helper", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/swoole/ide-helper.git", + "reference": "4b6e615cb27c251b6248b8bd9501edbd02a45c18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swoole/ide-helper/zipball/4b6e615cb27c251b6248b8bd9501edbd02a45c18", + "reference": "4b6e615cb27c251b6248b8bd9501edbd02a45c18", + "shasum": "" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Team Swoole", + "email": "team@swoole.com" + } + ], + "description": "IDE help files for Swoole.", + "support": { + "issues": "https://github.com/swoole/ide-helper/issues", + "source": "https://github.com/swoole/ide-helper/tree/5.0.3" + }, + "time": "2023-04-28T22:20:18+00:00" + }, + { + "name": "symfony/console", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7", + "reference": "8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.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": "2023-05-29T12:49:39+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa", + "reference": "3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.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": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.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/v6.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": "2023-04-21T14:41:17+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "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\\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.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": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.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": "2023-06-01T08:30:39+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/d9b01ba073c44cef617c7907ce2419f8d00d75e2", + "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.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/v6.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": "2023-04-02T01:25:41+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "e0ad0d153e1c20069250986cd9e9dd1ccebb0d66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e0ad0d153e1c20069250986cd9e9dd1ccebb0d66", + "reference": "e0ad0d153e1c20069250986cd9e9dd1ccebb0d66", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.2" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3.0", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^5.4|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "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": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.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": "2023-06-24T11:51:27+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", + "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v6.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": "2023-05-12T14:21:09+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "508c652ba3ccf69f8c97f251534f229791b52a57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/508c652ba3ccf69f8c97f251534f229791b52a57", + "reference": "508c652ba3ccf69f8c97f251534f229791b52a57", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + } + }, + "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.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/process", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "8741e3ed7fe2e91ec099e02446fb86667a0f1628" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/8741e3ed7fe2e91ec099e02446fb86667a0f1628", + "reference": "8741e3ed7fe2e91ec099e02446fb86667a0f1628", + "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.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": "2023-05-19T08:06:44+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "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\\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.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": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v6.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": "2023-02-16T10:14:28+00:00" + }, + { + "name": "symfony/string", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "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/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.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": "2023-03-21T21:06:29+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "f72b2cba8f79dd9d536f534f76874b58ad37876f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/f72b2cba8f79dd9d536f534f76874b58ad37876f", + "reference": "f72b2cba8f79dd9d536f534f76874b58ad37876f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.13", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "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 to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.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": "2023-05-19T12:46:45+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/02c24deb352fb0d79db5486c0c79905a85e37e86", + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "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\\Translation\\": "" + }, + "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 translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.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": "2023-05-30T17:17:10+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.5.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.5-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2022-10-16T01:01:54+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=8.0" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/publish/metric.php b/publish/metric.php index 34d293f83..619a861d6 100644 --- a/publish/metric.php +++ b/publish/metric.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ use Hyperf\Metric\Adapter\Prometheus\Constants; @@ -16,7 +16,7 @@ return [ // To disable hyperf/metric temporarily, set default driver to noop. 'default' => env('METRIC_DRIVER', 'prometheus'), - 'use_standalone_process' => env('METRIC_USE_STANDALONE_PROCESS', true), + 'use_standalone_process' => env('METRIC_USE_STANDALONE_PROCESS', false), 'enable_default_metric' => env('METRIC_ENABLE_DEFAULT_METRIC', true), 'default_metric_interval' => env('DEFAULT_METRIC_INTERVAL', 5), 'metric' => [ @@ -40,7 +40,7 @@ 'udp_host' => env('STATSD_UDP_HOST', '127.0.0.1'), 'udp_port' => env('STATSD_UDP_PORT', '8125'), 'timeout' => env('STATSD_CONNECTION_TIMEOUT', null), - 'persistent' => env('STATSD_CONNECTION_PERSISTENT', true), + 'persistent' => env('STATSD_CONNECTION_PERSISTENT', false), 'enable_batch' => env('STATSD_ENABLE_BATCH', true), 'push_interval' => env('STATSD_PUSH_INTERVAL', 5), 'sample_rate' => env('STATSD_SAMPLE_RATE', 1.0), diff --git a/src/Adapter/InfluxDB/MetricFactory.php b/src/Adapter/InfluxDB/MetricFactory.php index 0a2292e47..43c183207 100644 --- a/src/Adapter/InfluxDB/MetricFactory.php +++ b/src/Adapter/InfluxDB/MetricFactory.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\InfluxDB; diff --git a/src/Adapter/NoOp/Counter.php b/src/Adapter/NoOp/Counter.php index 1d4b718b0..ad515726b 100644 --- a/src/Adapter/NoOp/Counter.php +++ b/src/Adapter/NoOp/Counter.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\NoOp; diff --git a/src/Adapter/NoOp/Gauge.php b/src/Adapter/NoOp/Gauge.php index 2eae0be00..461391bec 100644 --- a/src/Adapter/NoOp/Gauge.php +++ b/src/Adapter/NoOp/Gauge.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\NoOp; diff --git a/src/Adapter/NoOp/Histogram.php b/src/Adapter/NoOp/Histogram.php index ac0c3cb6b..308b50ff1 100644 --- a/src/Adapter/NoOp/Histogram.php +++ b/src/Adapter/NoOp/Histogram.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\NoOp; diff --git a/src/Adapter/NoOp/MetricFactory.php b/src/Adapter/NoOp/MetricFactory.php index eec76fe10..5a3f1a50d 100644 --- a/src/Adapter/NoOp/MetricFactory.php +++ b/src/Adapter/NoOp/MetricFactory.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\NoOp; diff --git a/src/Adapter/Prometheus/Constants.php b/src/Adapter/Prometheus/Constants.php index 72eb4c464..ea7aa10e9 100644 --- a/src/Adapter/Prometheus/Constants.php +++ b/src/Adapter/Prometheus/Constants.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\Prometheus; diff --git a/src/Adapter/Prometheus/Counter.php b/src/Adapter/Prometheus/Counter.php index ebe539d41..8dca337e3 100644 --- a/src/Adapter/Prometheus/Counter.php +++ b/src/Adapter/Prometheus/Counter.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\Prometheus; diff --git a/src/Adapter/Prometheus/Gauge.php b/src/Adapter/Prometheus/Gauge.php index 60846aeaf..766c27f3b 100644 --- a/src/Adapter/Prometheus/Gauge.php +++ b/src/Adapter/Prometheus/Gauge.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\Prometheus; diff --git a/src/Adapter/Prometheus/Histogram.php b/src/Adapter/Prometheus/Histogram.php index e38d1e124..f0fb45b8e 100644 --- a/src/Adapter/Prometheus/Histogram.php +++ b/src/Adapter/Prometheus/Histogram.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\Prometheus; diff --git a/src/Adapter/Prometheus/MetricFactory.php b/src/Adapter/Prometheus/MetricFactory.php index 188c27cc7..86095300b 100644 --- a/src/Adapter/Prometheus/MetricFactory.php +++ b/src/Adapter/Prometheus/MetricFactory.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\Prometheus; diff --git a/src/Adapter/Prometheus/Redis.php b/src/Adapter/Prometheus/Redis.php index f6c844c27..b2c0ea97a 100644 --- a/src/Adapter/Prometheus/Redis.php +++ b/src/Adapter/Prometheus/Redis.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\Prometheus; diff --git a/src/Adapter/Prometheus/RedisStorageFactory.php b/src/Adapter/Prometheus/RedisStorageFactory.php index ddc1188a6..9add69dc9 100644 --- a/src/Adapter/Prometheus/RedisStorageFactory.php +++ b/src/Adapter/Prometheus/RedisStorageFactory.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\Prometheus; diff --git a/src/Adapter/RemoteProxy/Counter.php b/src/Adapter/RemoteProxy/Counter.php index fad0450d8..cc3b2bdb4 100644 --- a/src/Adapter/RemoteProxy/Counter.php +++ b/src/Adapter/RemoteProxy/Counter.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\RemoteProxy; diff --git a/src/Adapter/RemoteProxy/Gauge.php b/src/Adapter/RemoteProxy/Gauge.php index f0501ff6a..9066d9b34 100644 --- a/src/Adapter/RemoteProxy/Gauge.php +++ b/src/Adapter/RemoteProxy/Gauge.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\RemoteProxy; diff --git a/src/Adapter/RemoteProxy/Histogram.php b/src/Adapter/RemoteProxy/Histogram.php index 119b9397b..1857b55da 100644 --- a/src/Adapter/RemoteProxy/Histogram.php +++ b/src/Adapter/RemoteProxy/Histogram.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\RemoteProxy; diff --git a/src/Adapter/RemoteProxy/MetricFactory.php b/src/Adapter/RemoteProxy/MetricFactory.php index 7a7e59445..61a31ed1e 100644 --- a/src/Adapter/RemoteProxy/MetricFactory.php +++ b/src/Adapter/RemoteProxy/MetricFactory.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\RemoteProxy; diff --git a/src/Adapter/StatsD/Connection.php b/src/Adapter/StatsD/Connection.php new file mode 100644 index 000000000..63ab19d26 --- /dev/null +++ b/src/Adapter/StatsD/Connection.php @@ -0,0 +1,33 @@ +host; + $socket = fsockopen($url, $this->port, $errorNumber, $errorMessage); + fwrite($socket, $message); + fclose($socket); + $socket = null; + } +} diff --git a/src/Adapter/StatsD/Counter.php b/src/Adapter/StatsD/Counter.php index e92de713e..c65bc3a5e 100644 --- a/src/Adapter/StatsD/Counter.php +++ b/src/Adapter/StatsD/Counter.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\StatsD; diff --git a/src/Adapter/StatsD/Gauge.php b/src/Adapter/StatsD/Gauge.php index f277661c1..e3a472dbc 100644 --- a/src/Adapter/StatsD/Gauge.php +++ b/src/Adapter/StatsD/Gauge.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\StatsD; diff --git a/src/Adapter/StatsD/Histogram.php b/src/Adapter/StatsD/Histogram.php index 8c2884f34..5e2f68184 100644 --- a/src/Adapter/StatsD/Histogram.php +++ b/src/Adapter/StatsD/Histogram.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\StatsD; diff --git a/src/Adapter/StatsD/MetricFactory.php b/src/Adapter/StatsD/MetricFactory.php index c6bd19a1d..98d4d41f9 100644 --- a/src/Adapter/StatsD/MetricFactory.php +++ b/src/Adapter/StatsD/MetricFactory.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Adapter\StatsD; @@ -92,7 +92,7 @@ protected function getConnection(): Connection $host = $this->config->get("metric.metric.{$name}.udp_host"); $port = $this->config->get("metric.metric.{$name}.udp_port"); $timeout = $this->config->get("metric.metric.{$name}.timeout"); - $persistent = $this->config->get("metric.metric.{$name}.persistent", true); + $persistent = $this->config->get("metric.metric.{$name}.persistent", false); return make(Connection::class, [ 'host' => $host, 'port' => (int) $port, diff --git a/src/Annotation/Counter.php b/src/Annotation/Counter.php index 4ef0d8f9c..264295860 100644 --- a/src/Annotation/Counter.php +++ b/src/Annotation/Counter.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Annotation; diff --git a/src/Annotation/Histogram.php b/src/Annotation/Histogram.php index e88ed9241..dc70bb202 100644 --- a/src/Annotation/Histogram.php +++ b/src/Annotation/Histogram.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Annotation; diff --git a/src/Aspect/CounterAnnotationAspect.php b/src/Aspect/CounterAnnotationAspect.php index 1f12f3bb4..83e27716a 100644 --- a/src/Aspect/CounterAnnotationAspect.php +++ b/src/Aspect/CounterAnnotationAspect.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Aspect; diff --git a/src/Aspect/HistogramAnnotationAspect.php b/src/Aspect/HistogramAnnotationAspect.php index 9f41ba5fc..46b2d68eb 100644 --- a/src/Aspect/HistogramAnnotationAspect.php +++ b/src/Aspect/HistogramAnnotationAspect.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Aspect; diff --git a/src/Aspect/HttpClientMetricAspect.php b/src/Aspect/HttpClientMetricAspect.php new file mode 100644 index 000000000..0a66700a3 --- /dev/null +++ b/src/Aspect/HttpClientMetricAspect.php @@ -0,0 +1,84 @@ +arguments['keys']['options']; + + if (isset($options['no_aspect']) && $options['no_aspect'] === true) { + return $proceedingJoinPoint->process(); + } + + /** @var Client $instance */ + /** @var Uri $base_uri */ + $instance = $proceedingJoinPoint->getInstance(); + $base_uri = $instance->getConfig('base_uri'); + + $arguments = $proceedingJoinPoint->arguments; + $method = strtoupper($arguments['keys']['method'] ?? ''); + $uri = $arguments['keys']['uri'] ?? ''; + $host = $base_uri === null ? (parse_url($uri, PHP_URL_HOST) ?? '') : $base_uri->getHost(); + + $labels = [ + 'uri' => SupportUri::sanitize($uri), + 'host' => $host, + 'method' => $method, + 'http_status_code' => '200', + ]; + + $timer = new Timer('http_client_requests', $labels); + + /** @var PromiseInterface $result */ + $result = $proceedingJoinPoint->process(); + + $result->then( + $this->onFullFilled($timer, $labels), + $this->onRejected($timer, $labels) + ); + + return $result; + } + + private function onFullFilled(Timer $timer, array $labels): callable + { + return function (ResponseInterface $response) use ($timer, $labels) { + $labels['http_status_code'] = (string) $response->getStatusCode(); + $timer->end($labels); + }; + } + + private function onRejected(Timer $timer, array $labels): callable + { + return function (RequestException $exception) use ($timer, $labels) { + $labels['http_status_code'] = (string) $exception->getResponse()->getStatusCode(); + $timer->end($labels); + + return Create::rejectionFor($exception); + }; + } +} diff --git a/src/Aspect/MongoCollectionMetricAspect.php b/src/Aspect/MongoCollectionMetricAspect.php new file mode 100644 index 000000000..5aec21939 --- /dev/null +++ b/src/Aspect/MongoCollectionMetricAspect.php @@ -0,0 +1,60 @@ +methodName, $this->ignoredMethods)) { + return $proceedingJoinPoint->process(); + } + + $collectionName = $this->getCollectionName($proceedingJoinPoint); + $method = $proceedingJoinPoint->methodName; + + $timer = new Timer('database_queries', [ + 'system' => 'mongodb', + 'operation' => sprintf('MongoDB %s %s', $collectionName, $method), + ]); + + $result = $proceedingJoinPoint->process(); + $timer->end(); + + return $result; + } + + private function getCollectionName(ProceedingJoinPoint $proceedingJoinPoint): string + { + $collection = $proceedingJoinPoint->getInstance(); + + $property = new ReflectionProperty('Hyperf\GoTask\MongoClient\Collection', 'collection'); + $property->setAccessible(true); + + return $property->getValue($collection); + } +} diff --git a/src/Aspect/RedisMetricAspect.php b/src/Aspect/RedisMetricAspect.php new file mode 100644 index 000000000..fb5b20975 --- /dev/null +++ b/src/Aspect/RedisMetricAspect.php @@ -0,0 +1,37 @@ +arguments['keys']; + + $timer = new Timer('database_queries', [ + 'system' => 'redis', + 'operation' => sprintf('Redis %s', $arguments['name']), + ]); + + $result = $proceedingJoinPoint->process(); + $timer->end(); + + return $result; + } +} diff --git a/src/ConfigProvider.php b/src/ConfigProvider.php index 27ef03f74..e00b8b444 100644 --- a/src/ConfigProvider.php +++ b/src/ConfigProvider.php @@ -2,25 +2,30 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric; use Domnikl\Statsd\Connection; -use Domnikl\Statsd\Connection\UdpSocket; +use Hyperf\Metric\Adapter\StatsD\Connection as StatsDConnection; use Hyperf\Metric\Aspect\CounterAnnotationAspect; use Hyperf\Metric\Aspect\HistogramAnnotationAspect; +use Hyperf\Metric\Aspect\HttpClientMetricAspect; +use Hyperf\Metric\Aspect\MongoCollectionMetricAspect; +use Hyperf\Metric\Aspect\RedisMetricAspect; use Hyperf\Metric\Contract\MetricFactoryInterface; +use Hyperf\Metric\Listener\DbQueryExecutedMetricListener; use Hyperf\Metric\Listener\OnBeforeHandle; use Hyperf\Metric\Listener\OnCoroutineServerStart; use Hyperf\Metric\Listener\OnMetricFactoryReady; use Hyperf\Metric\Listener\OnPipeMessage; use Hyperf\Metric\Listener\OnWorkerStart; +use Hyperf\Metric\Middleware\MetricMiddleware; use Hyperf\Metric\Process\MetricProcess; use InfluxDB\Driver\DriverInterface; use InfluxDB\Driver\Guzzle; @@ -35,12 +40,15 @@ public function __invoke(): array 'dependencies' => [ MetricFactoryInterface::class => MetricFactoryPicker::class, Adapter::class => InMemory::class, - Connection::class => UdpSocket::class, + Connection::class => StatsDConnection::class, DriverInterface::class => Guzzle::class, ], 'aspects' => [ CounterAnnotationAspect::class, HistogramAnnotationAspect::class, + HttpClientMetricAspect::class, + MongoCollectionMetricAspect::class, + RedisMetricAspect::class, ], 'publish' => [ [ @@ -51,12 +59,16 @@ public function __invoke(): array ], ], 'listeners' => [ + DbQueryExecutedMetricListener::class, OnPipeMessage::class, OnMetricFactoryReady::class, OnBeforeHandle::class, OnWorkerStart::class, OnCoroutineServerStart::class, ], + 'middlewares' => [ + MetricMiddleware::class, + ], 'processes' => [ MetricProcess::class, ], diff --git a/src/Contract/CounterInterface.php b/src/Contract/CounterInterface.php index a625b70dc..207f8282e 100644 --- a/src/Contract/CounterInterface.php +++ b/src/Contract/CounterInterface.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Contract; diff --git a/src/Contract/GaugeInterface.php b/src/Contract/GaugeInterface.php index 204c121b6..b9af0e5a2 100644 --- a/src/Contract/GaugeInterface.php +++ b/src/Contract/GaugeInterface.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Contract; diff --git a/src/Contract/HistogramInterface.php b/src/Contract/HistogramInterface.php index 1f8bd5d58..5571d5323 100644 --- a/src/Contract/HistogramInterface.php +++ b/src/Contract/HistogramInterface.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Contract; diff --git a/src/Contract/MetricFactoryInterface.php b/src/Contract/MetricFactoryInterface.php index 0e28970b9..7409d1a41 100644 --- a/src/Contract/MetricFactoryInterface.php +++ b/src/Contract/MetricFactoryInterface.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Contract; diff --git a/src/CoroutineServerStats.php b/src/CoroutineServerStats.php index 171ef4c77..411ce9857 100644 --- a/src/CoroutineServerStats.php +++ b/src/CoroutineServerStats.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric; diff --git a/src/Event/MetricFactoryReady.php b/src/Event/MetricFactoryReady.php index 6ac4a0bf3..152fecba6 100644 --- a/src/Event/MetricFactoryReady.php +++ b/src/Event/MetricFactoryReady.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Event; diff --git a/src/Exception/InvalidArgumentException.php b/src/Exception/InvalidArgumentException.php index e80c63a98..890383263 100644 --- a/src/Exception/InvalidArgumentException.php +++ b/src/Exception/InvalidArgumentException.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Exception; diff --git a/src/Exception/RuntimeException.php b/src/Exception/RuntimeException.php index ddc9d55af..9785fc886 100644 --- a/src/Exception/RuntimeException.php +++ b/src/Exception/RuntimeException.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Exception; diff --git a/src/Listener/DBPoolWatcher.php b/src/Listener/DBPoolWatcher.php index f96e45aa7..c286f3861 100644 --- a/src/Listener/DBPoolWatcher.php +++ b/src/Listener/DBPoolWatcher.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Listener; diff --git a/src/Listener/DbQueryExecutedMetricListener.php b/src/Listener/DbQueryExecutedMetricListener.php new file mode 100644 index 000000000..3a7158d26 --- /dev/null +++ b/src/Listener/DbQueryExecutedMetricListener.php @@ -0,0 +1,44 @@ + 'mysql', + 'operation' => $event->sql, + ]; + + $histogram = make(MetricFactoryInterface::class) + ->makeHistogram('database_queries', array_keys($labels)) + ->with(...array_values($labels)); + + $histogram->put($event->time); + } +} diff --git a/src/Listener/OnBeforeHandle.php b/src/Listener/OnBeforeHandle.php index 0fa0c3201..6a9be1310 100644 --- a/src/Listener/OnBeforeHandle.php +++ b/src/Listener/OnBeforeHandle.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Listener; diff --git a/src/Listener/OnCoroutineServerStart.php b/src/Listener/OnCoroutineServerStart.php index 5294dd15b..4fb23eada 100644 --- a/src/Listener/OnCoroutineServerStart.php +++ b/src/Listener/OnCoroutineServerStart.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Listener; diff --git a/src/Listener/OnMetricFactoryReady.php b/src/Listener/OnMetricFactoryReady.php index ffc81167e..eec6b384f 100644 --- a/src/Listener/OnMetricFactoryReady.php +++ b/src/Listener/OnMetricFactoryReady.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Listener; diff --git a/src/Listener/OnPipeMessage.php b/src/Listener/OnPipeMessage.php index 933e27608..5e838f846 100644 --- a/src/Listener/OnPipeMessage.php +++ b/src/Listener/OnPipeMessage.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Listener; diff --git a/src/Listener/OnWorkerStart.php b/src/Listener/OnWorkerStart.php index 0cdb4dc4d..347758354 100644 --- a/src/Listener/OnWorkerStart.php +++ b/src/Listener/OnWorkerStart.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Listener; diff --git a/src/Listener/PoolWatcher.php b/src/Listener/PoolWatcher.php index 936cc3aae..43f23c6ce 100644 --- a/src/Listener/PoolWatcher.php +++ b/src/Listener/PoolWatcher.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Listener; diff --git a/src/Listener/QueueWatcher.php b/src/Listener/QueueWatcher.php index 592d08dc2..35c9658e8 100644 --- a/src/Listener/QueueWatcher.php +++ b/src/Listener/QueueWatcher.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Listener; diff --git a/src/Listener/RedisPoolWatcher.php b/src/Listener/RedisPoolWatcher.php index b15bc5063..0ea3842ff 100644 --- a/src/Listener/RedisPoolWatcher.php +++ b/src/Listener/RedisPoolWatcher.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Listener; diff --git a/src/Metric.php b/src/Metric.php index e8cb0ac06..22984047f 100644 --- a/src/Metric.php +++ b/src/Metric.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric; diff --git a/src/MetricFactoryPicker.php b/src/MetricFactoryPicker.php index ff7fdae4d..5b9a83e9a 100644 --- a/src/MetricFactoryPicker.php +++ b/src/MetricFactoryPicker.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric; diff --git a/src/MetricSetter.php b/src/MetricSetter.php index f2d6db0d0..d697e3558 100644 --- a/src/MetricSetter.php +++ b/src/MetricSetter.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric; diff --git a/src/Middleware/MetricMiddleware.php b/src/Middleware/MetricMiddleware.php index 5dc6b3787..baf5269e1 100644 --- a/src/Middleware/MetricMiddleware.php +++ b/src/Middleware/MetricMiddleware.php @@ -2,18 +2,18 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Middleware; -use Hyperf\HttpMessage\Exception\HttpException; use Hyperf\HttpServer\Router\Dispatched; -use Hyperf\Metric\CoroutineServerStats; +use Hyperf\Metric\Metric; +use Hyperf\Metric\Support\Uri; use Hyperf\Metric\Timer; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -23,10 +23,6 @@ class MetricMiddleware implements MiddlewareInterface { - public function __construct(protected CoroutineServerStats $stats) - { - } - /** * Process an incoming server request. * Processes an incoming server request in order to produce a response. @@ -36,43 +32,50 @@ public function __construct(protected CoroutineServerStats $stats) public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $labels = [ - 'request_status' => '500', // default to 500 in case uncaught exception occur + 'request_status' => '500', 'request_path' => $this->getPath($request), 'request_method' => $request->getMethod(), ]; - $timer = new Timer('http_requests', $labels); - ++$this->stats->accept_count; - ++$this->stats->request_count; - ++$this->stats->connection_num; + $timer = new Timer('http_requests', $labels); try { $response = $handler->handle($request); $labels['request_status'] = (string) $response->getStatusCode(); + $timer->end($labels); + + return $response; } catch (Throwable $exception) { - if ($exception instanceof HttpException) { - $labels['request_status'] = (string) $exception->getStatusCode(); - } - throw $exception; - } finally { + $this->countException($request, $exception); $timer->end($labels); - ++$this->stats->close_count; - ++$this->stats->response_count; - --$this->stats->connection_num; - } - return $response; + throw $exception; + } } protected function getPath(ServerRequestInterface $request): string { $dispatched = $request->getAttribute(Dispatched::class); if (! $dispatched) { - return $request->getUri()->getPath(); + return Uri::sanitize($request->getUri()->getPath()); } if (! $dispatched->handler) { return 'not_found'; } return $dispatched->handler->route; } + + protected function countException(ServerRequestInterface $request, Throwable $exception): void + { + $labels = [ + 'request_path' => $this->getPath($request), + 'request_method' => $request->getMethod(), + 'class' => $exception::class, + 'message' => $exception->getMessage(), + 'code' => (string) $exception->getCode(), + 'line' => (string) $exception->getLine(), + ]; + + Metric::count('exception_count', 1, $labels); + } } diff --git a/src/Process/MetricProcess.php b/src/Process/MetricProcess.php index 266987e08..9252d2fa7 100644 --- a/src/Process/MetricProcess.php +++ b/src/Process/MetricProcess.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric\Process; diff --git a/src/Support/Uri.php b/src/Support/Uri.php new file mode 100644 index 000000000..efac8278e --- /dev/null +++ b/src/Support/Uri.php @@ -0,0 +1,30 @@ +', + '/', + ], + $uri + ); + } +} diff --git a/src/Timer.php b/src/Timer.php index 4600b4a4d..032f47c71 100644 --- a/src/Timer.php +++ b/src/Timer.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Metric; diff --git a/tests/Adapter/Prometheus/RedisStorageFactoryTest.php b/tests/Adapter/Prometheus/RedisStorageFactoryTest.php index 9da13b90d..abe1622d9 100644 --- a/tests/Adapter/Prometheus/RedisStorageFactoryTest.php +++ b/tests/Adapter/Prometheus/RedisStorageFactoryTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace HyperfTest\Metric\Adapter\Prometheus; diff --git a/tests/Adapter/Prometheus/RedisTest.php b/tests/Adapter/Prometheus/RedisTest.php index 533a68a5c..11b925f72 100644 --- a/tests/Adapter/Prometheus/RedisTest.php +++ b/tests/Adapter/Prometheus/RedisTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace HyperfTest\Metric\Adapter\Prometheus; diff --git a/tests/Cases/MetricFactoryPickerTest.php b/tests/Cases/MetricFactoryPickerTest.php index 55ffe1806..407f73deb 100644 --- a/tests/Cases/MetricFactoryPickerTest.php +++ b/tests/Cases/MetricFactoryPickerTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace HyperfTest\Metric\Cases; diff --git a/tests/Cases/MetricFactoryTest.php b/tests/Cases/MetricFactoryTest.php index 1f63c5c7d..742a95de8 100644 --- a/tests/Cases/MetricFactoryTest.php +++ b/tests/Cases/MetricFactoryTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace HyperfTest\Metric\Cases; diff --git a/tests/Cases/OnWorkerStartTest.php b/tests/Cases/OnWorkerStartTest.php index 14b5d4b65..33abf16b3 100644 --- a/tests/Cases/OnWorkerStartTest.php +++ b/tests/Cases/OnWorkerStartTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace HyperfTest\Metric\Cases; diff --git a/tests/Cases/TimerTest.php b/tests/Cases/TimerTest.php index d1040e27d..57caa6654 100644 --- a/tests/Cases/TimerTest.php +++ b/tests/Cases/TimerTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace HyperfTest\Metric\Cases; diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php new file mode 100644 index 000000000..567203ab0 --- /dev/null +++ b/tests/Cases/UriTest.php @@ -0,0 +1,48 @@ +', Uri::sanitize('/v2/test/123')); + self::assertSame('/v3/test//bar', Uri::sanitize('/v3/test/123/bar')); + self::assertSame('/v4/test//bar//', Uri::sanitize('/v4/test/123/bar/456/')); + self::assertSame('/v5/test//', Uri::sanitize('/v5/test/123/456')); + self::assertSame('/v6/test///', Uri::sanitize('/v6/test/123/456/')); + self::assertSame('/v7/test///', Uri::sanitize('/v7/test/123/456/789')); + self::assertSame('/v8/test////', Uri::sanitize('/v8/test/123/456/789/')); + } + + public function testClearUriUuids(): void + { + $uuid = '123e4567-e89b-12d3-a456-426614174000'; + + self::assertSame('/v1/test', Uri::sanitize('/v1/test')); + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$uuid}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$uuid}/bar")); + self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$uuid}/bar/{$uuid}/")); + self::assertSame('/v5/test//', Uri::sanitize("/v5/test/{$uuid}/{$uuid}")); + self::assertSame('/v6/test///', Uri::sanitize("/v6/test/{$uuid}/{$uuid}/")); + self::assertSame('/v7/test///', Uri::sanitize("/v7/test/{$uuid}/{$uuid}/{$uuid}")); + self::assertSame('/v8/test////', Uri::sanitize("/v8/test/{$uuid}/{$uuid}/{$uuid}/")); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 0fab7438e..ebf621972 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ define('BASE_PATH', dirname(__DIR__, 1)); From 878f11a9a65d2d3c8afab1ae7ced730e6ea128f6 Mon Sep 17 00:00:00 2001 From: leocavalcante Date: Wed, 26 Jul 2023 14:05:19 -0300 Subject: [PATCH 04/38] chore(deps): Allows psr/http-message 1.x --- composer.json | 2 +- composer.lock | 168 +++++++++++++++++++++++++++----------------------- 2 files changed, 91 insertions(+), 79 deletions(-) diff --git a/composer.json b/composer.json index 7a1c391b3..10930b0fd 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ "promphp/prometheus_client_php": "^2.7", "psr/container": "^2.0", "psr/event-dispatcher": "^1.0", - "psr/http-message": "^2.0" + "psr/http-message": "^1.0|^2.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.21", diff --git a/composer.lock b/composer.lock index 8c4af4401..838672554 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "13a64b1c6c31e0cf6a1b5a835cda811e", + "content-hash": "445f36627f77b0c7058e7f6a556487e8", "packages": [ { "name": "doctrine/inflector", @@ -479,16 +479,16 @@ }, { "name": "hyperf/codec", - "version": "v3.0.1", + "version": "v3.0.30", "source": { "type": "git", "url": "https://github.com/hyperf/codec.git", - "reference": "7d3cbfa06c50ef52809acadfcbcd59424366f591" + "reference": "30b170b59770c7f92ae845fca777b8ea8a953599" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/codec/zipball/7d3cbfa06c50ef52809acadfcbcd59424366f591", - "reference": "7d3cbfa06c50ef52809acadfcbcd59424366f591", + "url": "https://api.github.com/repos/hyperf/codec/zipball/30b170b59770c7f92ae845fca777b8ea8a953599", + "reference": "30b170b59770c7f92ae845fca777b8ea8a953599", "shasum": "" }, "require": { @@ -497,6 +497,9 @@ "hyperf/contract": "~3.0.0", "php": ">=8.0" }, + "suggest": { + "ext-igbinary": "Required to use IgbinarySerializerPacker." + }, "type": "library", "extra": { "branch-alias": { @@ -526,20 +529,20 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-04-24T09:49:41+00:00" + "time": "2023-07-18T12:10:42+00:00" }, { "name": "hyperf/collection", - "version": "v3.0.24", + "version": "v3.0.29", "source": { "type": "git", "url": "https://github.com/hyperf/collection.git", - "reference": "25be1f5643565dd19c05ee2da4156cfaa8bb71eb" + "reference": "c2e3f919f8c445da69e0e0c10920c6fc0754b9ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/collection/zipball/25be1f5643565dd19c05ee2da4156cfaa8bb71eb", - "reference": "25be1f5643565dd19c05ee2da4156cfaa8bb71eb", + "url": "https://api.github.com/repos/hyperf/collection/zipball/c2e3f919f8c445da69e0e0c10920c6fc0754b9ad", + "reference": "c2e3f919f8c445da69e0e0c10920c6fc0754b9ad", "shasum": "" }, "require": { @@ -579,7 +582,7 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-06-05T11:54:56+00:00" + "time": "2023-07-14T03:41:52+00:00" }, { "name": "hyperf/conditionable", @@ -830,20 +833,20 @@ }, { "name": "hyperf/engine", - "version": "v2.9.0", + "version": "v2.10.0", "source": { "type": "git", "url": "https://github.com/hyperf/engine.git", - "reference": "3e0920ad7ba15a965f129143d3248f8e85e0c2d9" + "reference": "9b27b29041403b8ee397ffe1e5254816e18cb5b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/engine/zipball/3e0920ad7ba15a965f129143d3248f8e85e0c2d9", - "reference": "3e0920ad7ba15a965f129143d3248f8e85e0c2d9", + "url": "https://api.github.com/repos/hyperf/engine/zipball/9b27b29041403b8ee397ffe1e5254816e18cb5b9", + "reference": "9b27b29041403b8ee397ffe1e5254816e18cb5b9", "shasum": "" }, "require": { - "hyperf/engine-contract": "~1.8.0", + "hyperf/engine-contract": "~1.9.0", "php": ">=8.0" }, "conflict": { @@ -867,7 +870,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.9-dev" + "dev-master": "2.10-dev" }, "hyperf": { "config": "Hyperf\\Engine\\ConfigProvider" @@ -894,22 +897,22 @@ ], "support": { "issues": "https://github.com/hyperf/engine/issues", - "source": "https://github.com/hyperf/engine/tree/v2.9.0" + "source": "https://github.com/hyperf/engine/tree/v2.10.0" }, - "time": "2023-06-17T11:23:50+00:00" + "time": "2023-07-14T02:28:58+00:00" }, { "name": "hyperf/engine-contract", - "version": "v1.8.0", + "version": "v1.9.0", "source": { "type": "git", "url": "https://github.com/hyperf/engine-contract.git", - "reference": "69b9bb43d6c356be7c7eb2f55ff06282436a0e4d" + "reference": "45c9c49766d8b0e539975fe4c5ed6807221c4b38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/engine-contract/zipball/69b9bb43d6c356be7c7eb2f55ff06282436a0e4d", - "reference": "69b9bb43d6c356be7c7eb2f55ff06282436a0e4d", + "url": "https://api.github.com/repos/hyperf/engine-contract/zipball/45c9c49766d8b0e539975fe4c5ed6807221c4b38", + "reference": "45c9c49766d8b0e539975fe4c5ed6807221c4b38", "shasum": "" }, "require": { @@ -929,7 +932,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -951,9 +954,9 @@ ], "support": { "issues": "https://github.com/hyperf/engine-contract/issues", - "source": "https://github.com/hyperf/engine-contract/tree/v1.8.0" + "source": "https://github.com/hyperf/engine-contract/tree/v1.9.0" }, - "time": "2023-06-17T11:16:19+00:00" + "time": "2023-07-14T02:21:02+00:00" }, { "name": "hyperf/guzzle", @@ -2302,16 +2305,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.21.1", + "version": "v3.22.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "229b55b3eae4729a8e2a321441ba40fcb3720b86" + "reference": "92b019f6c8d79aa26349d0db7671d37440dc0ff3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/229b55b3eae4729a8e2a321441ba40fcb3720b86", - "reference": "229b55b3eae4729a8e2a321441ba40fcb3720b86", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/92b019f6c8d79aa26349d0db7671d37440dc0ff3", + "reference": "92b019f6c8d79aa26349d0db7671d37440dc0ff3", "shasum": "" }, "require": { @@ -2321,7 +2324,7 @@ "doctrine/lexer": "^2 || ^3", "ext-json": "*", "ext-tokenizer": "*", - "php": "^8.0.1", + "php": "^7.4 || ^8.0", "sebastian/diff": "^4.0 || ^5.0", "symfony/console": "^5.4 || ^6.0", "symfony/event-dispatcher": "^5.4 || ^6.0", @@ -2335,6 +2338,7 @@ "symfony/stopwatch": "^5.4 || ^6.0" }, "require-dev": { + "facile-it/paraunit": "^1.3 || ^2.0", "justinrainbow/json-schema": "^5.2", "keradus/cli-executor": "^2.0", "mikey179/vfsstream": "^1.6.11", @@ -2386,7 +2390,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.21.1" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.22.0" }, "funding": [ { @@ -2394,7 +2398,7 @@ "type": "github" } ], - "time": "2023-07-05T21:50:25+00:00" + "time": "2023-07-16T23:08:06+00:00" }, { "name": "graham-campbell/result-type", @@ -2694,16 +2698,16 @@ }, { "name": "hyperf/database", - "version": "v3.0.27", + "version": "v3.0.30", "source": { "type": "git", "url": "https://github.com/hyperf/database.git", - "reference": "a966a0d211df5a7c7eff62cbc83c9acb87d4cb71" + "reference": "2b6178219951df7044417de1412a20a08cc331fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/database/zipball/a966a0d211df5a7c7eff62cbc83c9acb87d4cb71", - "reference": "a966a0d211df5a7c7eff62cbc83c9acb87d4cb71", + "url": "https://api.github.com/repos/hyperf/database/zipball/2b6178219951df7044417de1412a20a08cc331fa", + "reference": "2b6178219951df7044417de1412a20a08cc331fa", "shasum": "" }, "require": { @@ -2751,7 +2755,7 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-06-30T01:20:59+00:00" + "time": "2023-07-17T12:16:22+00:00" }, { "name": "hyperf/db-connection", @@ -3590,16 +3594,16 @@ }, { "name": "hyperf/testing", - "version": "v3.0.23", + "version": "v3.0.30", "source": { "type": "git", "url": "https://github.com/hyperf/testing.git", - "reference": "e660ba6f6f4c1dd46cc6203feeefd4638454108c" + "reference": "fa9d8c1e79bc4958be5a2642387e1915a7fc9f13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/testing/zipball/e660ba6f6f4c1dd46cc6203feeefd4638454108c", - "reference": "e660ba6f6f4c1dd46cc6203feeefd4638454108c", + "url": "https://api.github.com/repos/hyperf/testing/zipball/fa9d8c1e79bc4958be5a2642387e1915a7fc9f13", + "reference": "fa9d8c1e79bc4958be5a2642387e1915a7fc9f13", "shasum": "" }, "require": { @@ -3641,9 +3645,9 @@ "testing" ], "support": { - "source": "https://github.com/hyperf/testing/tree/v3.0.23" + "source": "https://github.com/hyperf/testing/tree/v3.0.30" }, - "time": "2023-06-01T08:26:57+00:00" + "time": "2023-07-21T03:15:25+00:00" }, { "name": "influxdb/influxdb-php", @@ -3834,37 +3838,33 @@ }, { "name": "mockery/mockery", - "version": "1.6.2", + "version": "1.6.4", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "13a7fa2642c76c58fa2806ef7f565344c817a191" + "reference": "d1413755e26fe56a63455f7753221c86cbb88f66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/13a7fa2642c76c58fa2806ef7f565344c817a191", - "reference": "13a7fa2642c76c58fa2806ef7f565344c817a191", + "url": "https://api.github.com/repos/mockery/mockery/zipball/d1413755e26fe56a63455f7753221c86cbb88f66", + "reference": "d1413755e26fe56a63455f7753221c86cbb88f66", "shasum": "" }, "require": { "hamcrest/hamcrest-php": "^2.0.1", "lib-pcre": ">=7.0", - "php": "^7.4 || ^8.0" + "php": ">=7.4,<8.3" }, "conflict": { "phpunit/phpunit": "<8.0" }, "require-dev": { "phpunit/phpunit": "^8.5 || ^9.3", - "psalm/plugin-phpunit": "^0.18", - "vimeo/psalm": "^5.9" + "psalm/plugin-phpunit": "^0.18.4", + "symplify/easy-coding-standard": "^11.5.0", + "vimeo/psalm": "^5.13.1" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.6.x-dev" - } - }, "autoload": { "files": [ "library/helpers.php", @@ -3882,12 +3882,20 @@ { "name": "Pádraic Brady", "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" + "homepage": "https://github.com/padraic", + "role": "Author" }, { "name": "Dave Marshall", "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "http://davedevelopment.co.uk" + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" } ], "description": "Mockery is a simple yet flexible PHP mock object framework", @@ -3905,10 +3913,13 @@ "testing" ], "support": { + "docs": "https://docs.mockery.io/", "issues": "https://github.com/mockery/mockery/issues", - "source": "https://github.com/mockery/mockery/tree/1.6.2" + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" }, - "time": "2023-06-07T09:07:52+00:00" + "time": "2023-07-19T15:51:02+00:00" }, { "name": "myclabs/deep-copy", @@ -4451,16 +4462,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.25", + "version": "1.10.26", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "578f4e70d117f9a90699324c555922800ac38d8c" + "reference": "5d660cbb7e1b89253a47147ae44044f49832351f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/578f4e70d117f9a90699324c555922800ac38d8c", - "reference": "578f4e70d117f9a90699324c555922800ac38d8c", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5d660cbb7e1b89253a47147ae44044f49832351f", + "reference": "5d660cbb7e1b89253a47147ae44044f49832351f", "shasum": "" }, "require": { @@ -4509,7 +4520,7 @@ "type": "tidelift" } ], - "time": "2023-07-06T12:11:37+00:00" + "time": "2023-07-19T12:44:37+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -4563,16 +4574,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.26", + "version": "9.2.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" + "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b0a88255cb70d52653d80c890bd7f38740ea50d1", + "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1", "shasum": "" }, "require": { @@ -4628,7 +4639,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.27" }, "funding": [ { @@ -4636,7 +4648,7 @@ "type": "github" } ], - "time": "2023-03-06T12:58:08+00:00" + "time": "2023-07-26T13:44:30+00:00" }, { "name": "phpunit/php-file-iterator", @@ -5196,21 +5208,21 @@ }, { "name": "rector/rector", - "version": "0.17.5", + "version": "0.17.7", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "f4a5f45c420b797d8e8e9c540e14c8bbdddff62d" + "reference": "0e76101aa329911b7fec43106aac5843a978b209" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/f4a5f45c420b797d8e8e9c540e14c8bbdddff62d", - "reference": "f4a5f45c420b797d8e8e9c540e14c8bbdddff62d", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/0e76101aa329911b7fec43106aac5843a978b209", + "reference": "0e76101aa329911b7fec43106aac5843a978b209", "shasum": "" }, "require": { "php": "^7.2|^8.0", - "phpstan/phpstan": "^1.10.20" + "phpstan/phpstan": "^1.10.26" }, "conflict": { "rector/rector-doctrine": "*", @@ -5245,7 +5257,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.17.5" + "source": "https://github.com/rectorphp/rector/tree/0.17.7" }, "funding": [ { @@ -5253,7 +5265,7 @@ "type": "github" } ], - "time": "2023-07-12T08:42:12+00:00" + "time": "2023-07-23T20:44:23+00:00" }, { "name": "sebastian/cli-parser", From f3759d284ffa8a0180208d5959a7a3ca19ad228c Mon Sep 17 00:00:00 2001 From: leocavalcante Date: Wed, 26 Jul 2023 14:59:29 -0300 Subject: [PATCH 05/38] feat: service.name and host.name from otel spec --- src/Adapter/StatsD/MetricFactory.php | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/Adapter/StatsD/MetricFactory.php b/src/Adapter/StatsD/MetricFactory.php index 98d4d41f9..da6ae84a2 100644 --- a/src/Adapter/StatsD/MetricFactory.php +++ b/src/Adapter/StatsD/MetricFactory.php @@ -21,6 +21,7 @@ use Hyperf\Metric\Contract\HistogramInterface; use Hyperf\Metric\Contract\MetricFactoryInterface; +use function Hyperf\Support\env; use function Hyperf\Support\make; class MetricFactory implements MetricFactoryInterface @@ -38,32 +39,32 @@ public function __construct(private ConfigInterface $config) public function makeCounter(string $name, ?array $labelNames = []): CounterInterface { - return new Counter( + return (new Counter( $this->client, $name, $this->getSampleRate(), - $labelNames - ); + array_merge(['service.name', 'host.name'], $labelNames), + ))->with($this->getNamespace(), $this->getHostname()); } public function makeGauge(string $name, ?array $labelNames = []): GaugeInterface { - return new Gauge( + return (new Gauge( $this->client, $name, $this->getSampleRate(), - $labelNames - ); + array_merge(['service.name', 'host.name'], $labelNames), + ))->with($this->getNamespace(), $this->getHostname()); } public function makeHistogram(string $name, ?array $labelNames = []): HistogramInterface { - return new Histogram( + return (new Histogram( $this->client, $name, $this->getSampleRate(), - $labelNames - ); + array_merge(['service.name', 'host.name'], $labelNames), + ))->with($this->getNamespace(), $this->getHostname()); } public function handle(): void @@ -112,4 +113,9 @@ protected function getSampleRate(): float $name = $this->config->get('metric.default'); return $this->config->get("metric.metric.{$name}.sample_rate", 1.0); } + + protected function getHostname(): string + { + return $this->config->get('hostname', env('HOSTNAME')); + } } From cad2405d062f8e01de31797d778cca3ce387148c Mon Sep 17 00:00:00 2001 From: leocavalcante Date: Thu, 27 Jul 2023 16:41:46 -0300 Subject: [PATCH 06/38] chore(deps): Bump --- composer.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index 838672554..1ebba08ca 100644 --- a/composer.lock +++ b/composer.lock @@ -1120,16 +1120,16 @@ }, { "name": "hyperf/stringable", - "version": "v3.0.27", + "version": "v3.0.31", "source": { "type": "git", "url": "https://github.com/hyperf/stringable.git", - "reference": "cd56584d5d7a2688e1c1a401c3c41c0a8143a920" + "reference": "1bcea1466a87267c780cd67df05de0127c237dcd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/stringable/zipball/cd56584d5d7a2688e1c1a401c3c41c0a8143a920", - "reference": "cd56584d5d7a2688e1c1a401c3c41c0a8143a920", + "url": "https://api.github.com/repos/hyperf/stringable/zipball/1bcea1466a87267c780cd67df05de0127c237dcd", + "reference": "1bcea1466a87267c780cd67df05de0127c237dcd", "shasum": "" }, "require": { @@ -1176,7 +1176,7 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-06-25T06:10:37+00:00" + "time": "2023-07-25T12:44:39+00:00" }, { "name": "hyperf/support", From 00b67dbc58a4d271f7e6ea68b42f5baebfc8ffad Mon Sep 17 00:00:00 2001 From: leocavalcante Date: Thu, 27 Jul 2023 16:42:11 -0300 Subject: [PATCH 07/38] fix: Defaults hostname to app name --- src/Adapter/StatsD/MetricFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Adapter/StatsD/MetricFactory.php b/src/Adapter/StatsD/MetricFactory.php index da6ae84a2..6950b1bc2 100644 --- a/src/Adapter/StatsD/MetricFactory.php +++ b/src/Adapter/StatsD/MetricFactory.php @@ -116,6 +116,6 @@ protected function getSampleRate(): float protected function getHostname(): string { - return $this->config->get('hostname', env('HOSTNAME')); + return $this->config->get('hostname', env('HOSTNAME', env('APP_NAME'))); } } From 077f5da5b15096d8b42ba523e62102993378ccd9 Mon Sep 17 00:00:00 2001 From: leocavalcante Date: Thu, 27 Jul 2023 16:53:58 -0300 Subject: [PATCH 08/38] fix: Merge label values --- src/Adapter/StatsD/Counter.php | 2 +- src/Adapter/StatsD/Gauge.php | 2 +- src/Adapter/StatsD/Histogram.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Adapter/StatsD/Counter.php b/src/Adapter/StatsD/Counter.php index c65bc3a5e..08307cfb0 100644 --- a/src/Adapter/StatsD/Counter.php +++ b/src/Adapter/StatsD/Counter.php @@ -34,7 +34,7 @@ public function __construct( public function with(string ...$labelValues): static { - $this->labelValues = $labelValues; + $this->labelValues = array_merge($this->labelValues, $labelValues); return $this; } diff --git a/src/Adapter/StatsD/Gauge.php b/src/Adapter/StatsD/Gauge.php index e3a472dbc..f134cf212 100644 --- a/src/Adapter/StatsD/Gauge.php +++ b/src/Adapter/StatsD/Gauge.php @@ -34,7 +34,7 @@ public function __construct( public function with(string ...$labelValues): static { - $this->labelValues = $labelValues; + $this->labelValues = array_merge($this->labelValues, $labelValues); return $this; } diff --git a/src/Adapter/StatsD/Histogram.php b/src/Adapter/StatsD/Histogram.php index 5e2f68184..2b8475e74 100644 --- a/src/Adapter/StatsD/Histogram.php +++ b/src/Adapter/StatsD/Histogram.php @@ -34,7 +34,7 @@ public function __construct( public function with(string ...$labelValues): static { - $this->labelValues = $labelValues; + $this->labelValues = array_merge($this->labelValues, $labelValues); return $this; } From 30464f61068d91b395c76aa366624f8bc26df5ca Mon Sep 17 00:00:00 2001 From: Leo Cavalcante Date: Thu, 3 Aug 2023 10:21:58 -0300 Subject: [PATCH 09/38] chore(docs): getting started --- README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 834190404..aaa3423d1 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,18 @@ 🔭 Drop-in replacement for the `hyperf/metric` component. -Suited for special needs. +Suited for special needs, especially for OpenTelemetry, New Relic and Dynatrace platforms. + +## Getting started + +### Install + +#### Add OpenCodeCo's Composer repository: +```shell +composer config repositories.opencodeco composer https://composer.opencodeco.dev +``` + +#### Update your `hyperf/metric`: +```shell +composer update hyperf/metric +``` From 64d80349ad433f4493b7c64b322651e916a451ec Mon Sep 17 00:00:00 2001 From: Leo Cavalcante Date: Wed, 16 Aug 2023 11:25:42 -0300 Subject: [PATCH 10/38] Avoids high cardinality on metrics (#2) * refactor: Avoid high cardinality * refactor: Object not being used * refactor: Restore exception class labeling --- src/Middleware/MetricMiddleware.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Middleware/MetricMiddleware.php b/src/Middleware/MetricMiddleware.php index baf5269e1..a1797ab1c 100644 --- a/src/Middleware/MetricMiddleware.php +++ b/src/Middleware/MetricMiddleware.php @@ -71,9 +71,6 @@ protected function countException(ServerRequestInterface $request, Throwable $ex 'request_path' => $this->getPath($request), 'request_method' => $request->getMethod(), 'class' => $exception::class, - 'message' => $exception->getMessage(), - 'code' => (string) $exception->getCode(), - 'line' => (string) $exception->getLine(), ]; Metric::count('exception_count', 1, $labels); From 253b975ccf3d5ca7da5c30b62c0cd5a7ffa5333c Mon Sep 17 00:00:00 2001 From: Vitor Rodrigues Date: Thu, 14 Sep 2023 15:53:18 -0300 Subject: [PATCH 11/38] Feat/uri sanitize new patterns (#3) * add new patterns and replacements strings * add new tests * fix change patterns and replacements order --- src/Support/Uri.php | 6 ++++++ tests/Cases/UriTest.php | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/Support/Uri.php b/src/Support/Uri.php index efac8278e..dff7c617f 100644 --- a/src/Support/Uri.php +++ b/src/Support/Uri.php @@ -18,10 +18,16 @@ public static function sanitize(string $uri): string return preg_replace( [ '/\/(?<=\/)([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})(?=\/)?/', + '/\/(?<=\/)[A-Za-z]{3}\d[A-Za-z]\d{2}(?=\/)?/', + '/\/(?<=\/)[A-Za-z]{3}\d{4}(?=\/)?/', + '/\/(?<=\/)[0-9A-Fa-f]{24}(?=\/)?/', '/\/(?<=\/)\d+(?=\/)?/', ], [ '/', + '/', + '/', + '/', '/', ], $uri diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index 567203ab0..1e6bb579d 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -32,6 +32,25 @@ public function testSanitizeNumbers(): void self::assertSame('/v8/test////', Uri::sanitize('/v8/test/123/456/789/')); } + public function testSanitizeLicensePlatesStrings(): void + { + self::assertSame('/v1/test', Uri::sanitize('/v1/test')); + self::assertSame('/v2/test/', Uri::sanitize('/v2/test/PET9D49')); + self::assertSame('/v2/test/', Uri::sanitize('/v2/test/PET9349')); + self::assertSame('/v3/test//bar', Uri::sanitize('/v3/test/PET9D49/bar')); + self::assertSame('/v3/test//bar', Uri::sanitize('/v3/test/PET9349/bar')); + self::assertSame('/v4/test//bar//', Uri::sanitize('/v4/test/PET9D49/bar/PET9D49/')); + self::assertSame('/v4/test//bar//', Uri::sanitize('/v4/test/PET9349/bar/PET9349/')); + self::assertSame('/v5/test//', Uri::sanitize('/v5/test/PET9D49/PET9D49')); + self::assertSame('/v5/test//', Uri::sanitize('/v5/test/PET9349/PET9349')); + self::assertSame('/v6/test///', Uri::sanitize('/v6/test/PET9D49/PET9D49/')); + self::assertSame('/v6/test///', Uri::sanitize('/v6/test/PET9349/PET9349/')); + self::assertSame('/v7/test///', Uri::sanitize('/v7/test/PET9D49/PET9D49/PET9D49')); + self::assertSame('/v7/test///', Uri::sanitize('/v7/test/PET9349/PET9349/PET9349')); + self::assertSame('/v8/test////', Uri::sanitize('/v8/test/PET9D49/PET9D49/PET9D49/')); + self::assertSame('/v8/test////', Uri::sanitize('/v8/test/PET9349/PET9349/PET9349/')); + } + public function testClearUriUuids(): void { $uuid = '123e4567-e89b-12d3-a456-426614174000'; @@ -45,4 +64,18 @@ public function testClearUriUuids(): void self::assertSame('/v7/test///', Uri::sanitize("/v7/test/{$uuid}/{$uuid}/{$uuid}")); self::assertSame('/v8/test////', Uri::sanitize("/v8/test/{$uuid}/{$uuid}/{$uuid}/")); } + + public function testClearUriOids(): void + { + $oid = '650229807612bba4984d1fc7'; + + self::assertSame('/v1/test', Uri::sanitize('/v1/test')); + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$oid}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$oid}/bar")); + self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$oid}/bar/{$oid}/")); + self::assertSame('/v5/test//', Uri::sanitize("/v5/test/{$oid}/{$oid}")); + self::assertSame('/v6/test///', Uri::sanitize("/v6/test/{$oid}/{$oid}/")); + self::assertSame('/v7/test///', Uri::sanitize("/v7/test/{$oid}/{$oid}/{$oid}")); + self::assertSame('/v8/test////', Uri::sanitize("/v8/test/{$oid}/{$oid}/{$oid}/")); + } } From e7d311c18b778558da7ab2bee039cc7ca7185ef9 Mon Sep 17 00:00:00 2001 From: Vitor Rodrigues Date: Thu, 14 Sep 2023 17:40:45 -0300 Subject: [PATCH 12/38] Refactor URI sanitize patterns (#4) * fix patterns, shortening patterns and implement case-insensitive * add vscode and jetbrains ide folders into .gitignore --- .gitignore | 2 ++ src/Support/Uri.php | 8 +++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 07744cbac..8817c90f8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +.idea +.vscode *.cache *.log vendor/ diff --git a/src/Support/Uri.php b/src/Support/Uri.php index dff7c617f..d63a64b71 100644 --- a/src/Support/Uri.php +++ b/src/Support/Uri.php @@ -17,16 +17,14 @@ public static function sanitize(string $uri): string { return preg_replace( [ - '/\/(?<=\/)([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})(?=\/)?/', - '/\/(?<=\/)[A-Za-z]{3}\d[A-Za-z]\d{2}(?=\/)?/', - '/\/(?<=\/)[A-Za-z]{3}\d{4}(?=\/)?/', - '/\/(?<=\/)[0-9A-Fa-f]{24}(?=\/)?/', + '/\/(?<=\/)([A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12})(?=\/)?/i', + '/\/(?<=\/)([A-Z]{3}-?\d[0-9A-Z]\d{2})(?=\/)?/i', + '/\/(?<=\/)[0-9A-F]{24}(?=\/)?/i', '/\/(?<=\/)\d+(?=\/)?/', ], [ '/', '/', - '/', '/', '/', ], From e0bf8adaf4e432fcde334c3ce1137f7881790eb7 Mon Sep 17 00:00:00 2001 From: leocavalcante Date: Fri, 15 Sep 2023 16:00:25 -0300 Subject: [PATCH 13/38] feat: Always add initial slash --- src/Support/Uri.php | 2 +- tests/Cases/UriTest.php | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Support/Uri.php b/src/Support/Uri.php index d63a64b71..bea0df471 100644 --- a/src/Support/Uri.php +++ b/src/Support/Uri.php @@ -28,7 +28,7 @@ public static function sanitize(string $uri): string '/', '/', ], - $uri + '/' . ltrim($uri, '/'), ); } } diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index 1e6bb579d..5f252cad4 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -78,4 +78,14 @@ public function testClearUriOids(): void self::assertSame('/v7/test///', Uri::sanitize("/v7/test/{$oid}/{$oid}/{$oid}")); self::assertSame('/v8/test////', Uri::sanitize("/v8/test/{$oid}/{$oid}/{$oid}/")); } + + public function testAddsInitialSlash(): void + { + self::assertSame('/v1/', Uri::sanitize('/v1/')); + self::assertSame('/v1', Uri::sanitize('v1')); + self::assertSame('/v1/', Uri::sanitize('v1/')); + self::assertSame('/v1/test/', Uri::sanitize('/v1/test/')); + self::assertSame('/v1/test', Uri::sanitize('v1/test')); + self::assertSame('/v1/test/', Uri::sanitize('v1/test/')); + } } From c48ac23b23406d84613b9a934eedac907ac466ee Mon Sep 17 00:00:00 2001 From: celosauro <52496242+celosauro@users.noreply.github.com> Date: Mon, 2 Oct 2023 10:58:42 -0300 Subject: [PATCH 14/38] Use only the path at the URI label (#6) Update HttpClientMetricAspect.php --- src/Aspect/HttpClientMetricAspect.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Aspect/HttpClientMetricAspect.php b/src/Aspect/HttpClientMetricAspect.php index 0a66700a3..edac89074 100644 --- a/src/Aspect/HttpClientMetricAspect.php +++ b/src/Aspect/HttpClientMetricAspect.php @@ -45,7 +45,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) $host = $base_uri === null ? (parse_url($uri, PHP_URL_HOST) ?? '') : $base_uri->getHost(); $labels = [ - 'uri' => SupportUri::sanitize($uri), + 'uri' => SupportUri::sanitize(parse_url($uri, PHP_URL_PATH)), 'host' => $host, 'method' => $method, 'http_status_code' => '200', From 6804d04cc74d7cc1a915a736e8f65de16517aba7 Mon Sep 17 00:00:00 2001 From: Vitor Rodrigues Date: Fri, 13 Oct 2023 19:03:05 -0300 Subject: [PATCH 15/38] fix/complying with the psr-4 standard (#7) --- tests/Cases/UriTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index 5f252cad4..b1fe4d1ea 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -9,7 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ -namespace HyperfTest\Metric\Support; +namespace HyperfTest\Metric\Cases; use Hyperf\Metric\Support\Uri; use PHPUnit\Framework\TestCase; From 25e256777f6000c591eb04f87028023d27053340 Mon Sep 17 00:00:00 2001 From: Lucas Angeli <81924557+lucas-angeli-gimenes@users.noreply.github.com> Date: Wed, 8 Nov 2023 18:19:03 -0300 Subject: [PATCH 16/38] Assumes the root path (/) for urls without declared paths (#8) --- src/Aspect/HttpClientMetricAspect.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Aspect/HttpClientMetricAspect.php b/src/Aspect/HttpClientMetricAspect.php index edac89074..4e002878e 100644 --- a/src/Aspect/HttpClientMetricAspect.php +++ b/src/Aspect/HttpClientMetricAspect.php @@ -45,7 +45,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) $host = $base_uri === null ? (parse_url($uri, PHP_URL_HOST) ?? '') : $base_uri->getHost(); $labels = [ - 'uri' => SupportUri::sanitize(parse_url($uri, PHP_URL_PATH)), + 'uri' => SupportUri::sanitize(parse_url($uri, PHP_URL_PATH) ?? '/'), 'host' => $host, 'method' => $method, 'http_status_code' => '200', From 6c2980c32c4b094b4d2ac2491787d3ba8953b4ca Mon Sep 17 00:00:00 2001 From: Lucas Angeli <81924557+lucas-angeli-gimenes@users.noreply.github.com> Date: Wed, 10 Jan 2024 14:15:19 -0300 Subject: [PATCH 17/38] Added: Sql Sanitization (#10) --- src/ConfigProvider.php | 3 ++ src/Contract/SqlSanitizerInterface.php | 17 ++++++ .../DbQueryExecutedMetricListener.php | 7 ++- src/Support/SqlSanitizer.php | 29 +++++++++++ tests/Cases/SqlSanitizerTest.php | 52 +++++++++++++++++++ 5 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 src/Contract/SqlSanitizerInterface.php create mode 100644 src/Support/SqlSanitizer.php create mode 100644 tests/Cases/SqlSanitizerTest.php diff --git a/src/ConfigProvider.php b/src/ConfigProvider.php index e00b8b444..89001cae9 100644 --- a/src/ConfigProvider.php +++ b/src/ConfigProvider.php @@ -19,6 +19,7 @@ use Hyperf\Metric\Aspect\MongoCollectionMetricAspect; use Hyperf\Metric\Aspect\RedisMetricAspect; use Hyperf\Metric\Contract\MetricFactoryInterface; +use Hyperf\Metric\Contract\SqlSanitizerInterface; use Hyperf\Metric\Listener\DbQueryExecutedMetricListener; use Hyperf\Metric\Listener\OnBeforeHandle; use Hyperf\Metric\Listener\OnCoroutineServerStart; @@ -27,6 +28,7 @@ use Hyperf\Metric\Listener\OnWorkerStart; use Hyperf\Metric\Middleware\MetricMiddleware; use Hyperf\Metric\Process\MetricProcess; +use Hyperf\Metric\Support\SqlSanitizer; use InfluxDB\Driver\DriverInterface; use InfluxDB\Driver\Guzzle; use Prometheus\Storage\Adapter; @@ -42,6 +44,7 @@ public function __invoke(): array Adapter::class => InMemory::class, Connection::class => StatsDConnection::class, DriverInterface::class => Guzzle::class, + SqlSanitizerInterface::class => SqlSanitizer::class, ], 'aspects' => [ CounterAnnotationAspect::class, diff --git a/src/Contract/SqlSanitizerInterface.php b/src/Contract/SqlSanitizerInterface.php new file mode 100644 index 000000000..804d7696d --- /dev/null +++ b/src/Contract/SqlSanitizerInterface.php @@ -0,0 +1,17 @@ + 'mysql', - 'operation' => $event->sql, + 'operation' => $this->sqlSanitizer->sanitize($event->sql), ]; $histogram = make(MetricFactoryInterface::class) diff --git a/src/Support/SqlSanitizer.php b/src/Support/SqlSanitizer.php new file mode 100644 index 000000000..783133a10 --- /dev/null +++ b/src/Support/SqlSanitizer.php @@ -0,0 +1,29 @@ +sanitize('select * from `users` where `id` in (200093484)') + ); + + self::assertSame( + 'select * from `bin_codes` where `bin_codes`.`bin` in (?)', + $sanitizer->sanitize('select * from `bin_codes` where `bin_codes`.`bin` in (?)') + ); + + self::assertSame( + 'select * from `card_tokens` where (`card_id` = ?)', + $sanitizer->sanitize('select * from `card_tokens` where (`card_id` = ?)') + ); + + self::assertSame( + 'select * from `cards` where `owner_id` not in (?, ?)', + $sanitizer->sanitize('select * from `cards` where `owner_id` not in (1260361, 903023958)') + ); + + self::assertSame( + 'select * from `cards` where `owner_id` not in (?, ?, ?)', + $sanitizer->sanitize('select * from `cards` where `owner_id` not in (1260361, 903023958, 880427302)') + ); + } +} From c92e9fe37c0b808d500cb74328b1cfca86934afd Mon Sep 17 00:00:00 2001 From: Lucas Lima <66659328+lukkas-lukkas@users.noreply.github.com> Date: Mon, 22 Jan 2024 10:37:43 -0300 Subject: [PATCH 18/38] Add connect exceptions on HTTP client metrics (#9) * feat identified connect exception on http promise rejection * use interface instead exception * abstract catch of exception * add specific message on errors --- src/Aspect/HttpClientMetricAspect.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Aspect/HttpClientMetricAspect.php b/src/Aspect/HttpClientMetricAspect.php index 4e002878e..ec877a2c2 100644 --- a/src/Aspect/HttpClientMetricAspect.php +++ b/src/Aspect/HttpClientMetricAspect.php @@ -13,6 +13,7 @@ use GuzzleHttp\Client; use GuzzleHttp\Exception\RequestException; +use GuzzleHttp\Exception\TransferException; use GuzzleHttp\Promise\Create; use GuzzleHttp\Promise\PromiseInterface; use GuzzleHttp\Psr7\Uri; @@ -49,6 +50,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) 'host' => $host, 'method' => $method, 'http_status_code' => '200', + 'message' => 'success', ]; $timer = new Timer('http_client_requests', $labels); @@ -74,8 +76,15 @@ private function onFullFilled(Timer $timer, array $labels): callable private function onRejected(Timer $timer, array $labels): callable { - return function (RequestException $exception) use ($timer, $labels) { - $labels['http_status_code'] = (string) $exception->getResponse()->getStatusCode(); + return function (TransferException $exception) use ($timer, $labels) { + $labels['http_status_code'] = ''; + $labels['message'] = 'connect_error'; + + if ($exception instanceof RequestException) { + $labels['http_status_code'] = (string) $exception->getResponse()->getStatusCode(); + $labels['message'] = 'request_error'; + } + $timer->end($labels); return Create::rejectionFor($exception); From df8f474717115fe60fc12dc5a174c36178022873 Mon Sep 17 00:00:00 2001 From: Carlos Montezano Lopes Date: Tue, 30 Jan 2024 15:28:47 -0300 Subject: [PATCH 19/38] chore(deps): Bump hyper/metric 3.1 (#11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [3.1]Bumps dependencies (#5796) Co-authored-by: 李铭昕 <715557344@qq.com> * Upgrade hyperf packages to version `~3.1.0` (#5801) * Bumps `phpunit` to `10.x` (#5802) Co-authored-by: 李铭昕 <715557344@qq.com> * Remove redundant `setAccessible` methods (#5811) * Remove deprecated codes (#5812) * Removed the deprecated code for metric. (#5847) * Use `StrCache` instead of `Str` in special cases. (#5866) * [feat] Support buffer mechanism in standalone process of metric (#6030) Co-authored-by: 李铭昕 <715557344@qq.com> * Fix the bug that cannot stop the command from terminating gracefully (#6090) * Upgrade actions/checkout to v4 (#6159) * Adds `metric.enable_command_metric` switch (#6272) * Changed the `branch-alias` of all components to `3.1-dev`. (#6320) * update dependencies * Remove unused import --------- Co-authored-by: Deeka Wong Co-authored-by: 李铭昕 <715557344@qq.com> Co-authored-by: yansongda Co-authored-by: Albert Chen --- composer.json | 23 +- composer.lock | 2852 +++++++++-------- publish/metric.php | 4 + src/Adapter/InfluxDB/MetricFactory.php | 4 +- src/Adapter/Prometheus/MetricFactory.php | 7 +- src/Adapter/Prometheus/Redis.php | 22 +- .../Prometheus/RedisStorageFactory.php | 3 +- src/Adapter/RemoteProxy/Counter.php | 11 +- src/Adapter/RemoteProxy/Gauge.php | 17 +- src/Adapter/RemoteProxy/Histogram.php | 11 +- src/Adapter/RemoteProxy/MetricCollector.php | 49 + .../RemoteProxy/MetricCollectorFactory.php | 34 + src/ConfigProvider.php | 5 + src/Contract/MetricCollectorInterface.php | 19 + src/Listener/MetricBufferWatcher.php | 80 + src/Listener/OnBeforeHandle.php | 4 + src/Listener/OnPipeMessage.php | 70 +- .../Prometheus/RedisStorageFactoryTest.php | 42 +- tests/Adapter/Prometheus/RedisTest.php | 19 +- .../RemoteProxy/MetricCollectorTest.php | 81 + tests/Cases/MetricFactoryPickerTest.php | 2 + tests/Cases/MetricFactoryTest.php | 8 +- tests/Cases/OnWorkerStartTest.php | 2 + tests/Cases/TimerTest.php | 2 + 24 files changed, 2011 insertions(+), 1360 deletions(-) create mode 100644 src/Adapter/RemoteProxy/MetricCollector.php create mode 100644 src/Adapter/RemoteProxy/MetricCollectorFactory.php create mode 100644 src/Contract/MetricCollectorInterface.php create mode 100644 src/Listener/MetricBufferWatcher.php create mode 100644 tests/Adapter/RemoteProxy/MetricCollectorTest.php diff --git a/composer.json b/composer.json index 10930b0fd..1ee495858 100644 --- a/composer.json +++ b/composer.json @@ -11,15 +11,15 @@ ], "description": "Drop-in replacement for the Hyperf Metric component.", "require": { - "php": ">=8.0", - "hyperf/codec": "^3.0", - "hyperf/contract": "^3.0", - "hyperf/engine": "^2.9", - "hyperf/guzzle": "^3.0", - "hyperf/support": "^3.0", - "hyperf/utils": "^3.0", + "php": ">=8.1", + "hyperf/codec": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/engine": "^2.3", + "hyperf/guzzle": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/utils": "~3.1.0", + "psr/container": "^1.0|^2.0", "promphp/prometheus_client_php": "^2.7", - "psr/container": "^2.0", "psr/event-dispatcher": "^1.0", "psr/http-message": "^1.0|^2.0" }, @@ -44,13 +44,14 @@ "swoole/ide-helper": "^5.0" }, "suggest": { - "slickdeals/statsd": "Required to use StatdD driver.", "influxdb/influxdb-php": "Required to use InfluxDB driver.", "hyperf/di": "Required to use annotations.", "hyperf/event": "Required to use listeners for default metrics.", "hyperf/process": "Required to use standalone process, or you have to roll your own", "hyperf/retry": "Required to use back-off retry implementation.", - "hyperf/http-server": "Required to capture routes in middleware." + "hyperf/http-server": "Required to capture routes in middleware.", + "promphp/prometheus_client_php": "Required to use Prometheus driver.(2.2.*)", + "slickdeals/statsd": "Required to use StatdD driver." }, "autoload": { "psr-4": { @@ -80,7 +81,7 @@ }, "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\Metric\\ConfigProvider" diff --git a/composer.lock b/composer.lock index 1ebba08ca..7d95ba90e 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": "445f36627f77b0c7058e7f6a556487e8", + "content-hash": "60d230790b3107f97e331017e86b7837", "packages": [ { "name": "doctrine/inflector", - "version": "2.0.8", + "version": "2.0.9", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff" + "reference": "2930cd5ef353871c821d5c43ed030d39ac8cfe65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff", - "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/2930cd5ef353871c821d5c43ed030d39ac8cfe65", + "reference": "2930cd5ef353871c821d5c43ed030d39ac8cfe65", "shasum": "" }, "require": { @@ -79,7 +79,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.8" + "source": "https://github.com/doctrine/inflector/tree/2.0.9" }, "funding": [ { @@ -95,26 +95,26 @@ "type": "tidelift" } ], - "time": "2023-06-16T13:40:37+00:00" + "time": "2024-01-15T18:05:13+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.7.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5" + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5", - "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -123,11 +123,11 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -205,7 +205,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.7.0" + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" }, "funding": [ { @@ -221,28 +221,28 @@ "type": "tidelift" } ], - "time": "2023-05-21T14:04:53+00:00" + "time": "2023-12-03T20:35:24+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.0", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6" + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/3a494dc7dc1d7d12e511890177ae2d0e6c107da6", - "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "type": "library", "extra": { @@ -288,7 +288,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.0" + "source": "https://github.com/guzzle/promises/tree/2.0.2" }, "funding": [ { @@ -304,20 +304,20 @@ "type": "tidelift" } ], - "time": "2023-05-21T13:50:22+00:00" + "time": "2023-12-03T20:19:20+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.5.0", + "version": "2.6.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", "shasum": "" }, "require": { @@ -331,9 +331,9 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -404,7 +404,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.5.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.2" }, "funding": [ { @@ -420,27 +420,27 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:11:26+00:00" + "time": "2023-12-03T20:05:35+00:00" }, { "name": "hyperf/code-parser", - "version": "v3.0.18", + "version": "v3.1.4", "source": { "type": "git", "url": "https://github.com/hyperf/code-parser.git", - "reference": "f1812421150d7ef95067eb6657c6f84514b6dfea" + "reference": "e36ac337cf7852aaa817db61ade0941d8826f0d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/code-parser/zipball/f1812421150d7ef95067eb6657c6f84514b6dfea", - "reference": "f1812421150d7ef95067eb6657c6f84514b6dfea", + "url": "https://api.github.com/repos/hyperf/code-parser/zipball/e36ac337cf7852aaa817db61ade0941d8826f0d8", + "reference": "e36ac337cf7852aaa817db61ade0941d8826f0d8", "shasum": "" }, "require": { - "hyperf/collection": "~3.0.0", - "hyperf/stringable": "~3.0.0", - "hyperf/support": "~3.0.0", - "php": ">=8.0" + "hyperf/collection": "~3.1.0", + "hyperf/stringable": "~3.1.0", + "hyperf/support": "~3.1.0", + "php": ">=8.1" }, "suggest": { "jean85/pretty-package-versions": "Required to use PrettyVersions. (^1.2|^2.0)", @@ -449,7 +449,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -475,27 +475,37 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-04-26T03:02:31+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-12-28T08:46:40+00:00" }, { "name": "hyperf/codec", - "version": "v3.0.30", + "version": "v3.1.4", "source": { "type": "git", "url": "https://github.com/hyperf/codec.git", - "reference": "30b170b59770c7f92ae845fca777b8ea8a953599" + "reference": "764e81cf3ba358813ea8e058bf2dabd16058cb2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/codec/zipball/30b170b59770c7f92ae845fca777b8ea8a953599", - "reference": "30b170b59770c7f92ae845fca777b8ea8a953599", + "url": "https://api.github.com/repos/hyperf/codec/zipball/764e81cf3ba358813ea8e058bf2dabd16058cb2d", + "reference": "764e81cf3ba358813ea8e058bf2dabd16058cb2d", "shasum": "" }, "require": { "ext-json": "*", "ext-xml": "*", - "hyperf/contract": "~3.0.0", - "php": ">=8.0" + "hyperf/contract": "~3.1.0", + "php": ">=8.1" }, "suggest": { "ext-igbinary": "Required to use IgbinarySerializerPacker." @@ -503,7 +513,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -529,31 +539,41 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-07-18T12:10:42+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-12-25T06:07:48+00:00" }, { "name": "hyperf/collection", - "version": "v3.0.29", + "version": "v3.1.7", "source": { "type": "git", "url": "https://github.com/hyperf/collection.git", - "reference": "c2e3f919f8c445da69e0e0c10920c6fc0754b9ad" + "reference": "40e25ca34f798e173a1f9a6871d56a6abae43dbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/collection/zipball/c2e3f919f8c445da69e0e0c10920c6fc0754b9ad", - "reference": "c2e3f919f8c445da69e0e0c10920c6fc0754b9ad", + "url": "https://api.github.com/repos/hyperf/collection/zipball/40e25ca34f798e173a1f9a6871d56a6abae43dbb", + "reference": "40e25ca34f798e173a1f9a6871d56a6abae43dbb", "shasum": "" }, "require": { - "hyperf/contract": "~3.0.0", - "hyperf/macroable": "~3.0.0", - "php": ">=7.4" + "hyperf/contract": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -582,29 +602,39 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-07-14T03:41:52+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-01-26T01:52:03+00:00" }, { "name": "hyperf/conditionable", - "version": "v3.0.0", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/conditionable.git", - "reference": "4222cdc512e9e48e4375a480161c6365276ff803" + "reference": "18da1405ae39a775bd3fae8cec98841eaa22f013" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/conditionable/zipball/4222cdc512e9e48e4375a480161c6365276ff803", - "reference": "4222cdc512e9e48e4375a480161c6365276ff803", + "url": "https://api.github.com/repos/hyperf/conditionable/zipball/18da1405ae39a775bd3fae8cec98841eaa22f013", + "reference": "18da1405ae39a775bd3fae8cec98841eaa22f013", "shasum": "" }, "require": { - "php": ">=7.4" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -630,30 +660,43 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-03-28T15:02:39+00:00" + "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/context", - "version": "v3.0.18", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/context.git", - "reference": "8cff8cc1c70c1a8c390a13b97986ddd5e47fa2ec" + "reference": "8307d6c924ed67c7abd47874ec14f0e2e3e4b732" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/context/zipball/8cff8cc1c70c1a8c390a13b97986ddd5e47fa2ec", - "reference": "8cff8cc1c70c1a8c390a13b97986ddd5e47fa2ec", + "url": "https://api.github.com/repos/hyperf/context/zipball/8307d6c924ed67c7abd47874ec14f0e2e3e4b732", + "reference": "8307d6c924ed67c7abd47874ec14f0e2e3e4b732", "shasum": "" }, "require": { - "hyperf/engine": "^1.2|^2.0", - "php": ">=8.0" + "hyperf/engine": "^2.0", + "php": ">=8.1" + }, + "suggest": { + "swow/psr7-plus": "Required to use RequestContext and ResponseContext" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -679,29 +722,39 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-04-26T03:02:31+00:00" + "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/contract", - "version": "v3.0.10", + "version": "v3.1.2", "source": { "type": "git", "url": "https://github.com/hyperf/contract.git", - "reference": "93488df36b1c4e2fc16c630fb77c110bafffb141" + "reference": "f5379df6df65363d645506f373888372135ac0c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/contract/zipball/93488df36b1c4e2fc16c630fb77c110bafffb141", - "reference": "93488df36b1c4e2fc16c630fb77c110bafffb141", + "url": "https://api.github.com/repos/hyperf/contract/zipball/f5379df6df65363d645506f373888372135ac0c6", + "reference": "f5379df6df65363d645506f373888372135ac0c6", "shasum": "" }, "require": { - "php": ">=8.0" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -726,30 +779,40 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-03-10T04:21:37+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-12-11T03:14:01+00:00" }, { "name": "hyperf/coordinator", - "version": "v3.0.22", + "version": "v3.1.7", "source": { "type": "git", "url": "https://github.com/hyperf/coordinator.git", - "reference": "a49c2d22995b4115e8b21f1de58b992047c4d0fd" + "reference": "0b812abc6253dec888f5484e1bbd87d7e206b8c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/coordinator/zipball/a49c2d22995b4115e8b21f1de58b992047c4d0fd", - "reference": "a49c2d22995b4115e8b21f1de58b992047c4d0fd", + "url": "https://api.github.com/repos/hyperf/coordinator/zipball/0b812abc6253dec888f5484e1bbd87d7e206b8c3", + "reference": "0b812abc6253dec888f5484e1bbd87d7e206b8c3", "shasum": "" }, "require": { - "hyperf/engine": "^1.2|^2.0", - "php": ">=8.0" + "hyperf/engine": "^2.0", + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -775,32 +838,42 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-05-26T13:44:16+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-01-22T07:40:06+00:00" }, { "name": "hyperf/coroutine", - "version": "v3.0.16", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/hyperf/coroutine.git", - "reference": "4944ce69d5f35407e5dbcf7e9991f1db3366f254" + "reference": "cd5bad67724c5c7a7ad749d8e9eb045470488d75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/coroutine/zipball/4944ce69d5f35407e5dbcf7e9991f1db3366f254", - "reference": "4944ce69d5f35407e5dbcf7e9991f1db3366f254", + "url": "https://api.github.com/repos/hyperf/coroutine/zipball/cd5bad67724c5c7a7ad749d8e9eb045470488d75", + "reference": "cd5bad67724c5c7a7ad749d8e9eb045470488d75", "shasum": "" }, "require": { - "hyperf/context": "~3.0.0", - "hyperf/contract": "~3.0.0", - "hyperf/engine": "^1.2|^2.0", - "php": ">=8.0" + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/engine": "^2.0", + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -829,20 +902,30 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-04-12T05:34:25+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-12-01T06:59:45+00:00" }, { "name": "hyperf/engine", - "version": "v2.10.0", + "version": "v2.10.4", "source": { "type": "git", "url": "https://github.com/hyperf/engine.git", - "reference": "9b27b29041403b8ee397ffe1e5254816e18cb5b9" + "reference": "34ba1825f5b596c677d027e60ec4e2b75c65d09e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/engine/zipball/9b27b29041403b8ee397ffe1e5254816e18cb5b9", - "reference": "9b27b29041403b8ee397ffe1e5254816e18cb5b9", + "url": "https://api.github.com/repos/hyperf/engine/zipball/34ba1825f5b596c677d027e60ec4e2b75c65d09e", + "reference": "34ba1825f5b596c677d027e60ec4e2b75c65d09e", "shasum": "" }, "require": { @@ -897,22 +980,32 @@ ], "support": { "issues": "https://github.com/hyperf/engine/issues", - "source": "https://github.com/hyperf/engine/tree/v2.10.0" + "source": "https://github.com/hyperf/engine/tree/v2.10.4" }, - "time": "2023-07-14T02:28:58+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": "" }, "require": { @@ -954,27 +1047,37 @@ ], "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/guzzle", - "version": "v3.0.24", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/guzzle.git", - "reference": "7791900eed289bd6584e2e52d2ec02b47f85740c" + "reference": "df01c9b6ba645347a05113c6bcac2314145e611c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/guzzle/zipball/7791900eed289bd6584e2e52d2ec02b47f85740c", - "reference": "7791900eed289bd6584e2e52d2ec02b47f85740c", + "url": "https://api.github.com/repos/hyperf/guzzle/zipball/df01c9b6ba645347a05113c6bcac2314145e611c", + "reference": "df01c9b6ba645347a05113c6bcac2314145e611c", "shasum": "" }, "require": { "guzzlehttp/guzzle": "^6.3|^7.0", - "php": ">=8.0", + "php": ">=8.1", "psr/container": "^1.0|^2.0", "psr/http-message": "^1.0|^2.0" }, @@ -985,7 +1088,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\Guzzle\\ConfigProvider" @@ -1009,31 +1112,41 @@ ], "support": { "issues": "https://github.com/hyperf/guzzle/issues", - "source": "https://github.com/hyperf/guzzle/tree/v3.0.24" + "source": "https://github.com/hyperf/guzzle/tree/v3.1.0" }, - "time": "2023-06-04T02:14:26+00:00" + "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/macroable", - "version": "v3.0.0", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/macroable.git", - "reference": "822de69ba0c75aa9767a9cea487b84bf31d5240a" + "reference": "de5b07be74d666f04ecef4ce5ee6ceb97d846cfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/macroable/zipball/822de69ba0c75aa9767a9cea487b84bf31d5240a", - "reference": "822de69ba0c75aa9767a9cea487b84bf31d5240a", + "url": "https://api.github.com/repos/hyperf/macroable/zipball/de5b07be74d666f04ecef4ce5ee6ceb97d846cfa", + "reference": "de5b07be74d666f04ecef4ce5ee6ceb97d846cfa", "shasum": "" }, "require": { - "php": ">=7.4" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -1059,25 +1172,35 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2022-11-01T02:50:54+00:00" + "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/serializer", - "version": "v3.0.0", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/serializer.git", - "reference": "c4efedaa072c5ffe196e95e0c74a9d90fd1e4811" + "reference": "8fae2fa4342cbefead70b54e42e11c228d8be94b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/serializer/zipball/c4efedaa072c5ffe196e95e0c74a9d90fd1e4811", - "reference": "c4efedaa072c5ffe196e95e0c74a9d90fd1e4811", + "url": "https://api.github.com/repos/hyperf/serializer/zipball/8fae2fa4342cbefead70b54e42e11c228d8be94b", + "reference": "8fae2fa4342cbefead70b54e42e11c228d8be94b", "shasum": "" }, "require": { - "hyperf/contract": "~3.0.0", - "php": ">=8.0" + "hyperf/contract": "~3.1.0", + "php": ">=8.1" }, "suggest": { "hyperf/di": "Required to use ExceptionNormalizer", @@ -1087,7 +1210,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\Serializer\\ConfigProvider" @@ -1116,28 +1239,39 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-04-24T07:07:56+00:00" + "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/stringable", - "version": "v3.0.31", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/stringable.git", - "reference": "1bcea1466a87267c780cd67df05de0127c237dcd" + "reference": "10465337a7bbf528ab28bd84330d795a5b3e06bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/stringable/zipball/1bcea1466a87267c780cd67df05de0127c237dcd", - "reference": "1bcea1466a87267c780cd67df05de0127c237dcd", + "url": "https://api.github.com/repos/hyperf/stringable/zipball/10465337a7bbf528ab28bd84330d795a5b3e06bd", + "reference": "10465337a7bbf528ab28bd84330d795a5b3e06bd", "shasum": "" }, "require": { - "hyperf/collection": "~3.0.0", - "hyperf/conditionable": "~3.0.0", - "hyperf/macroable": "~3.0.0", - "hyperf/tappable": "~3.0.0", - "php": ">=8.0" + "ext-mbstring": "*", + "hyperf/collection": "~3.1.0", + "hyperf/conditionable": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "hyperf/tappable": "~3.1.0", + "php": ">=8.1" }, "suggest": { "doctrine/inflector": "Required to use plural and singular methods.(^2.0|^3.0)", @@ -1147,7 +1281,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -1176,30 +1310,40 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-07-25T12:44:39+00:00" + "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/support", - "version": "v3.0.24", + "version": "v3.1.7", "source": { "type": "git", "url": "https://github.com/hyperf/support.git", - "reference": "576838e7185bf8eb749920a3285b399cb9c3a24b" + "reference": "5f3bb356632089f92feefb7dd7202c22444404e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/support/zipball/576838e7185bf8eb749920a3285b399cb9c3a24b", - "reference": "576838e7185bf8eb749920a3285b399cb9c3a24b", + "url": "https://api.github.com/repos/hyperf/support/zipball/5f3bb356632089f92feefb7dd7202c22444404e5", + "reference": "5f3bb356632089f92feefb7dd7202c22444404e5", "shasum": "" }, "require": { - "hyperf/collection": "~3.0.0", - "hyperf/context": "~3.0.0", - "hyperf/contract": "~3.0.0", - "hyperf/coroutine": "~3.0.0", - "hyperf/macroable": "~3.0.0", - "hyperf/stringable": "~3.0.0", - "php": ">=8.0" + "hyperf/collection": "~3.1.0", + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "hyperf/stringable": "~3.1.0", + "php": ">=8.1" }, "suggest": { "nesbot/carbon": "Use Carbon as DateTime object.(^2.0)" @@ -1207,7 +1351,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -1236,29 +1380,39 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-06-08T06:55:09+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-01-22T08:45:43+00:00" }, { "name": "hyperf/tappable", - "version": "v3.0.0", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/tappable.git", - "reference": "4f90b9026a5bdce5b3e6be29a2ab7a86c54f372a" + "reference": "f640e37006dad09ca6f2b9a4cf047907aaebf002" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/tappable/zipball/4f90b9026a5bdce5b3e6be29a2ab7a86c54f372a", - "reference": "4f90b9026a5bdce5b3e6be29a2ab7a86c54f372a", + "url": "https://api.github.com/repos/hyperf/tappable/zipball/f640e37006dad09ca6f2b9a4cf047907aaebf002", + "reference": "f640e37006dad09ca6f2b9a4cf047907aaebf002", "shasum": "" }, "require": { - "php": ">=7.4" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -1287,60 +1441,52 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-03-28T15:02:39+00:00" + "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/utils", - "version": "v3.0.18", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/utils.git", - "reference": "2e59cef3dd562053fe7c9b2a41e7243b4ee23bd6" + "reference": "10522904195eb5af9090bbd072589fb387c91041" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/utils/zipball/2e59cef3dd562053fe7c9b2a41e7243b4ee23bd6", - "reference": "2e59cef3dd562053fe7c9b2a41e7243b4ee23bd6", + "url": "https://api.github.com/repos/hyperf/utils/zipball/10522904195eb5af9090bbd072589fb387c91041", + "reference": "10522904195eb5af9090bbd072589fb387c91041", "shasum": "" }, "require": { "doctrine/inflector": "^2.0", - "hyperf/code-parser": "~3.0.0", - "hyperf/codec": "~3.0.0", - "hyperf/collection": "~3.0.0", - "hyperf/context": "~3.0.0", - "hyperf/contract": "~3.0.0", - "hyperf/coordinator": "~3.0.0", - "hyperf/coroutine": "~3.0.0", - "hyperf/engine": "^1.2|^2.0", - "hyperf/macroable": "~3.0.0", - "hyperf/serializer": "~3.0.0", - "hyperf/stringable": "~3.0.0", - "hyperf/support": "~3.0.0", - "php": ">=7.2" - }, - "suggest": { - "ext-swoole": "Required to use methods related to swoole (>=4.5).", - "hyperf/di": "Required to use ExceptionNormalizer", - "nikic/php-parser": "Required to use PhpParser. (^4.0)", - "ramsey/uuid": "Required to use uuid and orderedUuid methods", - "symfony/property-access": "Required to use SymfonyNormalizer (^5.0|^6.0)", - "symfony/serializer": "Required to use SymfonyNormalizer (^5.0|^6.0)", - "symfony/uid": "Required to use ulid method", - "symfony/var-dumper": "Required to use the dd function (^5.0|^6.0)." + "hyperf/code-parser": "~3.1.0", + "hyperf/codec": "~3.1.0", + "hyperf/collection": "~3.1.0", + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/coordinator": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "hyperf/engine": "^2.0", + "hyperf/macroable": "~3.1.0", + "hyperf/serializer": "~3.1.0", + "hyperf/stringable": "~3.1.0", + "hyperf/support": "~3.1.0", + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "files": [ - "src/Functions.php" - ], - "psr-4": { - "Hyperf\\Utils\\": "src/" + "dev-master": "3.1-dev" } }, "notification-url": "https://packagist.org/downloads/", @@ -1361,20 +1507,30 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-04-26T03:02:31+00:00" + "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": "promphp/prometheus_client_php", - "version": "v2.7.1", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/PromPHP/prometheus_client_php.git", - "reference": "82e42b5a491ee94127110548ee835052b9765a78" + "reference": "ad2a85fa52a7b9f6e6d84095cd34d1cb6f0a06bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PromPHP/prometheus_client_php/zipball/82e42b5a491ee94127110548ee835052b9765a78", - "reference": "82e42b5a491ee94127110548ee835052b9765a78", + "url": "https://api.github.com/repos/PromPHP/prometheus_client_php/zipball/ad2a85fa52a7b9f6e6d84095cd34d1cb6f0a06bc", + "reference": "ad2a85fa52a7b9f6e6d84095cd34d1cb6f0a06bc", "shasum": "" }, "require": { @@ -1426,9 +1582,9 @@ "description": "Prometheus instrumentation library for PHP applications.", "support": { "issues": "https://github.com/PromPHP/prometheus_client_php/issues", - "source": "https://github.com/PromPHP/prometheus_client_php/tree/v2.7.1" + "source": "https://github.com/PromPHP/prometheus_client_php/tree/v2.9.0" }, - "time": "2023-04-24T18:11:52+00:00" + "time": "2023-12-20T06:22:58+00:00" }, { "name": "psr/container", @@ -1535,16 +1691,16 @@ }, { "name": "psr/http-client", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { @@ -1581,9 +1737,9 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/1.0.2" + "source": "https://github.com/php-fig/http-client" }, - "time": "2023-04-10T20:12:12+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", @@ -1739,7 +1895,7 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", @@ -1786,7 +1942,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" }, "funding": [ { @@ -1807,17 +1963,86 @@ ], "packages-dev": [ { - "name": "composer/pcre", + "name": "carbonphp/carbon-doctrine-types", "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "a31d3358a2a5d6ae947df1691d1f321418a5f3d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/a31d3358a2a5d6ae947df1691d1f321418a5f3d5", + "reference": "a31d3358a2a5d6ae947df1691d1f321418a5f3d5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.1.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2023-12-10T15:33:53+00:00" + }, + { + "name": "composer/pcre", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", - "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", "shasum": "" }, "require": { @@ -1859,7 +2084,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.0" + "source": "https://github.com/composer/pcre/tree/3.1.1" }, "funding": [ { @@ -1875,20 +2100,20 @@ "type": "tidelift" } ], - "time": "2022-11-17T09:50:14+00:00" + "time": "2023-10-11T07:11:09+00:00" }, { "name": "composer/semver", - "version": "3.3.2", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", "shasum": "" }, "require": { @@ -1938,9 +2163,9 @@ "versioning" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/composer/semver/tree/3.4.0" }, "funding": [ { @@ -1956,7 +2181,7 @@ "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2023-08-31T09:50:34+00:00" }, { "name": "composer/xdebug-handler", @@ -2025,112 +2250,36 @@ "time": "2022-02-25T21:32:43+00:00" }, { - "name": "doctrine/annotations", - "version": "2.0.1", + "name": "doctrine/instantiator", + "version": "1.5.0", "source": { "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" + "url": "https://github.com/doctrine/instantiator.git", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", "shasum": "" }, "require": { - "doctrine/lexer": "^2 || ^3", - "ext-tokenizer": "*", - "php": "^7.2 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/cache": "^2.0", - "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.8.0", + "doctrine/coding-standard": "^9 || ^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^5.4 || ^6", - "vimeo/psalm": "^4.10" - }, - "suggest": { - "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + "vimeo/psalm": "^4.30 || ^5.4" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/2.0.1" - }, - "time": "2023-02-02T22:02:53+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.5.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9 || ^11", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.30 || ^5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2170,83 +2319,6 @@ ], "time": "2022-12-30T00:15:36+00:00" }, - { - "name": "doctrine/lexer", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "84a527db05647743d50373e0ec53a152f2cde568" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", - "reference": "84a527db05647743d50373e0ec53a152f2cde568", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^9.5", - "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/3.0.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2022-12-15T16:57:16+00:00" - }, { "name": "fig/http-message-util", "version": "1.1.5", @@ -2305,54 +2377,48 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.22.0", + "version": "v3.48.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "92b019f6c8d79aa26349d0db7671d37440dc0ff3" + "reference": "a92472c6fb66349de25211f31c77eceae3df024e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/92b019f6c8d79aa26349d0db7671d37440dc0ff3", - "reference": "92b019f6c8d79aa26349d0db7671d37440dc0ff3", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a92472c6fb66349de25211f31c77eceae3df024e", + "reference": "a92472c6fb66349de25211f31c77eceae3df024e", "shasum": "" }, "require": { - "composer/semver": "^3.3", + "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.3", - "doctrine/annotations": "^2", - "doctrine/lexer": "^2 || ^3", + "ext-filter": "*", "ext-json": "*", "ext-tokenizer": "*", "php": "^7.4 || ^8.0", "sebastian/diff": "^4.0 || ^5.0", - "symfony/console": "^5.4 || ^6.0", - "symfony/event-dispatcher": "^5.4 || ^6.0", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/options-resolver": "^5.4 || ^6.0", - "symfony/polyfill-mbstring": "^1.27", - "symfony/polyfill-php80": "^1.27", - "symfony/polyfill-php81": "^1.27", - "symfony/process": "^5.4 || ^6.0", - "symfony/stopwatch": "^5.4 || ^6.0" + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-mbstring": "^1.28", + "symfony/polyfill-php80": "^1.28", + "symfony/polyfill-php81": "^1.28", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { "facile-it/paraunit": "^1.3 || ^2.0", "justinrainbow/json-schema": "^5.2", - "keradus/cli-executor": "^2.0", + "keradus/cli-executor": "^2.1", "mikey179/vfsstream": "^1.6.11", - "php-coveralls/php-coveralls": "^2.5.3", + "php-coveralls/php-coveralls": "^2.7", "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", - "phpspec/prophecy": "^1.16", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", - "phpunitgoodpractices/polyfill": "^1.6", - "phpunitgoodpractices/traits": "^1.9.2", - "symfony/phpunit-bridge": "^6.2.3", - "symfony/yaml": "^5.4 || ^6.0" + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", + "phpunit/phpunit": "^9.6 || ^10.5.5", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -2390,7 +2456,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.22.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.48.0" }, "funding": [ { @@ -2398,28 +2464,28 @@ "type": "github" } ], - "time": "2023-07-16T23:08:06+00:00" + "time": "2024-01-19T21:44:39+00:00" }, { "name": "graham-campbell/result-type", - "version": "v1.1.1", + "version": "v1.1.2", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831" + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", - "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.1" + "phpoption/phpoption": "^1.9.2" }, "require-dev": { - "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "type": "library", "autoload": { @@ -2448,7 +2514,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" }, "funding": [ { @@ -2460,7 +2526,7 @@ "type": "tidelift" } ], - "time": "2023-02-25T20:23:15+00:00" + "time": "2023-11-12T22:16:48+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -2515,26 +2581,26 @@ }, { "name": "hyperf/async-queue", - "version": "v3.0.18", + "version": "v3.1.6", "source": { "type": "git", "url": "https://github.com/hyperf/async-queue.git", - "reference": "7e7b558492a80ac29baeffe1942709a062d087aa" + "reference": "349d1f7d3eb317f2d3b8a16399d8b0e7405fdbdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/async-queue/zipball/7e7b558492a80ac29baeffe1942709a062d087aa", - "reference": "7e7b558492a80ac29baeffe1942709a062d087aa", + "url": "https://api.github.com/repos/hyperf/async-queue/zipball/349d1f7d3eb317f2d3b8a16399d8b0e7405fdbdf", + "reference": "349d1f7d3eb317f2d3b8a16399d8b0e7405fdbdf", "shasum": "" }, "require": { - "hyperf/codec": "~3.0.0", - "hyperf/collection": "~3.0.0", - "hyperf/command": "~3.0.0", - "hyperf/contract": "~3.0.0", - "hyperf/support": "~3.0.0", - "hyperf/utils": "~3.0.0", - "php": ">=8.0", + "hyperf/codec": "~3.1.0", + "hyperf/collection": "~3.1.0", + "hyperf/command": "~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/event-dispatcher": "^1.0" }, @@ -2547,13 +2613,16 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\AsyncQueue\\ConfigProvider" } }, "autoload": { + "files": [ + "src/Functions.php" + ], "psr-4": { "Hyperf\\AsyncQueue\\": "src/" } @@ -2575,37 +2644,56 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-04-26T03:02:31+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-01-12T01:57:51+00:00" }, { "name": "hyperf/command", - "version": "v3.0.27", + "version": "v3.1.7", "source": { "type": "git", "url": "https://github.com/hyperf/command.git", - "reference": "06df0f8102ec4079591d937adaca507fe5191082" + "reference": "72631c29841981812a5a245f5fe81c7a8e423b36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/command/zipball/06df0f8102ec4079591d937adaca507fe5191082", - "reference": "06df0f8102ec4079591d937adaca507fe5191082", + "url": "https://api.github.com/repos/hyperf/command/zipball/72631c29841981812a5a245f5fe81c7a8e423b36", + "reference": "72631c29841981812a5a245f5fe81c7a8e423b36", "shasum": "" }, "require": { - "hyperf/support": "~3.0.0", - "hyperf/tappable": "~3.0.0", - "hyperf/utils": "~3.0.0", - "php": ">=8.0", + "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" + "symfony/console": "^5.0|^6.0|^7.0" }, "suggest": { - "hyperf/di": "Required to use annotations." + "hyperf/di": "Required to use annotations.", + "hyperf/event": "Required to use listeners." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Command\\ConfigProvider" } }, "autoload": { @@ -2625,34 +2713,44 @@ ], "support": { "issues": "https://github.com/hyperf/command/issues", - "source": "https://github.com/hyperf/command/tree/v3.0.27" + "source": "https://github.com/hyperf/command/tree/v3.1.7" }, - "time": "2023-06-26T23:53:52+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-01-24T06:16:09+00:00" }, { "name": "hyperf/config", - "version": "v3.0.20", + "version": "v3.1.2", "source": { "type": "git", "url": "https://github.com/hyperf/config.git", - "reference": "6503882f8547809d609b9489170037ceaef04962" + "reference": "1364385aeb0c64fa018d2655119a5ab176aadebc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/config/zipball/6503882f8547809d609b9489170037ceaef04962", - "reference": "6503882f8547809d609b9489170037ceaef04962", + "url": "https://api.github.com/repos/hyperf/config/zipball/1364385aeb0c64fa018d2655119a5ab176aadebc", + "reference": "1364385aeb0c64fa018d2655119a5ab176aadebc", "shasum": "" }, "require": { - "hyperf/collection": "~3.0.0", - "hyperf/contract": "~3.0.0", - "hyperf/support": "~3.0.0", - "hyperf/utils": "~3.0.0", - "php": ">=8.0", + "hyperf/collection": "~3.1.0", + "hyperf/contract": "~3.1.0", + "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()", "hyperf/di": "Allows using @Value annotation", "hyperf/event": "Allows using @Value annotation", "hyperf/framework": "Allows using @Value annotation", @@ -2661,7 +2759,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\Config\\ConfigProvider" @@ -2694,31 +2792,41 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-05-09T03:02:12+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-12-08T02:35:39+00:00" }, { "name": "hyperf/database", - "version": "v3.0.30", + "version": "v3.1.5", "source": { "type": "git", "url": "https://github.com/hyperf/database.git", - "reference": "2b6178219951df7044417de1412a20a08cc331fa" + "reference": "a3ff1e706ba60925700ee854d47d1d9de2a4b705" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/database/zipball/2b6178219951df7044417de1412a20a08cc331fa", - "reference": "2b6178219951df7044417de1412a20a08cc331fa", + "url": "https://api.github.com/repos/hyperf/database/zipball/a3ff1e706ba60925700ee854d47d1d9de2a4b705", + "reference": "a3ff1e706ba60925700ee854d47d1d9de2a4b705", "shasum": "" }, "require": { - "hyperf/code-parser": "~3.0.0", - "hyperf/collection": "~3.0.0", - "hyperf/macroable": "~3.0.0", - "hyperf/support": "~3.0.24", - "hyperf/tappable": "~3.0.0", - "hyperf/utils": "~3.0.0", + "hyperf/code-parser": "~3.1.0", + "hyperf/collection": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/tappable": "~3.1.0", + "hyperf/utils": "~3.1.0", "nesbot/carbon": "^2.0", - "php": ">=8.0", + "php": ">=8.1", "psr/container": "^1.0|^2.0", "psr/event-dispatcher": "^1.0" }, @@ -2730,7 +2838,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -2755,37 +2863,47 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-07-17T12:16:22+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-01-04T13:47:09+00:00" }, { "name": "hyperf/db-connection", - "version": "v3.0.24", + "version": "v3.1.7", "source": { "type": "git", "url": "https://github.com/hyperf/db-connection.git", - "reference": "609325db39debbfb8df24e16e1bad299a0d12d55" + "reference": "a23ffd3b82d858ff912ec08b0a613eae0c840e4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/db-connection/zipball/609325db39debbfb8df24e16e1bad299a0d12d55", - "reference": "609325db39debbfb8df24e16e1bad299a0d12d55", + "url": "https://api.github.com/repos/hyperf/db-connection/zipball/a23ffd3b82d858ff912ec08b0a613eae0c840e4b", + "reference": "a23ffd3b82d858ff912ec08b0a613eae0c840e4b", "shasum": "" }, "require": { - "hyperf/database": "~3.0.0", - "hyperf/di": "~3.0.0", - "hyperf/framework": "~3.0.0", - "hyperf/model-listener": "~3.0.0", - "hyperf/pool": "~3.0.0", - "hyperf/support": "~3.0.0", - "hyperf/utils": "~3.0.0", - "php": ">=8.0", + "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.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\DbConnection\\ConfigProvider" @@ -2814,32 +2932,43 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-06-07T02:28:52+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-01-22T08:45:43+00:00" }, { "name": "hyperf/di", - "version": "v3.0.24", + "version": "v3.1.6", "source": { "type": "git", "url": "https://github.com/hyperf/di.git", - "reference": "4fa46897ffe0e1f2d1260a65a1e25dadaacbdcd2" + "reference": "e042ac1cef7da80df15ba77a5a9f9abfe70627d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/di/zipball/4fa46897ffe0e1f2d1260a65a1e25dadaacbdcd2", - "reference": "4fa46897ffe0e1f2d1260a65a1e25dadaacbdcd2", + "url": "https://api.github.com/repos/hyperf/di/zipball/e042ac1cef7da80df15ba77a5a9f9abfe70627d0", + "reference": "e042ac1cef7da80df15ba77a5a9f9abfe70627d0", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0", - "hyperf/code-parser": "~3.0.0", - "hyperf/pipeline": "~3.0.0", - "hyperf/support": "~3.0.0", + "hyperf/code-parser": "~3.1.0", + "hyperf/pipeline": "~3.1.0", + "hyperf/stdlib": "~3.1.0", + "hyperf/support": "~3.1.0", "nikic/php-parser": "^4.1", - "php": ">=8.0", + "php": ">=8.1", "php-di/phpdoc-reader": "^2.2", "psr/container": "^1.0|^2.0", - "symfony/finder": "^5.0|^6.0", + "symfony/finder": "^5.0|^6.0|^7.0", "vlucas/phpdotenv": "^5.0" }, "suggest": { @@ -2849,7 +2978,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\Di\\ConfigProvider" @@ -2879,25 +3008,35 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-06-05T07:53:17+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-01-08T13:45:10+00:00" }, { "name": "hyperf/dispatcher", - "version": "v3.0.24", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/dispatcher.git", - "reference": "af232ac01c3dcb91ad565d6202e3e3bfb2fcf560" + "reference": "582dc948da50db771294130bba465d8163f11ab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/dispatcher/zipball/af232ac01c3dcb91ad565d6202e3e3bfb2fcf560", - "reference": "af232ac01c3dcb91ad565d6202e3e3bfb2fcf560", + "url": "https://api.github.com/repos/hyperf/dispatcher/zipball/582dc948da50db771294130bba465d8163f11ab1", + "reference": "582dc948da50db771294130bba465d8163f11ab1", "shasum": "" }, "require": { - "hyperf/contract": "~3.0.0", - "php": ">=8.0", + "hyperf/contract": "~3.1.0", + "php": ">=8.1", "psr/container": "^1.0|^2.0", "psr/http-message": "^1.0|^2.0", "psr/http-server-middleware": "^1.0" @@ -2905,7 +3044,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\Dispatcher\\ConfigProvider" @@ -2936,25 +3075,36 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-06-04T02:14:26+00:00" + "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/event", - "version": "v3.0.0", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/event.git", - "reference": "e10cd5e8b7f02bad9c542c3592b495debba9a39a" + "reference": "6eada5f74ce80786c567d5aed0361d51175217bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/event/zipball/e10cd5e8b7f02bad9c542c3592b495debba9a39a", - "reference": "e10cd5e8b7f02bad9c542c3592b495debba9a39a", + "url": "https://api.github.com/repos/hyperf/event/zipball/6eada5f74ce80786c567d5aed0361d51175217bb", + "reference": "6eada5f74ce80786c567d5aed0361d51175217bb", "shasum": "" }, "require": { - "hyperf/contract": "~3.0.0", - "php": ">=8.0", + "hyperf/contract": "~3.1.0", + "hyperf/stdlib": "~3.1.0", + "php": ">=8.1", "psr/event-dispatcher": "^1.0" }, "suggest": { @@ -2963,7 +3113,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\Event\\ConfigProvider" @@ -2992,35 +3142,54 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2022-10-13T02:40:13+00:00" + "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/exception-handler", - "version": "v3.0.24", + "version": "v3.1.5", "source": { "type": "git", "url": "https://github.com/hyperf/exception-handler.git", - "reference": "bcadcd90f2d4f71e8e85f769256afdd4ea712ad3" + "reference": "8987b0764c6ade4e31b9753152e80dbac9a4a785" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/exception-handler/zipball/bcadcd90f2d4f71e8e85f769256afdd4ea712ad3", - "reference": "bcadcd90f2d4f71e8e85f769256afdd4ea712ad3", + "url": "https://api.github.com/repos/hyperf/exception-handler/zipball/8987b0764c6ade4e31b9753152e80dbac9a4a785", + "reference": "8987b0764c6ade4e31b9753152e80dbac9a4a785", "shasum": "" }, "require": { - "hyperf/contract": "~3.0.0", - "hyperf/dispatcher": "~3.0.0", - "hyperf/support": "~3.0.0", - "hyperf/utils": "~3.0.0", - "php": ">=8.0", + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/dispatcher": "~3.1.0", + "hyperf/http-message": "~3.1.0", + "hyperf/stdlib": "~3.1.0", + "hyperf/support": "~3.1.0", + "php": ">=8.1", "psr/container": "^1.0|^2.0", - "psr/http-message": "^1.0|^2.0" + "psr/http-message": "^1.0|^2.0", + "swow/psr7-plus": "^1.0" + }, + "suggest": { + "hyperf/di": "Required to use #[ExceptionHandler]", + "hyperf/event": "Required to use listeners", + "hyperf/framework": "Required to use listeners", + "hyperf/stringable": "Required to use WhoopsExceptionHandler" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\ExceptionHandler\\ConfigProvider" @@ -3048,28 +3217,38 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-06-04T02:14:26+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-01-04T02:06:27+00:00" }, { "name": "hyperf/framework", - "version": "v3.0.23", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/framework.git", - "reference": "38e0fdfd097e73efbe7391795a695cea874d4ca6" + "reference": "3b24833c8341a8f71cbf957653c10dee033604c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/framework/zipball/38e0fdfd097e73efbe7391795a695cea874d4ca6", - "reference": "38e0fdfd097e73efbe7391795a695cea874d4ca6", + "url": "https://api.github.com/repos/hyperf/framework/zipball/3b24833c8341a8f71cbf957653c10dee033604c5", + "reference": "3b24833c8341a8f71cbf957653c10dee033604c5", "shasum": "" }, "require": { "fig/http-message-util": "^1.1.2", - "hyperf/contract": "~3.0.0", - "hyperf/support": "~3.0.0", - "hyperf/utils": "~3.0.0", - "php": ">=8.0", + "hyperf/contract": "~3.1.0", + "hyperf/coordinator": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "php": ">=8.1", "psr/container": "^1.0|^2.0", "psr/event-dispatcher": "^1.0", "psr/log": "^1.0|^2.0|^3.0" @@ -3084,7 +3263,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\Framework\\ConfigProvider" @@ -3115,30 +3294,40 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-05-30T01:25:37+00:00" + "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/http-message", - "version": "v3.0.18", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/http-message.git", - "reference": "23affffb7a15842f990144b5bd49641e4de8dda4" + "reference": "1aa6b862003262d1186f5978f251970f687c16d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/http-message/zipball/23affffb7a15842f990144b5bd49641e4de8dda4", - "reference": "23affffb7a15842f990144b5bd49641e4de8dda4", + "url": "https://api.github.com/repos/hyperf/http-message/zipball/1aa6b862003262d1186f5978f251970f687c16d5", + "reference": "1aa6b862003262d1186f5978f251970f687c16d5", "shasum": "" }, "require": { - "hyperf/codec": "~3.0.0", - "hyperf/engine": "^1.9|^2.7", - "hyperf/support": "~3.0.0", - "hyperf/utils": "~3.0.0", + "hyperf/codec": "~3.1.0", + "hyperf/engine": "^2.7", + "hyperf/support": "~3.1.0", "laminas/laminas-mime": "^2.7", - "php": ">=8.0", - "psr/http-message": "^1.0|^2.0" + "php": ">=8.1", + "psr/http-message": "^1.0|^2.0", + "swow/psr7-plus": "^1.0" }, "suggest": { "psr/container": "Required to replace RequestParserInterface." @@ -3146,7 +3335,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\HttpMessage\\ConfigProvider" @@ -3170,41 +3359,53 @@ ], "support": { "issues": "https://github.com/hyperf/http-message/issues", - "source": "https://github.com/hyperf/http-message/tree/v3.0.18" + "source": "https://github.com/hyperf/http-message/tree/v3.1.0" }, - "time": "2023-04-26T03:02:31+00:00" + "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/http-server", - "version": "v3.0.24", + "version": "v3.1.6", "source": { "type": "git", "url": "https://github.com/hyperf/http-server.git", - "reference": "d8a3256a6b32879b6d7bfd308cc1dca9d8d27de1" + "reference": "c61c4cead88bbe14152e699760bc779a9a21dd05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/http-server/zipball/d8a3256a6b32879b6d7bfd308cc1dca9d8d27de1", - "reference": "d8a3256a6b32879b6d7bfd308cc1dca9d8d27de1", + "url": "https://api.github.com/repos/hyperf/http-server/zipball/c61c4cead88bbe14152e699760bc779a9a21dd05", + "reference": "c61c4cead88bbe14152e699760bc779a9a21dd05", "shasum": "" }, "require": { - "hyperf/codec": "~3.0.0", - "hyperf/collection": "~3.0.0", - "hyperf/contract": "~3.0.0", - "hyperf/coroutine": "~3.0.0", - "hyperf/dispatcher": "~3.0.0", - "hyperf/event": "~3.0.0", - "hyperf/exception-handler": "~3.0.0", - "hyperf/http-message": "~3.0.0", - "hyperf/macroable": "~3.0.0", - "hyperf/serializer": "~3.0.0", - "hyperf/server": "~3.0.0", - "hyperf/support": "~3.0.0", - "hyperf/utils": "~3.0.0", + "hyperf/codec": "~3.1.0", + "hyperf/collection": "~3.1.0", + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "hyperf/dispatcher": "~3.1.0", + "hyperf/event": "~3.1.0", + "hyperf/exception-handler": "~3.1.0", + "hyperf/http-message": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "hyperf/serializer": "~3.1.0", + "hyperf/server": "~3.1.0", + "hyperf/stdlib": "~3.1.0", + "hyperf/support": "~3.1.0", "nikic/fast-route": "^1.3", - "php": ">=8.0", - "psr/container": "^1.0|^2.0" + "php": ">=8.1", + "psr/container": "^1.0|^2.0", + "swow/psr7-plus": "^1.0" }, "suggest": { "hyperf/di": "Required to use annotations." @@ -3212,7 +3413,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\HttpServer\\ConfigProvider" @@ -3242,36 +3443,46 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-06-06T12:33:49+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-01-18T04:33:08+00:00" }, { "name": "hyperf/model-listener", - "version": "v3.0.18", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/model-listener.git", - "reference": "2167252ea7bdc8626cfd3d44f0f4709502c10432" + "reference": "03ff9d027871fed6f1be784a7835f5e107c7de5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/model-listener/zipball/2167252ea7bdc8626cfd3d44f0f4709502c10432", - "reference": "2167252ea7bdc8626cfd3d44f0f4709502c10432", + "url": "https://api.github.com/repos/hyperf/model-listener/zipball/03ff9d027871fed6f1be784a7835f5e107c7de5f", + "reference": "03ff9d027871fed6f1be784a7835f5e107c7de5f", "shasum": "" }, "require": { - "hyperf/contract": "~3.0.0", - "hyperf/database": "~3.0.0", - "hyperf/di": "~3.0.0", - "hyperf/event": "~3.0.0", - "hyperf/support": "~3.0.0", - "hyperf/utils": "~3.0.0", - "php": ">=8.0", + "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.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\ModelListener\\ConfigProvider" @@ -3300,30 +3511,40 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-04-26T03:02:31+00:00" + "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/pipeline", - "version": "v3.0.16", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/pipeline.git", - "reference": "a3f48561f5cfef5f697e7005446e16560024a443" + "reference": "44352f9b20c61c372dae655894f7a8f2bb86d0de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/pipeline/zipball/a3f48561f5cfef5f697e7005446e16560024a443", - "reference": "a3f48561f5cfef5f697e7005446e16560024a443", + "url": "https://api.github.com/repos/hyperf/pipeline/zipball/44352f9b20c61c372dae655894f7a8f2bb86d0de", + "reference": "44352f9b20c61c372dae655894f7a8f2bb86d0de", "shasum": "" }, "require": { - "php": ">=8.0", + "php": ">=8.1", "psr/container": "^1.0|^2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -3349,33 +3570,43 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-04-11T07:57:32+00:00" + "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/pool", - "version": "v3.0.18", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/pool.git", - "reference": "44c87d46a1619554deed3879e8db675654ffd051" + "reference": "75b0d64bf44a77b95a657e6c0a0a2a53aeafe577" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/pool/zipball/44c87d46a1619554deed3879e8db675654ffd051", - "reference": "44c87d46a1619554deed3879e8db675654ffd051", + "url": "https://api.github.com/repos/hyperf/pool/zipball/75b0d64bf44a77b95a657e6c0a0a2a53aeafe577", + "reference": "75b0d64bf44a77b95a657e6c0a0a2a53aeafe577", "shasum": "" }, "require": { - "hyperf/contract": "~3.0.0", - "hyperf/support": "~3.0.0", - "hyperf/utils": "~3.0.0", - "php": ">=8.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" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\Pool\\ConfigProvider" @@ -3404,27 +3635,37 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-04-26T03:02:31+00:00" + "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/process", - "version": "v3.0.22", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/process.git", - "reference": "e804c32bf7497bedcdee28994257aeaf71a1fde7" + "reference": "962149325efc5f762e85286f2cb1cc5511d8a21a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/process/zipball/e804c32bf7497bedcdee28994257aeaf71a1fde7", - "reference": "e804c32bf7497bedcdee28994257aeaf71a1fde7", + "url": "https://api.github.com/repos/hyperf/process/zipball/962149325efc5f762e85286f2cb1cc5511d8a21a", + "reference": "962149325efc5f762e85286f2cb1cc5511d8a21a", "shasum": "" }, "require": { - "hyperf/contract": "~3.0.0", - "hyperf/support": "~3.0.0", - "hyperf/utils": "~3.0.0", - "php": ">=8.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/event-dispatcher": "^1.0" }, @@ -3436,7 +3677,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\Process\\ConfigProvider" @@ -3458,36 +3699,46 @@ "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" - }, - "time": "2023-05-27T06:08:52+00:00" + "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.0.21", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/hyperf/redis.git", - "reference": "65ec6cbecb64793670ef1a512bd15369b683c746" + "reference": "4cbb9579e5295f0cc12bedbc81962eca24f10ff1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/redis/zipball/65ec6cbecb64793670ef1a512bd15369b683c746", - "reference": "65ec6cbecb64793670ef1a512bd15369b683c746", + "url": "https://api.github.com/repos/hyperf/redis/zipball/4cbb9579e5295f0cc12bedbc81962eca24f10ff1", + "reference": "4cbb9579e5295f0cc12bedbc81962eca24f10ff1", "shasum": "" }, "require": { - "ext-redis": "*", - "hyperf/contract": "~3.0.0", - "hyperf/pool": "~3.0.0", - "hyperf/support": "~3.0.0", - "hyperf/tappable": "~3.0.0", - "hyperf/utils": "~3.0.0", - "php": ">=8.0", + "ext-redis": "^5.0|^6.0", + "hyperf/contract": "~3.1.0", + "hyperf/pool": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/tappable": "~3.1.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1", "psr/container": "^1.0|^2.0" }, "suggest": { @@ -3497,7 +3748,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\Redis\\ConfigProvider" @@ -3526,33 +3777,43 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-05-15T04:08:45+00:00" + "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/server", - "version": "v3.0.24", + "version": "v3.1.2", "source": { "type": "git", "url": "https://github.com/hyperf/server.git", - "reference": "0a2bfa37355631a0f0484bfd08d815ad858d279c" + "reference": "d92c3756ccadd02349fd417eef382d8d55c970bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/server/zipball/0a2bfa37355631a0f0484bfd08d815ad858d279c", - "reference": "0a2bfa37355631a0f0484bfd08d815ad858d279c", + "url": "https://api.github.com/repos/hyperf/server/zipball/d92c3756ccadd02349fd417eef382d8d55c970bf", + "reference": "d92c3756ccadd02349fd417eef382d8d55c970bf", "shasum": "" }, "require": { - "hyperf/contract": "~3.0.0", - "hyperf/engine": "^1.10|^2.8", - "hyperf/support": "~3.0.0", - "hyperf/tappable": "~3.0.0", - "hyperf/utils": "~3.0.0", - "php": ">=8.0", + "hyperf/contract": "~3.1.0", + "hyperf/coordinator": "~3.1.0", + "hyperf/engine": "^2.8", + "hyperf/support": "~3.1.0", + "hyperf/tappable": "~3.1.0", + "php": ">=8.1", "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.", @@ -3561,7 +3822,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" }, "hyperf": { "config": "Hyperf\\Server\\ConfigProvider" @@ -3590,43 +3851,114 @@ "pull-request": "https://github.com/hyperf/hyperf/pulls", "source": "https://github.com/hyperf/hyperf" }, - "time": "2023-06-07T05:27:29+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-12-12T08:06:45+00:00" + }, + { + "name": "hyperf/stdlib", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/stdlib.git", + "reference": "25b73da235551d0d71d9157324709abaea36c455" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/stdlib/zipball/25b73da235551d0d71d9157324709abaea36c455", + "reference": "25b73da235551d0d71d9157324709abaea36c455", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A stdlib component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "stdlib", + "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/testing", - "version": "v3.0.30", + "version": "v3.1.3", "source": { "type": "git", "url": "https://github.com/hyperf/testing.git", - "reference": "fa9d8c1e79bc4958be5a2642387e1915a7fc9f13" + "reference": "00be4729882b0fcc9f5307b08db635f6ad3b56cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hyperf/testing/zipball/fa9d8c1e79bc4958be5a2642387e1915a7fc9f13", - "reference": "fa9d8c1e79bc4958be5a2642387e1915a7fc9f13", + "url": "https://api.github.com/repos/hyperf/testing/zipball/00be4729882b0fcc9f5307b08db635f6ad3b56cc", + "reference": "00be4729882b0fcc9f5307b08db635f6ad3b56cc", "shasum": "" }, "require": { - "hyperf/codec": "~3.0.0", - "hyperf/collection": "~3.0.0", - "hyperf/contract": "~3.0.0", - "hyperf/coroutine": "~3.0.0", - "hyperf/http-message": "~3.0.0", - "hyperf/http-server": "~3.0.0", - "hyperf/support": "~3.0.0", - "hyperf/utils": "~3.0.0", - "php": ">=8.0", - "phpunit/phpunit": "^9.5", + "hyperf/codec": "~3.1.0", + "hyperf/collection": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "hyperf/http-message": "~3.1.0", + "hyperf/http-server": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1", + "phpunit/phpunit": "^10.0", "psr/container": "^1.0|^2.0", "symfony/http-foundation": "^5.4|^6.0" }, + "suggest": { + "fakerphp/faker": "Required to use Faker feature.(^1.23)" + }, "bin": [ "co-phpunit" ], "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -3640,14 +3972,25 @@ ], "description": "Testing for hyperf", "keywords": [ + "dev", "php", "swoole", "testing" ], "support": { - "source": "https://github.com/hyperf/testing/tree/v3.0.30" + "source": "https://github.com/hyperf/testing/tree/v3.1.3" }, - "time": "2023-07-21T03:15:25+00:00" + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-12-17T08:53:12+00:00" }, { "name": "influxdb/influxdb-php", @@ -3718,21 +4061,21 @@ }, { "name": "laminas/laminas-mime", - "version": "2.11.0", + "version": "2.12.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-mime.git", - "reference": "60ec04b755821c79c1987ce291b44e69f2c0831f" + "reference": "08cc544778829b7d68d27a097885bd6e7130135e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-mime/zipball/60ec04b755821c79c1987ce291b44e69f2c0831f", - "reference": "60ec04b755821c79c1987ce291b44e69f2c0831f", + "url": "https://api.github.com/repos/laminas/laminas-mime/zipball/08cc544778829b7d68d27a097885bd6e7130135e", + "reference": "08cc544778829b7d68d27a097885bd6e7130135e", "shasum": "" }, "require": { "laminas/laminas-stdlib": "^2.7 || ^3.0", - "php": "~8.0.0 || ~8.1.0 || ~8.2.0" + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" }, "conflict": { "zendframework/zend-mime": "*" @@ -3775,34 +4118,34 @@ "type": "community_bridge" } ], - "time": "2022-10-18T08:38:15+00:00" + "time": "2023-11-02T16:47:19+00:00" }, { "name": "laminas/laminas-stdlib", - "version": "3.17.0", + "version": "3.19.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-stdlib.git", - "reference": "dd35c868075bad80b6718959740913e178eb4274" + "reference": "6a192dd0882b514e45506f533b833b623b78fff3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/dd35c868075bad80b6718959740913e178eb4274", - "reference": "dd35c868075bad80b6718959740913e178eb4274", + "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/6a192dd0882b514e45506f533b833b623b78fff3", + "reference": "6a192dd0882b514e45506f533b833b623b78fff3", "shasum": "" }, "require": { - "php": "~8.1.0 || ~8.2.0" + "php": "~8.1.0 || ~8.2.0 || ~8.3.0" }, "conflict": { "zendframework/zend-stdlib": "*" }, "require-dev": { "laminas/laminas-coding-standard": "^2.5", - "phpbench/phpbench": "^1.2.9", - "phpunit/phpunit": "^10.0.16", + "phpbench/phpbench": "^1.2.15", + "phpunit/phpunit": "^10.5.8", "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.8" + "vimeo/psalm": "^5.20.0" }, "type": "library", "autoload": { @@ -3834,35 +4177,33 @@ "type": "community_bridge" } ], - "time": "2023-03-20T13:51:37+00:00" + "time": "2024-01-19T12:39:49+00:00" }, { "name": "mockery/mockery", - "version": "1.6.4", + "version": "1.6.7", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "d1413755e26fe56a63455f7753221c86cbb88f66" + "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/d1413755e26fe56a63455f7753221c86cbb88f66", - "reference": "d1413755e26fe56a63455f7753221c86cbb88f66", + "url": "https://api.github.com/repos/mockery/mockery/zipball/0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06", + "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06", "shasum": "" }, "require": { "hamcrest/hamcrest-php": "^2.0.1", "lib-pcre": ">=7.0", - "php": ">=7.4,<8.3" + "php": ">=7.3" }, "conflict": { "phpunit/phpunit": "<8.0" }, "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.3", - "psalm/plugin-phpunit": "^0.18.4", - "symplify/easy-coding-standard": "^11.5.0", - "vimeo/psalm": "^5.13.1" + "phpunit/phpunit": "^8.5 || ^9.6.10", + "symplify/easy-coding-standard": "^12.0.8" }, "type": "library", "autoload": { @@ -3919,7 +4260,7 @@ "security": "https://github.com/mockery/mockery/security/advisories", "source": "https://github.com/mockery/mockery" }, - "time": "2023-07-19T15:51:02+00:00" + "time": "2023-12-10T02:24:34+00:00" }, { "name": "myclabs/deep-copy", @@ -3982,28 +4323,33 @@ }, { "name": "nesbot/carbon", - "version": "2.68.1", + "version": "2.72.2", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "4f991ed2a403c85efbc4f23eb4030063fdbe01da" + "reference": "3e7edc41b58d65509baeb0d4a14c8fa41d627130" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4f991ed2a403c85efbc4f23eb4030063fdbe01da", - "reference": "4f991ed2a403c85efbc4f23eb4030063fdbe01da", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/3e7edc41b58d65509baeb0d4a14c8fa41d627130", + "reference": "3e7edc41b58d65509baeb0d4a14c8fa41d627130", "shasum": "" }, "require": { + "carbonphp/carbon-doctrine-types": "*", "ext-json": "*", "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.16", "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, + "provide": { + "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": "*", @@ -4080,7 +4426,7 @@ "type": "tidelift" } ], - "time": "2023-06-20T18:29:04+00:00" + "time": "2024-01-19T00:21:53+00:00" }, { "name": "nikic/fast-route", @@ -4134,16 +4480,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.16.0", + "version": "v4.18.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "19526a33fb561ef417e822e85f08a00db4059c17" + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17", - "reference": "19526a33fb561ef417e822e85f08a00db4059c17", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", "shasum": "" }, "require": { @@ -4184,9 +4530,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" }, - "time": "2023-06-25T14:52:30+00:00" + "time": "2023-12-10T21:03:43+00:00" }, { "name": "phar-io/manifest", @@ -4343,16 +4689,16 @@ }, { "name": "phpoption/phpoption", - "version": "1.9.1", + "version": "1.9.2", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e" + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e", - "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", "shasum": "" }, "require": { @@ -4360,7 +4706,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "type": "library", "extra": { @@ -4402,7 +4748,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.1" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" }, "funding": [ { @@ -4414,7 +4760,7 @@ "type": "tidelift" } ], - "time": "2023-02-25T19:38:58+00:00" + "time": "2023-11-12T21:59:55+00:00" }, { "name": "phpstan/extension-installer", @@ -4462,16 +4808,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.26", + "version": "1.10.57", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "5d660cbb7e1b89253a47147ae44044f49832351f" + "reference": "1627b1d03446904aaa77593f370c5201d2ecc34e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5d660cbb7e1b89253a47147ae44044f49832351f", - "reference": "5d660cbb7e1b89253a47147ae44044f49832351f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1627b1d03446904aaa77593f370c5201d2ecc34e", + "reference": "1627b1d03446904aaa77593f370c5201d2ecc34e", "shasum": "" }, "require": { @@ -4520,20 +4866,20 @@ "type": "tidelift" } ], - "time": "2023-07-19T12:44:37+00:00" + "time": "2024-01-24T11:51:34+00:00" }, { "name": "phpstan/phpstan-mockery", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-mockery.git", - "reference": "6aa86bd8e9c9a1be97baf0558d4a2ed1374736a6" + "reference": "88ae85931768efd3aaf3cce4cb9cb54c4d157d03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-mockery/zipball/6aa86bd8e9c9a1be97baf0558d4a2ed1374736a6", - "reference": "6aa86bd8e9c9a1be97baf0558d4a2ed1374736a6", + "url": "https://api.github.com/repos/phpstan/phpstan-mockery/zipball/88ae85931768efd3aaf3cce4cb9cb54c4d157d03", + "reference": "88ae85931768efd3aaf3cce4cb9cb54c4d157d03", "shasum": "" }, "require": { @@ -4568,41 +4914,41 @@ "description": "PHPStan Mockery extension", "support": { "issues": "https://github.com/phpstan/phpstan-mockery/issues", - "source": "https://github.com/phpstan/phpstan-mockery/tree/1.1.1" + "source": "https://github.com/phpstan/phpstan-mockery/tree/1.1.2" }, - "time": "2023-02-18T13:54:03+00:00" + "time": "2024-01-10T13:50:05+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.27", + "version": "10.1.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1" + "reference": "78c3b7625965c2513ee96569a4dbb62601784145" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b0a88255cb70d52653d80c890bd7f38740ea50d1", - "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", + "reference": "78c3b7625965c2513ee96569a4dbb62601784145", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.15", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.1" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -4611,7 +4957,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "10.1-dev" } }, "autoload": { @@ -4640,7 +4986,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/9.2.27" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" }, "funding": [ { @@ -4648,32 +4994,32 @@ "type": "github" } ], - "time": "2023-07-26T13:44:30+00:00" + "time": "2023-12-21T15:38:30+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.6", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -4700,7 +5046,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" }, "funding": [ { @@ -4708,28 +5055,28 @@ "type": "github" } ], - "time": "2021-12-02T12:48:52+00:00" + "time": "2023-08-31T06:24:48+00:00" }, { "name": "phpunit/php-invoker", - "version": "3.1.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-pcntl": "*" @@ -4737,7 +5084,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -4763,7 +5110,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" }, "funding": [ { @@ -4771,32 +5118,32 @@ "type": "github" } ], - "time": "2020-09-28T05:58:55+00:00" + "time": "2023-02-03T06:56:09+00:00" }, { "name": "phpunit/php-text-template", - "version": "2.0.4", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -4822,7 +5169,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" }, "funding": [ { @@ -4830,32 +5178,32 @@ "type": "github" } ], - "time": "2020-10-26T05:33:50+00:00" + "time": "2023-08-31T14:07:24+00:00" }, { "name": "phpunit/php-timer", - "version": "5.0.3", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -4881,7 +5229,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" }, "funding": [ { @@ -4889,24 +5237,23 @@ "type": "github" } ], - "time": "2020-10-26T13:16:10+00:00" + "time": "2023-02-03T06:57:52+00:00" }, { "name": "phpunit/phpunit", - "version": "9.6.10", + "version": "10.5.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "a6d351645c3fe5a30f5e86be6577d946af65a328" + "reference": "0bd663704f0165c9e76fe4f06ffa6a1ca727fdbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a6d351645c3fe5a30f5e86be6577d946af65a328", - "reference": "a6d351645c3fe5a30f5e86be6577d946af65a328", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0bd663704f0165c9e76fe4f06ffa6a1ca727fdbe", + "reference": "0bd663704f0165c9e76fe4f06ffa6a1ca727fdbe", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -4916,27 +5263,26 @@ "myclabs/deep-copy": "^1.10.1", "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", - "sebastian/version": "^3.0.2" + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.5", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.1", + "sebastian/global-state": "^6.0.1", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" }, "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + "ext-soap": "To be able to generate mocks based on WSDL files" }, "bin": [ "phpunit" @@ -4944,7 +5290,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.6-dev" + "dev-main": "10.5-dev" } }, "autoload": { @@ -4976,7 +5322,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.10" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.9" }, "funding": [ { @@ -4992,34 +5338,29 @@ "type": "tidelift" } ], - "time": "2023-07-10T04:04:23+00:00" + "time": "2024-01-22T14:35:40+00:00" }, { - "name": "psr/cache", - "version": "3.0.0", + "name": "psr/clock", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": "^7.0 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { - "Psr\\Cache\\": "src/" + "Psr\\Clock\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -5032,16 +5373,20 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interface for caching libraries", + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", "keywords": [ - "cache", + "clock", + "now", "psr", - "psr-6" + "psr-20", + "time" ], "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" }, - "time": "2021-02-03T23:26:27+00:00" + "time": "2022-11-25T14:36:26+00:00" }, { "name": "psr/http-server-handler", @@ -5208,16 +5553,16 @@ }, { "name": "rector/rector", - "version": "0.17.7", + "version": "0.17.13", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "0e76101aa329911b7fec43106aac5843a978b209" + "reference": "e2003ba7c5bda06d7bb419cf4be8dae5f8672132" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/0e76101aa329911b7fec43106aac5843a978b209", - "reference": "0e76101aa329911b7fec43106aac5843a978b209", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/e2003ba7c5bda06d7bb419cf4be8dae5f8672132", + "reference": "e2003ba7c5bda06d7bb419cf4be8dae5f8672132", "shasum": "" }, "require": { @@ -5234,11 +5579,6 @@ "bin/rector" ], "type": "library", - "extra": { - "branch-alias": { - "dev-main": "0.15-dev" - } - }, "autoload": { "files": [ "bootstrap.php" @@ -5257,7 +5597,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.17.7" + "source": "https://github.com/rectorphp/rector/tree/0.17.13" }, "funding": [ { @@ -5265,32 +5605,32 @@ "type": "github" } ], - "time": "2023-07-23T20:44:23+00:00" + "time": "2023-08-14T16:33:29+00:00" }, { "name": "sebastian/cli-parser", - "version": "1.0.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -5313,7 +5653,7 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" }, "funding": [ { @@ -5321,32 +5661,32 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2023-02-03T06:58:15+00:00" }, { "name": "sebastian/code-unit", - "version": "1.0.8", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -5369,7 +5709,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" }, "funding": [ { @@ -5377,32 +5717,32 @@ "type": "github" } ], - "time": "2020-10-26T13:08:54+00:00" + "time": "2023-02-03T06:58:43+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -5424,7 +5764,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" }, "funding": [ { @@ -5432,34 +5772,36 @@ "type": "github" } ], - "time": "2020-09-28T05:30:19+00:00" + "time": "2023-02-03T06:59:15+00:00" }, { "name": "sebastian/comparator", - "version": "4.0.8", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -5498,7 +5840,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" }, "funding": [ { @@ -5506,33 +5849,33 @@ "type": "github" } ], - "time": "2022-09-14T12:41:17+00:00" + "time": "2023-08-14T13:18:12+00:00" }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "68ff824baeae169ec9f2137158ee529584553799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", - "php": ">=7.3" + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.2-dev" } }, "autoload": { @@ -5555,7 +5898,8 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" }, "funding": [ { @@ -5563,33 +5907,33 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-12-21T08:37:17+00:00" }, { "name": "sebastian/diff", - "version": "4.0.5", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3", + "phpunit/phpunit": "^10.0", "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -5621,7 +5965,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" }, "funding": [ { @@ -5629,27 +5974,27 @@ "type": "github" } ], - "time": "2023-05-07T05:35:17+00:00" + "time": "2023-12-22T10:55:06+00:00" }, { "name": "sebastian/environment", - "version": "5.1.5", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-posix": "*" @@ -5657,7 +6002,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -5676,7 +6021,7 @@ } ], "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", @@ -5684,7 +6029,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" }, "funding": [ { @@ -5692,34 +6038,34 @@ "type": "github" } ], - "time": "2023-02-03T06:03:51+00:00" + "time": "2023-04-11T05:39:26+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.5", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -5761,7 +6107,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" }, "funding": [ { @@ -5769,38 +6116,35 @@ "type": "github" } ], - "time": "2022-09-14T06:03:37+00:00" + "time": "2023-09-24T13:22:09+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -5825,7 +6169,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" }, "funding": [ { @@ -5833,33 +6178,33 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2023-07-19T07:19:23+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", - "php": ">=7.3" + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -5882,7 +6227,8 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" }, "funding": [ { @@ -5890,34 +6236,34 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-12-21T08:38:20+00:00" }, { "name": "sebastian/object-enumerator", - "version": "4.0.4", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -5939,7 +6285,7 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" }, "funding": [ { @@ -5947,32 +6293,32 @@ "type": "github" } ], - "time": "2020-10-26T13:12:34+00:00" + "time": "2023-02-03T07:08:32+00:00" }, { "name": "sebastian/object-reflector", - "version": "2.0.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -5994,7 +6340,7 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" }, "funding": [ { @@ -6002,32 +6348,32 @@ "type": "github" } ], - "time": "2020-10-26T13:14:26+00:00" + "time": "2023-02-03T07:06:18+00:00" }, { "name": "sebastian/recursion-context", - "version": "4.0.5", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -6057,62 +6403,7 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:07:39+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" }, "funding": [ { @@ -6120,32 +6411,32 @@ "type": "github" } ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2023-02-03T07:05:40+00:00" }, { "name": "sebastian/type", - "version": "3.2.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -6168,7 +6459,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" }, "funding": [ { @@ -6176,29 +6467,29 @@ "type": "github" } ], - "time": "2023-02-03T06:13:03+00:00" + "time": "2023-02-03T07:10:45+00:00" }, { "name": "sebastian/version", - "version": "3.0.2", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -6221,7 +6512,7 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" }, "funding": [ { @@ -6229,20 +6520,20 @@ "type": "github" } ], - "time": "2020-09-28T06:39:44+00:00" + "time": "2023-02-07T11:34:05+00:00" }, { "name": "slickdeals/statsd", - "version": "3.1.2", + "version": "3.2.0", "source": { "type": "git", - "url": "https://github.com/Slickdeals/statsd-php.git", - "reference": "03fc5d8d51aff9f651f97101033aad31c08d00de" + "url": "git@github.com:Slickdeals/statsd-php.git", + "reference": "96b8a5e0370e09914adc87513f5c49e1a9289b5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Slickdeals/statsd-php/zipball/03fc5d8d51aff9f651f97101033aad31c08d00de", - "reference": "03fc5d8d51aff9f651f97101033aad31c08d00de", + "url": "https://api.github.com/repos/Slickdeals/statsd-php/zipball/96b8a5e0370e09914adc87513f5c49e1a9289b5a", + "reference": "96b8a5e0370e09914adc87513f5c49e1a9289b5a", "shasum": "" }, "require": { @@ -6281,24 +6572,20 @@ "statsd", "udp" ], - "support": { - "issues": "https://github.com/Slickdeals/statsd-php/issues", - "source": "https://github.com/Slickdeals/statsd-php/tree/3.1.2" - }, - "time": "2022-08-15T16:22:48+00:00" + "time": "2023-11-24T08:03:36+00:00" }, { "name": "swoole/ide-helper", - "version": "5.0.3", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/swoole/ide-helper.git", - "reference": "4b6e615cb27c251b6248b8bd9501edbd02a45c18" + "reference": "69b374d982e7139fc904cc61757e7fede1d9c3d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swoole/ide-helper/zipball/4b6e615cb27c251b6248b8bd9501edbd02a45c18", - "reference": "4b6e615cb27c251b6248b8bd9501edbd02a45c18", + "url": "https://api.github.com/repos/swoole/ide-helper/zipball/69b374d982e7139fc904cc61757e7fede1d9c3d8", + "reference": "69b374d982e7139fc904cc61757e7fede1d9c3d8", "shasum": "" }, "type": "library", @@ -6315,49 +6602,102 @@ "description": "IDE help files for Swoole.", "support": { "issues": "https://github.com/swoole/ide-helper/issues", - "source": "https://github.com/swoole/ide-helper/tree/5.0.3" + "source": "https://github.com/swoole/ide-helper/tree/5.1.1" + }, + "time": "2023-12-08T17:56:23+00:00" + }, + { + "name": "swow/psr7-plus", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/swow/psr7-plus.git", + "reference": "7acc4924be907d2ff64edee5a2bd116620e56364" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swow/psr7-plus/zipball/7acc4924be907d2ff64edee5a2bd116620e56364", + "reference": "7acc4924be907d2ff64edee5a2bd116620e56364", + "shasum": "" + }, + "require": { + "php": ">=8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Swow\\Psr7\\Message\\": "src/Message/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "twose", + "email": "twosee@php.net" + } + ], + "description": "Modern strong-typed interfaces for Psr7, not only HTTP but also WebSocket", + "keywords": [ + "http", + "psr17", + "psr7", + "swow", + "websocket" + ], + "support": { + "issues": "https://github.com/swow/swow", + "source": "https://github.com/swow/psr7-plus/tree/v1.1.2" }, - "time": "2023-04-28T22:20:18+00:00" + "time": "2023-06-15T09:18:11+00:00" }, { "name": "symfony/console", - "version": "v6.3.0", + "version": "v7.0.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7" + "reference": "f8587c4cdc5acad67af71c37db34ef03af91e59c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7", - "reference": "8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7", + "url": "https://api.github.com/repos/symfony/console/zipball/f8587c4cdc5acad67af71c37db34ef03af91e59c", + "reference": "f8587c4cdc5acad67af71c37db34ef03af91e59c", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0" + "symfony/string": "^6.4|^7.0" }, "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" + "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": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/lock": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "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": { @@ -6391,7 +6731,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.3.0" + "source": "https://github.com/symfony/console/tree/v7.0.2" }, "funding": [ { @@ -6407,28 +6747,28 @@ "type": "tidelift" } ], - "time": "2023-05-29T12:49:39+00:00" + "time": "2023-12-10T16:54:46+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.3.0", + "version": "v7.0.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa" + "reference": "098b62ae81fdd6cbf941f355059f617db28f4f9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa", - "reference": "3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/098b62ae81fdd6cbf941f355059f617db28f4f9a", + "reference": "098b62ae81fdd6cbf941f355059f617db28f4f9a", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4", + "symfony/dependency-injection": "<6.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -6437,13 +6777,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", + "symfony/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": "^5.4|^6.0" + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -6471,7 +6811,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.2" }, "funding": [ { @@ -6487,11 +6827,11 @@ "type": "tidelift" } ], - "time": "2023-04-21T14:41:17+00:00" + "time": "2023-12-27T22:24:19+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", @@ -6547,7 +6887,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" }, "funding": [ { @@ -6567,20 +6907,20 @@ }, { "name": "symfony/filesystem", - "version": "v6.3.1", + "version": "v7.0.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" + "reference": "7da8ea2362a283771478c5f7729cfcb43a76b8b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", - "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7da8ea2362a283771478c5f7729cfcb43a76b8b7", + "reference": "7da8ea2362a283771478c5f7729cfcb43a76b8b7", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, @@ -6610,7 +6950,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.3.1" + "source": "https://github.com/symfony/filesystem/tree/v7.0.0" }, "funding": [ { @@ -6626,27 +6966,27 @@ "type": "tidelift" } ], - "time": "2023-06-01T08:30:39+00:00" + "time": "2023-07-27T06:33:22+00:00" }, { "name": "symfony/finder", - "version": "v6.3.0", + "version": "v7.0.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2" + "reference": "6e5688d69f7cfc4ed4a511e96007e06c2d34ce56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/d9b01ba073c44cef617c7907ce2419f8d00d75e2", - "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2", + "url": "https://api.github.com/repos/symfony/finder/zipball/6e5688d69f7cfc4ed4a511e96007e06c2d34ce56", + "reference": "6e5688d69f7cfc4ed4a511e96007e06c2d34ce56", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "symfony/filesystem": "^6.0" + "symfony/filesystem": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -6674,7 +7014,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.3.0" + "source": "https://github.com/symfony/finder/tree/v7.0.0" }, "funding": [ { @@ -6690,20 +7030,20 @@ "type": "tidelift" } ], - "time": "2023-04-02T01:25:41+00:00" + "time": "2023-10-31T17:59:56+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.3.1", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "e0ad0d153e1c20069250986cd9e9dd1ccebb0d66" + "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e0ad0d153e1c20069250986cd9e9dd1ccebb0d66", - "reference": "e0ad0d153e1c20069250986cd9e9dd1ccebb0d66", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/172d807f9ef3fc3fbed8377cc57c20d389269271", + "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271", "shasum": "" }, "require": { @@ -6713,17 +7053,17 @@ "symfony/polyfill-php83": "^1.27" }, "conflict": { - "symfony/cache": "<6.2" + "symfony/cache": "<6.3" }, "require-dev": { - "doctrine/dbal": "^2.13.1|^3.0", + "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", - "symfony/mime": "^5.4|^6.0", - "symfony/rate-limiter": "^5.2|^6.0" + "symfony/cache": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -6751,7 +7091,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.1" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.2" }, "funding": [ { @@ -6767,24 +7107,24 @@ "type": "tidelift" } ], - "time": "2023-06-24T11:51:27+00:00" + "time": "2023-12-27T22:16:42+00:00" }, { "name": "symfony/options-resolver", - "version": "v6.3.0", + "version": "v7.0.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" + "reference": "700ff4096e346f54cb628ea650767c8130f1001f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", - "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/700ff4096e346f54cb628ea650767c8130f1001f", + "reference": "700ff4096e346f54cb628ea650767c8130f1001f", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", @@ -6818,7 +7158,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.3.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.0.0" }, "funding": [ { @@ -6834,20 +7174,20 @@ "type": "tidelift" } ], - "time": "2023-05-12T14:21:09+00:00" + "time": "2023-08-08T10:20:21+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -6862,7 +7202,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6900,7 +7240,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -6916,20 +7256,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { @@ -6941,7 +7281,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6981,7 +7321,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -6997,20 +7337,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { @@ -7022,7 +7362,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7065,7 +7405,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -7081,20 +7421,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -7109,7 +7449,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7148,7 +7488,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -7164,20 +7504,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -7186,7 +7526,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7231,7 +7571,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -7247,20 +7587,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", "shasum": "" }, "require": { @@ -7269,7 +7609,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7310,7 +7650,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" }, "funding": [ { @@ -7326,20 +7666,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "508c652ba3ccf69f8c97f251534f229791b52a57" + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/508c652ba3ccf69f8c97f251534f229791b52a57", - "reference": "508c652ba3ccf69f8c97f251534f229791b52a57", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", "shasum": "" }, "require": { @@ -7349,7 +7689,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7362,7 +7702,10 @@ ], "psr-4": { "Symfony\\Polyfill\\Php83\\": "" - } + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7387,7 +7730,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" }, "funding": [ { @@ -7403,24 +7746,24 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-08-16T06:22:46+00:00" }, { "name": "symfony/process", - "version": "v6.3.0", + "version": "v7.0.2", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8741e3ed7fe2e91ec099e02446fb86667a0f1628" + "reference": "acd3eb5cb02382c1cb0287ba29b2908cc6ffa83a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8741e3ed7fe2e91ec099e02446fb86667a0f1628", - "reference": "8741e3ed7fe2e91ec099e02446fb86667a0f1628", + "url": "https://api.github.com/repos/symfony/process/zipball/acd3eb5cb02382c1cb0287ba29b2908cc6ffa83a", + "reference": "acd3eb5cb02382c1cb0287ba29b2908cc6ffa83a", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -7448,7 +7791,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.3.0" + "source": "https://github.com/symfony/process/tree/v7.0.2" }, "funding": [ { @@ -7464,25 +7807,25 @@ "type": "tidelift" } ], - "time": "2023-05-19T08:06:44+00:00" + "time": "2023-12-24T09:15:37+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.3.0", + "version": "v3.4.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^2.0" + "psr/container": "^1.1|^2.0" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -7530,7 +7873,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" }, "funding": [ { @@ -7546,24 +7889,24 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2023-12-26T14:02:43+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.3.0", + "version": "v7.0.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" + "reference": "7bbfa3dd564a0ce12eb4acaaa46823c740f9cb7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/7bbfa3dd564a0ce12eb4acaaa46823c740f9cb7a", + "reference": "7bbfa3dd564a0ce12eb4acaaa46823c740f9cb7a", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/service-contracts": "^2.5|^3" }, "type": "library", @@ -7592,7 +7935,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.3.0" + "source": "https://github.com/symfony/stopwatch/tree/v7.0.0" }, "funding": [ { @@ -7608,24 +7951,24 @@ "type": "tidelift" } ], - "time": "2023-02-16T10:14:28+00:00" + "time": "2023-07-05T13:06:06+00:00" }, { "name": "symfony/string", - "version": "v6.3.0", + "version": "v7.0.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f" + "reference": "cc78f14f91f5e53b42044d0620961c48028ff9f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f2e190ee75ff0f5eced645ec0be5c66fac81f51f", - "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "url": "https://api.github.com/repos/symfony/string/zipball/cc78f14f91f5e53b42044d0620961c48028ff9f5", + "reference": "cc78f14f91f5e53b42044d0620961c48028ff9f5", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", @@ -7635,11 +7978,11 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/intl": "^6.2", + "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": "^5.4|^6.0" + "symfony/var-exporter": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -7678,7 +8021,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.0" + "source": "https://github.com/symfony/string/tree/v7.0.2" }, "funding": [ { @@ -7694,24 +8037,25 @@ "type": "tidelift" } ], - "time": "2023-03-21T21:06:29+00:00" + "time": "2023-12-10T16:54:46+00:00" }, { "name": "symfony/translation", - "version": "v6.3.0", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "f72b2cba8f79dd9d536f534f76874b58ad37876f" + "reference": "a2ab2ec1a462e53016de8e8d5e8912bfd62ea681" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/f72b2cba8f79dd9d536f534f76874b58ad37876f", - "reference": "f72b2cba8f79dd9d536f534f76874b58ad37876f", + "url": "https://api.github.com/repos/symfony/translation/zipball/a2ab2ec1a462e53016de8e8d5e8912bfd62ea681", + "reference": "a2ab2ec1a462e53016de8e8d5e8912bfd62ea681", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^2.5|^3.0" }, @@ -7731,17 +8075,17 @@ "require-dev": { "nikic/php-parser": "^4.13", "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/intl": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0", + "symfony/routing": "^5.4|^6.0|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0" + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -7772,7 +8116,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.3.0" + "source": "https://github.com/symfony/translation/tree/v6.4.2" }, "funding": [ { @@ -7788,20 +8132,20 @@ "type": "tidelift" } ], - "time": "2023-05-19T12:46:45+00:00" + "time": "2023-12-18T09:25:29+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.3.0", + "version": "v3.4.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86" + "reference": "06450585bf65e978026bda220cdebca3f867fde7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/02c24deb352fb0d79db5486c0c79905a85e37e86", - "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/06450585bf65e978026bda220cdebca3f867fde7", + "reference": "06450585bf65e978026bda220cdebca3f867fde7", "shasum": "" }, "require": { @@ -7850,7 +8194,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.4.1" }, "funding": [ { @@ -7866,20 +8210,20 @@ "type": "tidelift" } ], - "time": "2023-05-30T17:17:10+00:00" + "time": "2023-12-26T14:02:43+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -7908,7 +8252,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" }, "funding": [ { @@ -7916,35 +8260,35 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2023-11-20T00:12:19+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v5.5.0", + "version": "v5.6.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", - "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", "shasum": "" }, "require": { "ext-pcre": "*", - "graham-campbell/result-type": "^1.0.2", - "php": "^7.1.3 || ^8.0", - "phpoption/phpoption": "^1.8", - "symfony/polyfill-ctype": "^1.23", - "symfony/polyfill-mbstring": "^1.23.1", - "symfony/polyfill-php80": "^1.23.1" + "graham-campbell/result-type": "^1.1.2", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-filter": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "suggest": { "ext-filter": "Required to use the boolean validator." @@ -7956,7 +8300,7 @@ "forward-command": true }, "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "autoload": { @@ -7988,7 +8332,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" }, "funding": [ { @@ -8000,7 +8344,7 @@ "type": "tidelift" } ], - "time": "2022-10-16T01:01:54+00:00" + "time": "2023-11-12T22:43:29+00:00" } ], "aliases": [], @@ -8009,8 +8353,8 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=8.0" + "php": ">=8.1" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/publish/metric.php b/publish/metric.php index 619a861d6..8dd85c4a1 100644 --- a/publish/metric.php +++ b/publish/metric.php @@ -18,7 +18,11 @@ 'default' => env('METRIC_DRIVER', 'prometheus'), 'use_standalone_process' => env('METRIC_USE_STANDALONE_PROCESS', false), 'enable_default_metric' => env('METRIC_ENABLE_DEFAULT_METRIC', true), + 'enable_command_metric' => env('METRIC_ENABLE_COMMAND_METRIC', true), 'default_metric_interval' => env('DEFAULT_METRIC_INTERVAL', 5), + // only available when use_standalone_process is true + 'buffer_interval' => env('METRIC_BUFFER_INTERVAL', 5), + 'buffer_size' => env('METRIC_BUFFER_SIZE', 200), 'metric' => [ 'prometheus' => [ 'driver' => Hyperf\Metric\Adapter\Prometheus\MetricFactory::class, diff --git a/src/Adapter/InfluxDB/MetricFactory.php b/src/Adapter/InfluxDB/MetricFactory.php index 43c183207..5a9a1cd01 100644 --- a/src/Adapter/InfluxDB/MetricFactory.php +++ b/src/Adapter/InfluxDB/MetricFactory.php @@ -22,7 +22,7 @@ use Hyperf\Metric\Contract\GaugeInterface; use Hyperf\Metric\Contract\HistogramInterface; use Hyperf\Metric\Contract\MetricFactoryInterface; -use Hyperf\Stringable\Str; +use Hyperf\Stringable\StrCache; use InfluxDB\Client; use InfluxDB\Database; use InfluxDB\Database\RetentionPolicy; @@ -129,6 +129,6 @@ protected function createPoint(Sample $sample): Point private function getNamespace(): string { $name = $this->config->get("metric.metric.{$this->name}.namespace"); - return preg_replace('#[^a-zA-Z0-9:_]#', '_', Str::snake($name)); + return preg_replace('#[^a-zA-Z0-9:_]#', '_', StrCache::snake($name)); } } diff --git a/src/Adapter/Prometheus/MetricFactory.php b/src/Adapter/Prometheus/MetricFactory.php index 86095300b..5f9d6ae66 100644 --- a/src/Adapter/Prometheus/MetricFactory.php +++ b/src/Adapter/Prometheus/MetricFactory.php @@ -30,6 +30,7 @@ use Hyperf\Metric\Exception\RuntimeException; use Hyperf\Metric\MetricFactoryPicker; use Hyperf\Stringable\Str; +use Hyperf\Stringable\StrCache; use Hyperf\Support\Network; use Prometheus\CollectorRegistry; use Prometheus\Exception\MetricsRegistrationException; @@ -126,6 +127,10 @@ protected function scrapeHandle(): void } } + if (CoordinatorManager::until(Coord::WORKER_EXIT)->isClosing()) { + return; + } + $server = $this->factory->make($host, (int) $port); Coroutine::create(static function () use ($server) { @@ -171,7 +176,7 @@ protected function customHandle(): void private function getNamespace(): string { $name = $this->config->get("metric.metric.{$this->name}.namespace"); - return preg_replace('#[^a-zA-Z0-9:_]#', '_', Str::snake($name)); + return preg_replace('#[^a-zA-Z0-9:_]#', '_', StrCache::snake($name)); } private function getUri(string $address, string $job): string diff --git a/src/Adapter/Prometheus/Redis.php b/src/Adapter/Prometheus/Redis.php index b2c0ea97a..1683f0a6d 100644 --- a/src/Adapter/Prometheus/Redis.php +++ b/src/Adapter/Prometheus/Redis.php @@ -22,20 +22,9 @@ class Redis implements Adapter { - /** - * @deprecated since 3.1, use `$metricGatherKeySuffix` instead - */ - public const PROMETHEUS_METRIC_KEYS_SUFFIX = '_METRIC_KEYS'; + private static string $metricGatherKeySuffix = ':metric_keys'; - /** - * @notice TODO: since 3.1, default value will be changed to ':metric_keys' - */ - private static string $metricGatherKeySuffix = '_METRIC_KEYS'; - - /** - * @notice TODO: since 3.1, default value will be changed to 'prometheus:' and should be non static - */ - private static string $prefix = 'PROMETHEUS_'; + private static string $prefix = 'prometheus:'; /** * @param \Redis $redis @@ -354,12 +343,7 @@ protected function collectSamples(string $metricType): array protected function toMetricKey(array $data): string { - // TODO: This is a hack, we should remove it since v3.1. - if (! str_ends_with(self::$prefix, ':')) { - $prefix = self::$prefix . ':'; - } - - return ($prefix ?? self::$prefix) . implode(':', [$data['type'] ?? '', $data['name'] ?? '']) . $this->getRedisTag($data['type'] ?? ''); + return self::$prefix . implode(':', [$data['type'] ?? '', $data['name'] ?? '']) . $this->getRedisTag($data['type'] ?? ''); } protected function getMetricGatherKey(string $metricType): string diff --git a/src/Adapter/Prometheus/RedisStorageFactory.php b/src/Adapter/Prometheus/RedisStorageFactory.php index 9add69dc9..a864344bb 100644 --- a/src/Adapter/Prometheus/RedisStorageFactory.php +++ b/src/Adapter/Prometheus/RedisStorageFactory.php @@ -29,8 +29,7 @@ public function __invoke(ContainerInterface $container): Redis $redisFactory = $container->get(RedisFactory::class); Redis::setPrefix($config->get('metric.metric.prometheus.redis_prefix', $config->get('app_name', 'skeleton'))); - // TODO: since 3.1, default value will be changed to ':metric_keys' - Redis::setMetricGatherKeySuffix($config->get('metric.metric.prometheus.redis_gather_key_suffix', '_METRIC_KEYS')); + Redis::setMetricGatherKeySuffix($config->get('metric.metric.prometheus.redis_gather_key_suffix', ':metric_keys')); return new Redis($redisFactory->get($config->get('metric.metric.prometheus.redis_config', 'default'))); } diff --git a/src/Adapter/RemoteProxy/Counter.php b/src/Adapter/RemoteProxy/Counter.php index cc3b2bdb4..500c8d7d6 100644 --- a/src/Adapter/RemoteProxy/Counter.php +++ b/src/Adapter/RemoteProxy/Counter.php @@ -11,13 +11,12 @@ */ namespace Hyperf\Metric\Adapter\RemoteProxy; +use Hyperf\Context\ApplicationContext; use Hyperf\Metric\Contract\CounterInterface; -use Hyperf\Process\ProcessCollector; +use Hyperf\Metric\Contract\MetricCollectorInterface; class Counter implements CounterInterface { - protected const TARGET_PROCESS_NAME = 'metric'; - /** * @var string[] */ @@ -38,7 +37,9 @@ public function with(string ...$labelValues): static public function add(int $delta): void { $this->delta = $delta; - $process = ProcessCollector::get(static::TARGET_PROCESS_NAME)[0]; - $process->write(serialize($this)); + + ApplicationContext::getContainer() + ->get(MetricCollectorInterface::class) + ->add($this); } } diff --git a/src/Adapter/RemoteProxy/Gauge.php b/src/Adapter/RemoteProxy/Gauge.php index 9066d9b34..c31afa0f5 100644 --- a/src/Adapter/RemoteProxy/Gauge.php +++ b/src/Adapter/RemoteProxy/Gauge.php @@ -11,13 +11,12 @@ */ namespace Hyperf\Metric\Adapter\RemoteProxy; +use Hyperf\Context\ApplicationContext; use Hyperf\Metric\Contract\GaugeInterface; -use Hyperf\Process\ProcessCollector; +use Hyperf\Metric\Contract\MetricCollectorInterface; class Gauge implements GaugeInterface { - protected const TARGET_PROCESS_NAME = 'metric'; - /** * @var string[] */ @@ -41,15 +40,19 @@ public function set(float $value): void { $this->value = $value; $this->delta = null; - $process = ProcessCollector::get(static::TARGET_PROCESS_NAME)[0]; - $process->write(serialize($this)); + + ApplicationContext::getContainer() + ->get(MetricCollectorInterface::class) + ->add($this); } public function add(float $delta): void { $this->delta = $delta; $this->value = null; - $process = ProcessCollector::get(static::TARGET_PROCESS_NAME)[0]; - $process->write(serialize($this)); + + ApplicationContext::getContainer() + ->get(MetricCollectorInterface::class) + ->add($this); } } diff --git a/src/Adapter/RemoteProxy/Histogram.php b/src/Adapter/RemoteProxy/Histogram.php index 1857b55da..27d704706 100644 --- a/src/Adapter/RemoteProxy/Histogram.php +++ b/src/Adapter/RemoteProxy/Histogram.php @@ -11,13 +11,12 @@ */ namespace Hyperf\Metric\Adapter\RemoteProxy; +use Hyperf\Context\ApplicationContext; use Hyperf\Metric\Contract\HistogramInterface; -use Hyperf\Process\ProcessCollector; +use Hyperf\Metric\Contract\MetricCollectorInterface; class Histogram implements HistogramInterface { - protected const TARGET_PROCESS_NAME = 'metric'; - /** * @var string[] */ @@ -38,7 +37,9 @@ public function with(string ...$labelValues): static public function put(float $sample): void { $this->sample = $sample; - $process = ProcessCollector::get(static::TARGET_PROCESS_NAME)[0]; - $process->write(serialize($this)); + + ApplicationContext::getContainer() + ->get(MetricCollectorInterface::class) + ->add($this); } } diff --git a/src/Adapter/RemoteProxy/MetricCollector.php b/src/Adapter/RemoteProxy/MetricCollector.php new file mode 100644 index 000000000..8d0bc149d --- /dev/null +++ b/src/Adapter/RemoteProxy/MetricCollector.php @@ -0,0 +1,49 @@ +buffer[] = $data; + + if (count($this->buffer) >= $this->bufferSize) { + $this->flush(); + } + } + + public function flush(): void + { + $process = ProcessCollector::get(static::TARGET_PROCESS_NAME)[0]; + $buffer = $this->buffer; + $this->buffer = []; + $process->write(serialize($buffer)); + } + + public function getBuffer(): array + { + return $this->buffer; + } +} diff --git a/src/Adapter/RemoteProxy/MetricCollectorFactory.php b/src/Adapter/RemoteProxy/MetricCollectorFactory.php new file mode 100644 index 000000000..bdd33dea1 --- /dev/null +++ b/src/Adapter/RemoteProxy/MetricCollectorFactory.php @@ -0,0 +1,34 @@ +get(ConfigInterface::class); + + return new MetricCollector( + (int) $config->get('metric.buffer_size', 200) + ); + } +} diff --git a/src/ConfigProvider.php b/src/ConfigProvider.php index 89001cae9..ecff07a19 100644 --- a/src/ConfigProvider.php +++ b/src/ConfigProvider.php @@ -21,6 +21,9 @@ use Hyperf\Metric\Contract\MetricFactoryInterface; use Hyperf\Metric\Contract\SqlSanitizerInterface; use Hyperf\Metric\Listener\DbQueryExecutedMetricListener; +use Hyperf\Metric\Adapter\RemoteProxy\MetricCollectorFactory; +use Hyperf\Metric\Contract\MetricCollectorInterface; +use Hyperf\Metric\Listener\MetricBufferWatcher; use Hyperf\Metric\Listener\OnBeforeHandle; use Hyperf\Metric\Listener\OnCoroutineServerStart; use Hyperf\Metric\Listener\OnMetricFactoryReady; @@ -45,6 +48,7 @@ public function __invoke(): array Connection::class => StatsDConnection::class, DriverInterface::class => Guzzle::class, SqlSanitizerInterface::class => SqlSanitizer::class, + MetricCollectorInterface::class => MetricCollectorFactory::class, ], 'aspects' => [ CounterAnnotationAspect::class, @@ -68,6 +72,7 @@ public function __invoke(): array OnBeforeHandle::class, OnWorkerStart::class, OnCoroutineServerStart::class, + MetricBufferWatcher::class, ], 'middlewares' => [ MetricMiddleware::class, diff --git a/src/Contract/MetricCollectorInterface.php b/src/Contract/MetricCollectorInterface.php new file mode 100644 index 000000000..54b95ac98 --- /dev/null +++ b/src/Contract/MetricCollectorInterface.php @@ -0,0 +1,19 @@ +config = $container->get(ConfigInterface::class); + $this->collector = $container->get(MetricCollectorInterface::class); + $this->timer = new Timer(); + } + + /** + * @return string[] returns the events that you want to listen + */ + public function listen(): array + { + return [ + BeforeWorkerStart::class, + ]; + } + + /** + * Handle the Event when the event is triggered, all listeners will + * complete before the event is returned to the EventDispatcher. + */ + public function process(object $event): void + { + if ($event->workerId === null) { + return; + } + + /* + * Only start buffer watcher in standalone process mode + */ + if (! $this->config->get('metric.use_standalone_process', true)) { + return; + } + + $timerInterval = $this->config->get('metric.buffer_interval', 5); + $timerId = $this->timer->tick($timerInterval, function () { + $this->collector->flush(); + }); + // Clean up timer on worker exit; + Coroutine::create(function () use ($timerId) { + CoordinatorManager::until(Constants::WORKER_EXIT)->yield(); + $this->timer->clear($timerId); + }); + } +} diff --git a/src/Listener/OnBeforeHandle.php b/src/Listener/OnBeforeHandle.php index 6a9be1310..206432dc1 100644 --- a/src/Listener/OnBeforeHandle.php +++ b/src/Listener/OnBeforeHandle.php @@ -63,6 +63,10 @@ public function process(object $event): void return; } + if (! $this->config->get('metric.enable_command_metric', true)) { + return; + } + MetricFactoryPicker::$isCommand = true; if ($this->config->get('metric.use_standalone_process', true)) { diff --git a/src/Listener/OnPipeMessage.php b/src/Listener/OnPipeMessage.php index 5e838f846..9ab0d7bf5 100644 --- a/src/Listener/OnPipeMessage.php +++ b/src/Listener/OnPipeMessage.php @@ -18,14 +18,19 @@ use Hyperf\Metric\Adapter\RemoteProxy\Histogram; use Hyperf\Metric\Contract\MetricFactoryInterface; use Hyperf\Process\Event\PipeMessage; - -use function Hyperf\Support\make; +use Psr\Container\ContainerInterface; /** * Receives messages in metric process. */ class OnPipeMessage implements ListenerInterface { + protected MetricFactoryInterface $factory; + + public function __construct(protected ContainerInterface $container) + { + } + /** * @return string[] returns the events that you want to listen */ @@ -42,32 +47,41 @@ public function listen(): array */ public function process(object $event): void { - Coroutine::create(function () use ($event) { - if ($event instanceof PipeMessage) { - $factory = make(MetricFactoryInterface::class); - $inner = $event->data; - switch (true) { - case $inner instanceof Counter: - $counter = $factory->makeCounter($inner->name, $inner->labelNames); - $counter->with(...$inner->labelValues)->add($inner->delta); - break; - case $inner instanceof Gauge: - $gauge = $factory->makeGauge($inner->name, $inner->labelNames); - if (isset($inner->value)) { - $gauge->with(...$inner->labelValues)->set($inner->value); - } else { - $gauge->with(...$inner->labelValues)->add($inner->delta); - } - break; - case $inner instanceof Histogram: - $histogram = $factory->makeHistogram($inner->name, $inner->labelNames); - $histogram->with(...$inner->labelValues)->put($inner->sample); - break; - default: - // Nothing to do - break; + if (! $event instanceof PipeMessage) { + return; + } + + $this->factory = $this->container->get(MetricFactoryInterface::class); + $inner = ! is_array($event->data) ? [$event->data] : $event->data; + foreach ($inner as $data) { + Coroutine::create(function () use ($data) { + $this->processData($data); + }); + } + } + + protected function processData(object $data): void + { + switch (true) { + case $data instanceof Counter: + $counter = $this->factory->makeCounter($data->name, $data->labelNames); + $counter->with(...$data->labelValues)->add($data->delta); + break; + case $data instanceof Gauge: + $gauge = $this->factory->makeGauge($data->name, $data->labelNames); + if (isset($data->value)) { + $gauge->with(...$data->labelValues)->set($data->value); + } else { + $gauge->with(...$data->labelValues)->add($data->delta); } - } - }); + break; + case $data instanceof Histogram: + $histogram = $this->factory->makeHistogram($data->name, $data->labelNames); + $histogram->with(...$data->labelValues)->put($data->sample); + break; + default: + // Nothing to do + break; + } } } diff --git a/tests/Adapter/Prometheus/RedisStorageFactoryTest.php b/tests/Adapter/Prometheus/RedisStorageFactoryTest.php index abe1622d9..5a55103d2 100644 --- a/tests/Adapter/Prometheus/RedisStorageFactoryTest.php +++ b/tests/Adapter/Prometheus/RedisStorageFactoryTest.php @@ -18,6 +18,7 @@ use Hyperf\Redis\RedisFactory; use Hyperf\Redis\RedisProxy; use Mockery; +use PHPUnit\Framework\Attributes\CoversNothing; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; use ReflectionProperty; @@ -26,6 +27,7 @@ * @internal * @coversNothing */ +#[CoversNothing] class RedisStorageFactoryTest extends TestCase { protected string $prePrefix; @@ -37,10 +39,7 @@ protected function setUp(): void parent::setUp(); $prefixProperty = new ReflectionProperty(Redis::class, 'prefix'); - $prefixProperty->setAccessible(true); - $metricGatherKeySuffix = new ReflectionProperty(Redis::class, 'metricGatherKeySuffix'); - $metricGatherKeySuffix->setAccessible(true); $this->prePrefix = $prefixProperty->getDefaultValue(); $this->preMetricGatherKeySuffix = $metricGatherKeySuffix->getDefaultValue(); @@ -69,14 +68,12 @@ public function testEmptyMetricRedisConfig() $redis = $factory($container); $prefixProperty = new ReflectionProperty(Redis::class, 'prefix'); - $prefixProperty->setAccessible(true); $metricGatherKeySuffixProperty = new ReflectionProperty(Redis::class, 'metricGatherKeySuffix'); - $metricGatherKeySuffixProperty->setAccessible(true); self::assertInstanceOf(Redis::class, $redis); self::assertEquals('skeleton', $prefixProperty->getValue($redis)); - self::assertEquals('_METRIC_KEYS', $metricGatherKeySuffixProperty->getValue($redis)); + self::assertEquals(':metric_keys', $metricGatherKeySuffixProperty->getValue($redis)); } public function testNewConfig() @@ -102,13 +99,42 @@ public function testNewConfig() $redis = $factory($container); $prefixProperty = new ReflectionProperty(Redis::class, 'prefix'); - $prefixProperty->setAccessible(true); $metricGatherKeySuffixProperty = new ReflectionProperty(Redis::class, 'metricGatherKeySuffix'); - $metricGatherKeySuffixProperty->setAccessible(true); self::assertInstanceOf(Redis::class, $redis); self::assertEquals('prometheus:', $prefixProperty->getValue($redis)); self::assertEquals(':metric_keys', $metricGatherKeySuffixProperty->getValue($redis)); } + + public function testCustomConfig() + { + $redisFactory = Mockery::mock(RedisFactory::class); + $redisFactory->shouldReceive('get')->with('custom')->andReturn(Mockery::mock(RedisProxy::class)); + + $container = Mockery::mock(ContainerInterface::class); + $container->shouldReceive('get')->with(ConfigInterface::class)->andReturn(new Config([ + 'metric' => [ + 'metric' => [ + 'prometheus' => [ + 'redis_config' => 'custom', + 'redis_prefix' => 'custom:', + 'redis_gather_key_suffix' => ':custom', + ], + ], + ], + ])); + $container->shouldReceive('get')->with(RedisFactory::class)->andReturn($redisFactory); + + $factory = new RedisStorageFactory(); + $redis = $factory($container); + + $prefixProperty = new ReflectionProperty(Redis::class, 'prefix'); + + $metricGatherKeySuffixProperty = new ReflectionProperty(Redis::class, 'metricGatherKeySuffix'); + + self::assertInstanceOf(Redis::class, $redis); + self::assertEquals('custom:', $prefixProperty->getValue($redis)); + self::assertEquals(':custom', $metricGatherKeySuffixProperty->getValue($redis)); + } } diff --git a/tests/Adapter/Prometheus/RedisTest.php b/tests/Adapter/Prometheus/RedisTest.php index 11b925f72..65eafdcb4 100644 --- a/tests/Adapter/Prometheus/RedisTest.php +++ b/tests/Adapter/Prometheus/RedisTest.php @@ -13,6 +13,7 @@ use Hyperf\Metric\Adapter\Prometheus\Redis; use Mockery; +use PHPUnit\Framework\Attributes\CoversNothing; use PHPUnit\Framework\TestCase; use Prometheus\Counter; use Prometheus\Histogram; @@ -23,6 +24,7 @@ * @internal * @coversNothing */ +#[CoversNothing] class RedisTest extends TestCase { protected string $prePrefix; @@ -34,10 +36,7 @@ protected function setUp(): void parent::setUp(); $prefixProperty = new ReflectionProperty(Redis::class, 'prefix'); - $prefixProperty->setAccessible(true); - $metricGatherKeySuffix = new ReflectionProperty(Redis::class, 'metricGatherKeySuffix'); - $metricGatherKeySuffix->setAccessible(true); $this->prePrefix = $prefixProperty->getDefaultValue(); $this->preMetricGatherKeySuffix = $metricGatherKeySuffix->getDefaultValue(); @@ -62,22 +61,14 @@ public function testToMetricKey() Redis::setPrefix('prometheus:'); $method = new ReflectionMethod(Redis::class, 'toMetricKey'); - $method->setAccessible(true); self::assertEquals('prometheus:counter:hyperf_metric{counter}', $method->invoke(new Redis(new \Redis()), $data)); - - // 兼容 < v3.1 - Redis::setPrefix('PROMETHEUS_'); - $method = new ReflectionMethod(Redis::class, 'toMetricKey'); - $method->setAccessible(true); - self::assertEquals('PROMETHEUS_:counter:hyperf_metric{counter}', $method->invoke(new Redis(new \Redis()), $data)); } public function testGetMetricGatherKey() { $method = new ReflectionMethod(Redis::class, 'getMetricGatherKey'); - $method->setAccessible(true); - self::assertEquals('PROMETHEUS_counter_METRIC_KEYS{counter}', $method->invoke(new Redis(new \Redis()), Counter::TYPE)); + self::assertEquals('prometheus:counter:metric_keys{counter}', $method->invoke(new Redis(new \Redis()), Counter::TYPE)); } public function testCollectSamples() @@ -105,7 +96,6 @@ public function testCollectSamples() ); $method = new ReflectionMethod(Redis::class, 'collectSamples'); - $method->setAccessible(true); $result = $method->invoke(new Redis($redis), Counter::TYPE); self::assertEquals([ @@ -158,7 +148,6 @@ public function testCollectSamplesLabelNameNotMatch() ); $method = new ReflectionMethod(Redis::class, 'collectSamples'); - $method->setAccessible(true); $result = $method->invoke(new Redis($redis), Counter::TYPE); self::assertEquals([ @@ -202,7 +191,6 @@ public function testCollectHistograms() ); $method = new ReflectionMethod(Redis::class, 'collectHistograms'); - $method->setAccessible(true); $result = $method->invoke(new Redis($redis), Histogram::TYPE); self::assertEquals([ @@ -307,7 +295,6 @@ public function testCollectHistogramsLabelNotMatch() ); $method = new ReflectionMethod(Redis::class, 'collectHistograms'); - $method->setAccessible(true); $result = $method->invoke(new Redis($redis), Histogram::TYPE); self::assertEquals([ diff --git a/tests/Adapter/RemoteProxy/MetricCollectorTest.php b/tests/Adapter/RemoteProxy/MetricCollectorTest.php new file mode 100644 index 000000000..e445ae81a --- /dev/null +++ b/tests/Adapter/RemoteProxy/MetricCollectorTest.php @@ -0,0 +1,81 @@ +assertSame(0, count($collector->getBuffer())); + + $collector->add($data = new stdClass()); + + $this->assertSame(1, count($collector->getBuffer())); + } + + public function testFlush() + { + $this->mockProcessCollector(); + + $collector = new MetricCollector(100); + $collector->add(new stdClass()); + $collector->flush(); + + $this->assertSame(0, count($collector->getBuffer())); + } + + public function testAddDataWithFlush() + { + $this->mockProcessCollector(); + + $collector = new MetricCollector(1); + $collector->add(new stdClass()); + + $this->assertSame(0, count($collector->getBuffer())); + } + + protected function mockProcessCollector() + { + if ($this->processMocked) { + return; + } + + $process = Mockery::mock(Process::class); + $process->shouldReceive('write'); + + ProcessCollector::add('metric', $process); + + $this->processMocked = true; + } +} diff --git a/tests/Cases/MetricFactoryPickerTest.php b/tests/Cases/MetricFactoryPickerTest.php index 407f73deb..caa5dec55 100644 --- a/tests/Cases/MetricFactoryPickerTest.php +++ b/tests/Cases/MetricFactoryPickerTest.php @@ -21,12 +21,14 @@ use Hyperf\Metric\MetricFactoryPicker; use Hyperf\Process\ProcessCollector; use Mockery; +use PHPUnit\Framework\Attributes\CoversNothing; use PHPUnit\Framework\TestCase; /** * @internal * @coversNothing */ +#[CoversNothing] class MetricFactoryPickerTest extends TestCase { protected function tearDown(): void diff --git a/tests/Cases/MetricFactoryTest.php b/tests/Cases/MetricFactoryTest.php index 742a95de8..0b90f09ed 100644 --- a/tests/Cases/MetricFactoryTest.php +++ b/tests/Cases/MetricFactoryTest.php @@ -18,11 +18,17 @@ use Hyperf\Metric\Adapter\Prometheus\Constants; use Hyperf\Metric\Adapter\Prometheus\MetricFactory as PrometheusFactory; use Mockery; +use PHPUnit\Framework\Attributes\CoversNothing; use PHPUnit\Framework\TestCase; use Prometheus\CollectorRegistry; use ReflectionClass; use ReflectionMethod; +/** + * @internal + * @coversNothing + */ +#[CoversNothing] /** * @internal * @coversNothing @@ -55,7 +61,6 @@ public function testPrometheusGetUri() $p = new PrometheusFactory($config, $r, $c, $l, new ServerFactory($l)); $ref = new ReflectionClass($p); $method = $ref->getMethod('getUri'); - $method->setAccessible(true); $this->assertStringContainsString('http://127.0.0.1/metrics/job/metric/ip/', $method->invokeArgs($p, ['127.0.0.1', 'metric'])); $this->assertStringContainsString('https://127.0.0.1/metrics/job/metric/ip/', $method->invokeArgs($p, ['https://127.0.0.1', 'metric'])); $this->assertStringContainsString('http://127.0.0.1:8080/metrics/job/metric/ip/', $method->invokeArgs($p, ['127.0.0.1:8080', 'metric'])); @@ -81,7 +86,6 @@ public function testGetNamespace() $l = Mockery::mock(StdoutLoggerInterface::class); $p = new PrometheusFactory($config, $r, $c, $l, new ServerFactory($l)); $method = new ReflectionMethod(PrometheusFactory::class, 'getNamespace'); - $method->setAccessible(true); $this->assertEquals('hello__world_', $method->invoke($p)); } } diff --git a/tests/Cases/OnWorkerStartTest.php b/tests/Cases/OnWorkerStartTest.php index 33abf16b3..e981ef20c 100644 --- a/tests/Cases/OnWorkerStartTest.php +++ b/tests/Cases/OnWorkerStartTest.php @@ -18,6 +18,7 @@ use Hyperf\Metric\Contract\MetricFactoryInterface; use Hyperf\Metric\Listener\OnWorkerStart; use Mockery; +use PHPUnit\Framework\Attributes\CoversNothing; use PHPUnit\Framework\TestCase; use Psr\EventDispatcher\EventDispatcherInterface; @@ -25,6 +26,7 @@ * @internal * @coversNothing */ +#[CoversNothing] class OnWorkerStartTest extends TestCase { protected function tearDown(): void diff --git a/tests/Cases/TimerTest.php b/tests/Cases/TimerTest.php index 57caa6654..c19e0213f 100644 --- a/tests/Cases/TimerTest.php +++ b/tests/Cases/TimerTest.php @@ -17,12 +17,14 @@ use Hyperf\Metric\Contract\MetricFactoryInterface; use Hyperf\Metric\Timer; use Mockery; +use PHPUnit\Framework\Attributes\CoversNothing; use PHPUnit\Framework\TestCase; /** * @internal * @coversNothing */ +#[CoversNothing] class TimerTest extends TestCase { protected function tearDown(): void From e1f2243a8ec0d98b072fc4f05c3f1b8b4e1acc29 Mon Sep 17 00:00:00 2001 From: celosauro <52496242+celosauro@users.noreply.github.com> Date: Thu, 25 Apr 2024 11:41:42 -0300 Subject: [PATCH 20/38] =?UTF-8?q?Add:=20Sanitiza=C3=A7=C3=A3o=20de=20Andro?= =?UTF-8?q?idID=20na=20URI=20(#12)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add: AndroidID Regex * Add: AndroidID Regex --- tests/Cases/UriTest.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index b1fe4d1ea..e9bd1abd8 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -88,4 +88,13 @@ public function testAddsInitialSlash(): void self::assertSame('/v1/test', Uri::sanitize('v1/test')); self::assertSame('/v1/test/', Uri::sanitize('v1/test/')); } + + public function testAndroidId(): void + { + self::assertSame('/device//user/', Uri::sanitize('/devices/a436d9ffefef80e8/user/999')); + self::assertSame('/device//user/', Uri::sanitize('/devices/7b5d68f217d90ff5/user/999')); + self::assertSame('/device//user/', Uri::sanitize('/devices/dc900fb903cc308c/user/999')); + self::assertSame('/device//user/', Uri::sanitize('/devices/86d144c9078c8176/user/999')); + self::assertSame('/device//user/', Uri::sanitize('/devices/86d144c9078c8176/user/8045169')); + } } From 18c311beae99237f3c4ddf16a47cc0c0d766143e Mon Sep 17 00:00:00 2001 From: Fernando Correia <58527615+fernandocorreia26@users.noreply.github.com> Date: Fri, 26 Apr 2024 10:07:10 -0300 Subject: [PATCH 21/38] FIX: regex to catch OID between 16 to 24 caracteres (#15) fix regex short oid --- src/Support/Uri.php | 2 +- tests/Cases/UriTest.php | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Support/Uri.php b/src/Support/Uri.php index bea0df471..c97028194 100644 --- a/src/Support/Uri.php +++ b/src/Support/Uri.php @@ -19,7 +19,7 @@ public static function sanitize(string $uri): string [ '/\/(?<=\/)([A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12})(?=\/)?/i', '/\/(?<=\/)([A-Z]{3}-?\d[0-9A-Z]\d{2})(?=\/)?/i', - '/\/(?<=\/)[0-9A-F]{24}(?=\/)?/i', + '/\/(?<=\/)[0-9A-F]{16,24}(?=\/)?/i', '/\/(?<=\/)\d+(?=\/)?/', ], [ diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index e9bd1abd8..0f1213fc4 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -68,6 +68,7 @@ public function testClearUriUuids(): void public function testClearUriOids(): void { $oid = '650229807612bba4984d1fc7'; + $oidShort = '65022612bba84d1f'; self::assertSame('/v1/test', Uri::sanitize('/v1/test')); self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$oid}")); @@ -77,6 +78,7 @@ public function testClearUriOids(): void self::assertSame('/v6/test///', Uri::sanitize("/v6/test/{$oid}/{$oid}/")); self::assertSame('/v7/test///', Uri::sanitize("/v7/test/{$oid}/{$oid}/{$oid}")); self::assertSame('/v8/test////', Uri::sanitize("/v8/test/{$oid}/{$oid}/{$oid}/")); + self::assertSame('/v9/test//bar/', Uri::sanitize("/v9/test/{$oidShort}/bar/12345")); } public function testAddsInitialSlash(): void From 49b40a2d4fb34c551df44178ef9168344ad1bb8c Mon Sep 17 00:00:00 2001 From: Lucas Angeli <81924557+lucas-angeli-gimenes@users.noreply.github.com> Date: Tue, 21 May 2024 15:40:51 -0300 Subject: [PATCH 22/38] HTTP Pool Metrics (#17) --- src/Listener/HttpPoolWatcher.php | 73 ++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/Listener/HttpPoolWatcher.php diff --git a/src/Listener/HttpPoolWatcher.php b/src/Listener/HttpPoolWatcher.php new file mode 100644 index 000000000..16a6c4fa2 --- /dev/null +++ b/src/Listener/HttpPoolWatcher.php @@ -0,0 +1,73 @@ +timer = new Timer(); + } + + public function listen(): array + { + return [ + BeforeWorkerStart::class, + MainCoroutineServerStart::class, + ]; + } + + public function process(object $event): void + { + /** @var PoolFactory $factory */ + $factory = $this->container->get(PoolFactory::class); + $worker = (string) ($event->workerId ?? 0); + + $config = $this->container->get(ConfigInterface::class); + + $timer_interval = $config->get('metric.default_metric_interval', 5); + + $this->timer->tick($timer_interval, function () use ($factory, $worker) { + foreach ($factory->getPoolNames() as $name) { + if (strpos($name, self::GUZZLE_PREFIX) !== 0) { + continue; + } + + $pool = $factory->get($name, function () {}); + + $labels = [ + 'worker' => $worker, + 'pool' => implode('.', array_slice(explode('.', (string) $name), 2, -2)), + ]; + + Metric::gauge('http_connections_in_use', (float) $pool->getCurrentConnections(), $labels); + Metric::gauge('http_connections_in_waiting', (float) $pool->getConnectionsInChannel(), $labels); + Metric::gauge('http_max_connections', (float) $pool->getOption()->getMaxConnections(), $labels); + } + }); + } +} From dbc5b40e6d6a2ec02d61c2046bc5c92ac62bcd95 Mon Sep 17 00:00:00 2001 From: Adrysson Santos <96138268+adrysson1@users.noreply.github.com> Date: Mon, 1 Jul 2024 09:54:16 -0300 Subject: [PATCH 23/38] Added: Ignore sha1 hashes in url (#19) --- src/Support/Uri.php | 2 ++ tests/Cases/UriTest.php | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/Support/Uri.php b/src/Support/Uri.php index c97028194..653551b64 100644 --- a/src/Support/Uri.php +++ b/src/Support/Uri.php @@ -17,12 +17,14 @@ public static function sanitize(string $uri): string { return preg_replace( [ + '/\/(?<=\/)[a-f0-9]{40}(?=\/)?/i', '/\/(?<=\/)([A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12})(?=\/)?/i', '/\/(?<=\/)([A-Z]{3}-?\d[0-9A-Z]\d{2})(?=\/)?/i', '/\/(?<=\/)[0-9A-F]{16,24}(?=\/)?/i', '/\/(?<=\/)\d+(?=\/)?/', ], [ + '/', '/', '/', '/', diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index 0f1213fc4..f107504d1 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -99,4 +99,23 @@ public function testAndroidId(): void self::assertSame('/device//user/', Uri::sanitize('/devices/86d144c9078c8176/user/999')); self::assertSame('/device//user/', Uri::sanitize('/devices/86d144c9078c8176/user/8045169')); } + + public function testSanitizeHashsStrings(): void + { + self::assertSame('/v1/test', Uri::sanitize('/v1/test')); + self::assertSame('/v2/test/', Uri::sanitize('/v2/test/141da78905dcaa7ed8d4da7c3f49a2415ebdc110')); + self::assertSame('/v2/test/', Uri::sanitize('/v2/test/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220')); + self::assertSame('/v3/test//bar', Uri::sanitize('/v3/test/81FE8BFE87576C3ECB22426F8E57847382917ACF/bar')); + self::assertSame('/v3/test//bar', Uri::sanitize('/v3/test/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220/bar')); + self::assertSame('/v4/test//bar//', Uri::sanitize('/v4/test/141da78905dcaa7ed8d4da7c3f49a2415ebdc110/bar/141da78905dcaa7ed8d4da7c3f49a2415ebdc110/')); + self::assertSame('/v4/test//bar//', Uri::sanitize('/v4/test/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220/bar/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220/')); + self::assertSame('/v5/test//', Uri::sanitize('/v5/test/141da78905dcaa7ed8d4da7c3f49a2415ebdc110/141da78905dcaa7ed8d4da7c3f49a2415ebdc110')); + self::assertSame('/v5/test//', Uri::sanitize('/v5/test/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220')); + self::assertSame('/v6/test///', Uri::sanitize('/v6/test/141da78905dcaa7ed8d4da7c3f49a2415ebdc110/141da78905dcaa7ed8d4da7c3f49a2415ebdc110/')); + self::assertSame('/v6/test///', Uri::sanitize('/v6/test/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220/')); + self::assertSame('/v7/test///', Uri::sanitize('/v7/test/141da78905dcaa7ed8d4da7c3f49a2415ebdc110/141da78905dcaa7ed8d4da7c3f49a2415ebdc110/141da78905dcaa7ed8d4da7c3f49a2415ebdc110')); + self::assertSame('/v7/test///', Uri::sanitize('/v7/test/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220')); + self::assertSame('/v8/test////', Uri::sanitize('/v8/test/141da78905dcaa7ed8d4da7c3f49a2415ebdc110/141da78905dcaa7ed8d4da7c3f49a2415ebdc110/141da78905dcaa7ed8d4da7c3f49a2415ebdc110/')); + self::assertSame('/v8/test////', Uri::sanitize('/v8/test/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220/')); + } } From c435545e6b192f85a4ed8286d20dec60e45dad44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=A1vio=20Heleno?= Date: Thu, 10 Oct 2024 11:18:04 -0300 Subject: [PATCH 24/38] Add ignore path capability (#20) Add ignore_path configuration --- src/Middleware/MetricMiddleware.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Middleware/MetricMiddleware.php b/src/Middleware/MetricMiddleware.php index a1797ab1c..adc2b877f 100644 --- a/src/Middleware/MetricMiddleware.php +++ b/src/Middleware/MetricMiddleware.php @@ -11,6 +11,7 @@ */ namespace Hyperf\Metric\Middleware; +use Hyperf\Contract\ConfigInterface; use Hyperf\HttpServer\Router\Dispatched; use Hyperf\Metric\Metric; use Hyperf\Metric\Support\Uri; @@ -23,6 +24,14 @@ class MetricMiddleware implements MiddlewareInterface { + protected array $config; + + public function __construct( + ConfigInterface $config, + ) { + $this->config = $config->get('metric'); + } + /** * Process an incoming server request. * Processes an incoming server request in order to produce a response. @@ -31,6 +40,10 @@ class MetricMiddleware implements MiddlewareInterface */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { + if (! empty($this->config['ignore_path']) && preg_match($this->config['ignore_path'], $request->getUri()->getPath())) { + return $handler->handle($request); + } + $labels = [ 'request_status' => '500', 'request_path' => $this->getPath($request), From a577307c575ada431f314642b4d09f44ec8a0ea1 Mon Sep 17 00:00:00 2001 From: celosauro <52496242+celosauro@users.noreply.github.com> Date: Fri, 21 Feb 2025 13:39:48 -0300 Subject: [PATCH 25/38] Ignora URI (#21) --- src/Aspect/HttpClientMetricAspect.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Aspect/HttpClientMetricAspect.php b/src/Aspect/HttpClientMetricAspect.php index ec877a2c2..f7dc13b79 100644 --- a/src/Aspect/HttpClientMetricAspect.php +++ b/src/Aspect/HttpClientMetricAspect.php @@ -44,9 +44,11 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) $method = strtoupper($arguments['keys']['method'] ?? ''); $uri = $arguments['keys']['uri'] ?? ''; $host = $base_uri === null ? (parse_url($uri, PHP_URL_HOST) ?? '') : $base_uri->getHost(); - + $uri = $this->shouldIgnoreUri($instance) + ? '' + : SupportUri::sanitize(parse_url($uri, PHP_URL_PATH) ?? '/'); $labels = [ - 'uri' => SupportUri::sanitize(parse_url($uri, PHP_URL_PATH) ?? '/'), + 'uri' => $uri, 'host' => $host, 'method' => $method, 'http_status_code' => '200', @@ -90,4 +92,9 @@ private function onRejected(Timer $timer, array $labels): callable return Create::rejectionFor($exception); }; } + + private function shouldIgnoreUri(Client $instance): bool + { + return $instance->getConfig('ignore_uri') === true; + } } From 373a6544c43ee3a47e3056290d064257c5e0b2ab Mon Sep 17 00:00:00 2001 From: laurohenriqueappelt <153744838+laurohenriqueappelt@users.noreply.github.com> Date: Thu, 6 Mar 2025 13:13:30 -0300 Subject: [PATCH 26/38] add e2eid uri sanitize (#22) --- src/Support/Uri.php | 5 ++++- tests/Cases/UriTest.php | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Support/Uri.php b/src/Support/Uri.php index 653551b64..c6fde90f1 100644 --- a/src/Support/Uri.php +++ b/src/Support/Uri.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Support; final class Uri @@ -17,6 +18,7 @@ public static function sanitize(string $uri): string { return preg_replace( [ + '/\/(?<=\/)[ED]\d{8}\d{12}[0-9a-zA-Z]{11}(?=\/)?/', '/\/(?<=\/)[a-f0-9]{40}(?=\/)?/i', '/\/(?<=\/)([A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12})(?=\/)?/i', '/\/(?<=\/)([A-Z]{3}-?\d[0-9A-Z]\d{2})(?=\/)?/i', @@ -24,6 +26,7 @@ public static function sanitize(string $uri): string '/\/(?<=\/)\d+(?=\/)?/', ], [ + '/', '/', '/', '/', @@ -33,4 +36,4 @@ public static function sanitize(string $uri): string '/' . ltrim($uri, '/'), ); } -} +} \ No newline at end of file diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index f107504d1..e7612f658 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -118,4 +118,18 @@ public function testSanitizeHashsStrings(): void self::assertSame('/v8/test////', Uri::sanitize('/v8/test/141da78905dcaa7ed8d4da7c3f49a2415ebdc110/141da78905dcaa7ed8d4da7c3f49a2415ebdc110/141da78905dcaa7ed8d4da7c3f49a2415ebdc110/')); self::assertSame('/v8/test////', Uri::sanitize('/v8/test/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220/7110EDA4D09E062AA5E4A390B0A572AC0D2C0220/')); } + + public function testSanitizeEndToEndId(): void + { + $e2eid = 'E99999999202401010000abcDEF12345'; + + self::assertSame('/v1/test', Uri::sanitize('/v1/test')); + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$e2eid}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$e2eid}/bar")); + self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$e2eid}/bar/{$e2eid}/")); + self::assertSame('/v5/test//', Uri::sanitize("/v5/test/{$e2eid}/{$e2eid}")); + self::assertSame('/v6/test///', Uri::sanitize("/v6/test/{$e2eid}/{$e2eid}/")); + self::assertSame('/v7/test///', Uri::sanitize("/v7/test/{$e2eid}/{$e2eid}/{$e2eid}")); + self::assertSame('/v8/test////', Uri::sanitize("/v8/test/{$e2eid}/{$e2eid}/{$e2eid}/")); + } } From 9819eddb8b1633130ed8c2cf0553a54a164ef9b5 Mon Sep 17 00:00:00 2001 From: celosauro <52496242+celosauro@users.noreply.github.com> Date: Thu, 27 Mar 2025 13:30:51 -0300 Subject: [PATCH 27/38] Add: URI Mask config (#23) * WIP * Increment test * Fix testes * Fix testes * Fix testes * WIP * Delete .moonlight.yaml * Delete Dockerfile * Delete Makefile * Delete docker-compose.yml --------- Co-authored-by: Leo Cavalcante --- composer.json | 1 + src/Aspect/HttpClientMetricAspect.php | 14 +++++++++- src/Support/Uri.php | 40 +++++++++++++++------------ tests/Cases/UriTest.php | 18 ++++++++++++ 4 files changed, 55 insertions(+), 18 deletions(-) diff --git a/composer.json b/composer.json index 1ee495858..6be77097a 100644 --- a/composer.json +++ b/composer.json @@ -65,6 +65,7 @@ }, "scripts": { "test": "co-phpunit", + "test:filter": "co-phpunit --prepend test/bootstrap.php -c phpunit.xml --colors=always --testdox --filter", "test-coverage": "co-phpunit --coverage-clover clover.xml", "cs-fix": "php-cs-fixer fix $1", "analyse": "phpstan analyse --memory-limit=-1 -l 5 -c phpstan.neon", diff --git a/src/Aspect/HttpClientMetricAspect.php b/src/Aspect/HttpClientMetricAspect.php index f7dc13b79..3995b8f76 100644 --- a/src/Aspect/HttpClientMetricAspect.php +++ b/src/Aspect/HttpClientMetricAspect.php @@ -44,9 +44,10 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) $method = strtoupper($arguments['keys']['method'] ?? ''); $uri = $arguments['keys']['uri'] ?? ''; $host = $base_uri === null ? (parse_url($uri, PHP_URL_HOST) ?? '') : $base_uri->getHost(); + $uriMask = $this->getUriMask($instance); $uri = $this->shouldIgnoreUri($instance) ? '' - : SupportUri::sanitize(parse_url($uri, PHP_URL_PATH) ?? '/'); + : SupportUri::sanitize(parse_url($uri, PHP_URL_PATH) ?? '/', $uriMask); $labels = [ 'uri' => $uri, 'host' => $host, @@ -97,4 +98,15 @@ private function shouldIgnoreUri(Client $instance): bool { return $instance->getConfig('ignore_uri') === true; } + + public function getUriMask(Client $instance): array + { + $uriMask = $instance->getConfig('uri_mask'); + + if (is_array($uriMask) === false) { + return []; + } + + return $uriMask; + } } diff --git a/src/Support/Uri.php b/src/Support/Uri.php index c6fde90f1..2323c9552 100644 --- a/src/Support/Uri.php +++ b/src/Support/Uri.php @@ -14,25 +14,31 @@ final class Uri { - public static function sanitize(string $uri): string + public static function sanitize(string $uri, array $uriMask = []): string { return preg_replace( - [ - '/\/(?<=\/)[ED]\d{8}\d{12}[0-9a-zA-Z]{11}(?=\/)?/', - '/\/(?<=\/)[a-f0-9]{40}(?=\/)?/i', - '/\/(?<=\/)([A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12})(?=\/)?/i', - '/\/(?<=\/)([A-Z]{3}-?\d[0-9A-Z]\d{2})(?=\/)?/i', - '/\/(?<=\/)[0-9A-F]{16,24}(?=\/)?/i', - '/\/(?<=\/)\d+(?=\/)?/', - ], - [ - '/', - '/', - '/', - '/', - '/', - '/', - ], + array_merge( + array_keys($uriMask), + [ + '/\/(?<=\/)[ED]\d{8}\d{12}[0-9a-zA-Z]{11}(?=\/)?/', + '/\/(?<=\/)[a-f0-9]{40}(?=\/)?/i', + '/\/(?<=\/)([A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12})(?=\/)?/i', + '/\/(?<=\/)([A-Z]{3}-?\d[0-9A-Z]\d{2})(?=\/)?/i', + '/\/(?<=\/)[0-9A-F]{16,24}(?=\/)?/i', + '/\/(?<=\/)\d+(?=\/)?/', + ], + ), + array_merge( + array_values($uriMask), + [ + '/', + '/', + '/', + '/', + '/', + '/', + ], + ), '/' . ltrim($uri, '/'), ); } diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index e7612f658..ce62c5d6b 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -93,6 +93,8 @@ public function testAddsInitialSlash(): void public function testAndroidId(): void { + $this->markTestSkipped(); + self::assertSame('/device//user/', Uri::sanitize('/devices/a436d9ffefef80e8/user/999')); self::assertSame('/device//user/', Uri::sanitize('/devices/7b5d68f217d90ff5/user/999')); self::assertSame('/device//user/', Uri::sanitize('/devices/dc900fb903cc308c/user/999')); @@ -132,4 +134,20 @@ public function testSanitizeEndToEndId(): void self::assertSame('/v7/test///', Uri::sanitize("/v7/test/{$e2eid}/{$e2eid}/{$e2eid}")); self::assertSame('/v8/test////', Uri::sanitize("/v8/test/{$e2eid}/{$e2eid}/{$e2eid}/")); } + + public function testWithMaskParams(): void + { + $uriMask = [ + '/\/[a-f0-9]{64}/i' => '/', + ]; + + self::assertSame('/v1/test', Uri::sanitize('/v1/test', $uriMask)); + self::assertSame('/v2/test/', Uri::sanitize('/v2/test/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7', $uriMask)); + self::assertSame('/v3/test//bar', Uri::sanitize('/v3/test/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/bar', $uriMask)); + self::assertSame('/v4/test//bar//', Uri::sanitize('/v4/test/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/bar/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/', $uriMask)); + self::assertSame('/v5/test//', Uri::sanitize('/v5/test/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7', $uriMask)); + self::assertSame('/v6/test///', Uri::sanitize('/v6/test/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/', $uriMask)); + self::assertSame('/v7/test///', Uri::sanitize('/v7/test/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7', $uriMask)); + self::assertSame('/v8/test////', Uri::sanitize('/v8/test/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/', $uriMask)); + } } From 439460d94166ebd069c05f01fd37727ebefda014 Mon Sep 17 00:00:00 2001 From: Carlos Montezano Lopes Date: Tue, 1 Apr 2025 16:52:57 -0300 Subject: [PATCH 28/38] =?UTF-8?q?Inclui=20padr=C3=A3o=20de=20sanitiza?= =?UTF-8?q?=C3=A7=C3=A3o=20para=20LIMIT=20e=20OFFSET=20no=20sanitizador=20?= =?UTF-8?q?de=20queries=20SQL=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Incluir padrão de sanitização de LIMIT e OFFSET em SqlSanitizer --- src/Support/SqlSanitizer.php | 2 ++ tests/Cases/SqlSanitizerTest.php | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/Support/SqlSanitizer.php b/src/Support/SqlSanitizer.php index 783133a10..919e3aac0 100644 --- a/src/Support/SqlSanitizer.php +++ b/src/Support/SqlSanitizer.php @@ -22,6 +22,8 @@ public function sanitize(string $sql): string '/(?<=\()\d+(?=,\s)/', '/(?<=,\s)\d+(?=,\s)/', '/(?<=,\s)\d+(?=\))/', + '/(?<=LIMIT\s)\d+/', + '/(?<=OFFSET\s)\d+/', ]; return preg_replace($patterns, array_fill(0, count($patterns), '?'), $sql); diff --git a/tests/Cases/SqlSanitizerTest.php b/tests/Cases/SqlSanitizerTest.php index 3f4fc0581..74ec7a2f0 100644 --- a/tests/Cases/SqlSanitizerTest.php +++ b/tests/Cases/SqlSanitizerTest.php @@ -49,4 +49,19 @@ public function testSanitizeNumericIds(): void $sanitizer->sanitize('select * from `cards` where `owner_id` not in (1260361, 903023958, 880427302)') ); } + + public function testSanitizeLimitAndOffset(): void + { + $sanitizer = new SqlSanitizer(); + + self::assertSame( + 'select * from `cards` where `user_id` in (?) LIMIT ?', + $sanitizer->sanitize('select * from `cards` where `user_id` in (1) LIMIT 100') + ); + + self::assertSame( + 'select * from `cards` where `user_id` in (?) LIMIT ? OFFSET ?', + $sanitizer->sanitize('select * from `cards` where `user_id` in (1) LIMIT 100 OFFSET 100') + ); + } } From b8867b9475f159fc9487321d45083d52b0aa320b Mon Sep 17 00:00:00 2001 From: Carlos Montezano Lopes Date: Tue, 1 Apr 2025 17:43:32 -0300 Subject: [PATCH 29/38] =?UTF-8?q?Fix:=20Corrige=20padr=C3=B5es=20de=20sani?= =?UTF-8?q?tiza=C3=A7=C3=A3o=20de=20LIMIT=20e=20OFFSET=20para=20considerar?= =?UTF-8?q?am=20valores=20mai=C3=BAsculos=20e=20min=C3=BAsculos=20(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix para tratar OFFSET e LIMIT maiúsculos e minúsculos --- src/Support/SqlSanitizer.php | 4 ++-- tests/Cases/SqlSanitizerTest.php | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Support/SqlSanitizer.php b/src/Support/SqlSanitizer.php index 919e3aac0..93de00033 100644 --- a/src/Support/SqlSanitizer.php +++ b/src/Support/SqlSanitizer.php @@ -22,8 +22,8 @@ public function sanitize(string $sql): string '/(?<=\()\d+(?=,\s)/', '/(?<=,\s)\d+(?=,\s)/', '/(?<=,\s)\d+(?=\))/', - '/(?<=LIMIT\s)\d+/', - '/(?<=OFFSET\s)\d+/', + '/(?<=LIMIT\s)\d+/i', + '/(?<=OFFSET\s)\d+/i', ]; return preg_replace($patterns, array_fill(0, count($patterns), '?'), $sql); diff --git a/tests/Cases/SqlSanitizerTest.php b/tests/Cases/SqlSanitizerTest.php index 74ec7a2f0..652907672 100644 --- a/tests/Cases/SqlSanitizerTest.php +++ b/tests/Cases/SqlSanitizerTest.php @@ -63,5 +63,15 @@ public function testSanitizeLimitAndOffset(): void 'select * from `cards` where `user_id` in (?) LIMIT ? OFFSET ?', $sanitizer->sanitize('select * from `cards` where `user_id` in (1) LIMIT 100 OFFSET 100') ); + + self::assertSame( + 'select * from `cards` where `user_id` in (?) limit ?', + $sanitizer->sanitize('select * from `cards` where `user_id` in (1) limit 100') + ); + + self::assertSame( + 'select * from `cards` where `user_id` in (?) limit ? offset ?', + $sanitizer->sanitize('select * from `cards` where `user_id` in (1) limit 100 offset 100') + ); } } From 1be95d03b25172a82ae120f7fd5e9ee6ed62017a Mon Sep 17 00:00:00 2001 From: Luiz Carlos Manhani Junior <139877977+luizmanhani@users.noreply.github.com> Date: Mon, 18 Aug 2025 16:23:47 -0300 Subject: [PATCH 30/38] Bump hyperf 3.1 (#27) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [3.1]Bumps dependencies (#5796) Co-authored-by: 李铭昕 <715557344@qq.com> * Upgrade hyperf packages to version `~3.1.0` (#5801) * Bumps `phpunit` to `10.x` (#5802) Co-authored-by: 李铭昕 <715557344@qq.com> * Remove redundant `setAccessible` methods (#5811) * Remove deprecated codes (#5812) * Removed the deprecated code for metric. (#5847) * Use `StrCache` instead of `Str` in special cases. (#5866) * [feat] Support buffer mechanism in standalone process of metric (#6030) Co-authored-by: 李铭昕 <715557344@qq.com> * Fix the bug that cannot stop the command from terminating gracefully (#6090) * Upgrade actions/checkout to v4 (#6159) * Adds `metric.enable_command_metric` switch (#6272) * Changed the `branch-alias` of all components to `3.1-dev`. (#6320) * Update grafana.json (#6531) * Added comment (#6607) * Format code by the latest `cs-fixer`. (#6617) * Added composer.json normalize support (#6887) * Format code (#6994) * Improve actions (#7088) * update github actions for all components. (#7090) --------- Co-authored-by: Deeka Wong Co-authored-by: 李铭昕 <715557344@qq.com> Co-authored-by: yansongda Co-authored-by: Albert Chen Co-authored-by: 宣言就是Siam <59419979@qq.com> --- .github/workflows/close-pull-request.yml | 9 +++++++++ .github/workflows/release.yml | 11 +++++++++++ composer.json | 13 ++++++------- grafana.json | 10 +++++----- publish/metric.php | 3 ++- src/Adapter/InfluxDB/MetricFactory.php | 1 + src/Adapter/NoOp/Counter.php | 1 + src/Adapter/NoOp/Gauge.php | 1 + src/Adapter/NoOp/Histogram.php | 1 + src/Adapter/NoOp/MetricFactory.php | 1 + src/Adapter/Prometheus/Constants.php | 1 + src/Adapter/Prometheus/Counter.php | 1 + src/Adapter/Prometheus/Gauge.php | 1 + src/Adapter/Prometheus/Histogram.php | 1 + src/Adapter/Prometheus/MetricFactory.php | 1 + src/Adapter/Prometheus/Redis.php | 1 + src/Adapter/Prometheus/RedisStorageFactory.php | 1 + src/Adapter/RemoteProxy/Counter.php | 1 + src/Adapter/RemoteProxy/Gauge.php | 1 + src/Adapter/RemoteProxy/Histogram.php | 1 + src/Adapter/RemoteProxy/MetricCollector.php | 1 + src/Adapter/RemoteProxy/MetricCollectorFactory.php | 1 + src/Adapter/RemoteProxy/MetricFactory.php | 1 + src/Adapter/StatsD/Counter.php | 1 + src/Adapter/StatsD/Gauge.php | 1 + src/Adapter/StatsD/Histogram.php | 1 + src/Adapter/StatsD/MetricFactory.php | 1 + src/Annotation/Counter.php | 1 + src/Annotation/Histogram.php | 1 + src/Aspect/CounterAnnotationAspect.php | 1 + src/Aspect/HistogramAnnotationAspect.php | 1 + src/ConfigProvider.php | 1 + src/Contract/CounterInterface.php | 1 + src/Contract/GaugeInterface.php | 1 + src/Contract/HistogramInterface.php | 1 + src/Contract/MetricCollectorInterface.php | 1 + src/Contract/MetricFactoryInterface.php | 1 + src/CoroutineServerStats.php | 1 + src/Event/MetricFactoryReady.php | 1 + src/Exception/InvalidArgumentException.php | 1 + src/Exception/RuntimeException.php | 1 + src/Listener/DBPoolWatcher.php | 1 + src/Listener/MetricBufferWatcher.php | 1 + src/Listener/OnBeforeHandle.php | 1 + src/Listener/OnCoroutineServerStart.php | 1 + src/Listener/OnMetricFactoryReady.php | 1 + src/Listener/OnPipeMessage.php | 1 + src/Listener/OnWorkerStart.php | 4 +++- src/Listener/PoolWatcher.php | 1 + src/Listener/QueueWatcher.php | 1 + src/Listener/RedisPoolWatcher.php | 1 + src/Metric.php | 2 ++ src/MetricFactoryPicker.php | 1 + src/MetricSetter.php | 1 + src/Middleware/MetricMiddleware.php | 1 + src/Process/MetricProcess.php | 1 + src/Timer.php | 1 + .../Adapter/Prometheus/RedisStorageFactoryTest.php | 1 + tests/Adapter/Prometheus/RedisTest.php | 1 + tests/Adapter/RemoteProxy/MetricCollectorTest.php | 1 + tests/Cases/MetricFactoryPickerTest.php | 6 ++++-- tests/Cases/MetricFactoryTest.php | 1 + tests/Cases/OnWorkerStartTest.php | 11 ++++++----- tests/Cases/TimerTest.php | 3 ++- 64 files changed, 104 insertions(+), 22 deletions(-) create mode 100644 .github/workflows/close-pull-request.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/close-pull-request.yml b/.github/workflows/close-pull-request.yml new file mode 100644 index 000000000..4cbca9664 --- /dev/null +++ b/.github/workflows/close-pull-request.yml @@ -0,0 +1,9 @@ +name: Close Pull Request + +on: + pull_request_target: + types: [ opened ] + +jobs: + run: + uses: hyperf/.github/.github/workflows/close-pull-request.yml@master diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..8ec4a62c3 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,11 @@ +on: + push: + # Sequence of patterns matched against refs/tags + tags: + - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 + +name: Release + +jobs: + release: + uses: hyperf/.github/.github/workflows/release.yml@master diff --git a/composer.json b/composer.json index 6be77097a..0b8a57c03 100644 --- a/composer.json +++ b/composer.json @@ -18,10 +18,9 @@ "hyperf/guzzle": "~3.1.0", "hyperf/support": "~3.1.0", "hyperf/utils": "~3.1.0", - "psr/container": "^1.0|^2.0", - "promphp/prometheus_client_php": "^2.7", + "psr/container": "^1.0 || ^2.0", "psr/event-dispatcher": "^1.0", - "psr/http-message": "^1.0|^2.0" + "psr/http-message": "^1.0 || ^2.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.21", @@ -44,15 +43,17 @@ "swoole/ide-helper": "^5.0" }, "suggest": { - "influxdb/influxdb-php": "Required to use InfluxDB driver.", "hyperf/di": "Required to use annotations.", "hyperf/event": "Required to use listeners for default metrics.", + "hyperf/http-server": "Required to capture routes in middleware.", "hyperf/process": "Required to use standalone process, or you have to roll your own", "hyperf/retry": "Required to use back-off retry implementation.", - "hyperf/http-server": "Required to capture routes in middleware.", + "influxdb/influxdb-php": "Required to use InfluxDB driver.", "promphp/prometheus_client_php": "Required to use Prometheus driver.(2.2.*)", "slickdeals/statsd": "Required to use StatdD driver." }, + "minimum-stability": "dev", + "prefer-stable": true, "autoload": { "psr-4": { "Hyperf\\Metric\\": "src/" @@ -71,8 +72,6 @@ "analyse": "phpstan analyse --memory-limit=-1 -l 5 -c phpstan.neon", "rector": "rector process --clear-cache" }, - "minimum-stability": "dev", - "prefer-stable": true, "config": { "optimize-autoloader": true, "sort-packages": true, diff --git a/grafana.json b/grafana.json index 64eb41a48..5103b0150 100644 --- a/grafana.json +++ b/grafana.json @@ -397,7 +397,7 @@ { "expr": "sum([[app_name]]_event_num{instance=~'$instance'})", "format": "time_series", - "instant": true, + "instant": false, "intervalFactor": 1, "refId": "A" } @@ -484,7 +484,7 @@ { "expr": "sum([[app_name]]_coroutine_num{instance=~'$instance'})", "format": "time_series", - "instant": true, + "instant": false, "intervalFactor": 1, "refId": "A" } @@ -567,7 +567,7 @@ { "expr": "sum([[app_name]]_connection_num{instance=~'$instance'})", "format": "time_series", - "instant": true, + "instant": false, "intervalFactor": 1, "refId": "A" } @@ -729,7 +729,7 @@ { "expr": "sum([[app_name]]_tasking_num{instance=~'$instance'})", "format": "time_series", - "instant": true, + "instant": false, "intervalFactor": 1, "refId": "A" } @@ -895,7 +895,7 @@ { "expr": "sum([[app_name]]_timer_num{instance=~'$instance'})", "format": "time_series", - "instant": true, + "instant": false, "intervalFactor": 1, "refId": "A" } diff --git a/publish/metric.php b/publish/metric.php index 8dd85c4a1..ef3d0447f 100644 --- a/publish/metric.php +++ b/publish/metric.php @@ -10,6 +10,7 @@ * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ use Hyperf\Metric\Adapter\Prometheus\Constants; +use Hyperf\Metric\Adapter\Prometheus\MetricFactory; use function Hyperf\Support\env; @@ -25,7 +26,7 @@ 'buffer_size' => env('METRIC_BUFFER_SIZE', 200), 'metric' => [ 'prometheus' => [ - 'driver' => Hyperf\Metric\Adapter\Prometheus\MetricFactory::class, + 'driver' => MetricFactory::class, 'mode' => Constants::SCRAPE_MODE, 'namespace' => env('APP_NAME', 'skeleton'), 'redis_config' => env('PROMETHEUS_REDIS_CONFIG', 'default'), diff --git a/src/Adapter/InfluxDB/MetricFactory.php b/src/Adapter/InfluxDB/MetricFactory.php index 5a9a1cd01..6ee38b3f5 100644 --- a/src/Adapter/InfluxDB/MetricFactory.php +++ b/src/Adapter/InfluxDB/MetricFactory.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\InfluxDB; use Hyperf\Contract\ConfigInterface; diff --git a/src/Adapter/NoOp/Counter.php b/src/Adapter/NoOp/Counter.php index ad515726b..768192baf 100644 --- a/src/Adapter/NoOp/Counter.php +++ b/src/Adapter/NoOp/Counter.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\NoOp; use Hyperf\Metric\Contract\CounterInterface; diff --git a/src/Adapter/NoOp/Gauge.php b/src/Adapter/NoOp/Gauge.php index 461391bec..23d4ca3ae 100644 --- a/src/Adapter/NoOp/Gauge.php +++ b/src/Adapter/NoOp/Gauge.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\NoOp; use Hyperf\Metric\Contract\GaugeInterface; diff --git a/src/Adapter/NoOp/Histogram.php b/src/Adapter/NoOp/Histogram.php index 308b50ff1..93e843895 100644 --- a/src/Adapter/NoOp/Histogram.php +++ b/src/Adapter/NoOp/Histogram.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\NoOp; use Hyperf\Metric\Contract\HistogramInterface; diff --git a/src/Adapter/NoOp/MetricFactory.php b/src/Adapter/NoOp/MetricFactory.php index 5a3f1a50d..f39ee8c97 100644 --- a/src/Adapter/NoOp/MetricFactory.php +++ b/src/Adapter/NoOp/MetricFactory.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\NoOp; use Hyperf\Coordinator\Constants; diff --git a/src/Adapter/Prometheus/Constants.php b/src/Adapter/Prometheus/Constants.php index ea7aa10e9..4f6462a97 100644 --- a/src/Adapter/Prometheus/Constants.php +++ b/src/Adapter/Prometheus/Constants.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\Prometheus; class Constants diff --git a/src/Adapter/Prometheus/Counter.php b/src/Adapter/Prometheus/Counter.php index 8dca337e3..cfb58b855 100644 --- a/src/Adapter/Prometheus/Counter.php +++ b/src/Adapter/Prometheus/Counter.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\Prometheus; use Hyperf\Metric\Contract\CounterInterface; diff --git a/src/Adapter/Prometheus/Gauge.php b/src/Adapter/Prometheus/Gauge.php index 766c27f3b..32ab20287 100644 --- a/src/Adapter/Prometheus/Gauge.php +++ b/src/Adapter/Prometheus/Gauge.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\Prometheus; use Hyperf\Metric\Contract\GaugeInterface; diff --git a/src/Adapter/Prometheus/Histogram.php b/src/Adapter/Prometheus/Histogram.php index f0fb45b8e..cd30fe3b4 100644 --- a/src/Adapter/Prometheus/Histogram.php +++ b/src/Adapter/Prometheus/Histogram.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\Prometheus; use Hyperf\Metric\Contract\HistogramInterface; diff --git a/src/Adapter/Prometheus/MetricFactory.php b/src/Adapter/Prometheus/MetricFactory.php index 5f9d6ae66..4e28f2cc6 100644 --- a/src/Adapter/Prometheus/MetricFactory.php +++ b/src/Adapter/Prometheus/MetricFactory.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\Prometheus; use GuzzleHttp\Exception\GuzzleException; diff --git a/src/Adapter/Prometheus/Redis.php b/src/Adapter/Prometheus/Redis.php index 1683f0a6d..5bdf439f1 100644 --- a/src/Adapter/Prometheus/Redis.php +++ b/src/Adapter/Prometheus/Redis.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\Prometheus; use Hyperf\Codec\Json; diff --git a/src/Adapter/Prometheus/RedisStorageFactory.php b/src/Adapter/Prometheus/RedisStorageFactory.php index a864344bb..e76024c55 100644 --- a/src/Adapter/Prometheus/RedisStorageFactory.php +++ b/src/Adapter/Prometheus/RedisStorageFactory.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\Prometheus; use Hyperf\Contract\ConfigInterface; diff --git a/src/Adapter/RemoteProxy/Counter.php b/src/Adapter/RemoteProxy/Counter.php index 500c8d7d6..eec60140c 100644 --- a/src/Adapter/RemoteProxy/Counter.php +++ b/src/Adapter/RemoteProxy/Counter.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\RemoteProxy; use Hyperf\Context\ApplicationContext; diff --git a/src/Adapter/RemoteProxy/Gauge.php b/src/Adapter/RemoteProxy/Gauge.php index c31afa0f5..f3538db18 100644 --- a/src/Adapter/RemoteProxy/Gauge.php +++ b/src/Adapter/RemoteProxy/Gauge.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\RemoteProxy; use Hyperf\Context\ApplicationContext; diff --git a/src/Adapter/RemoteProxy/Histogram.php b/src/Adapter/RemoteProxy/Histogram.php index 27d704706..6f6704751 100644 --- a/src/Adapter/RemoteProxy/Histogram.php +++ b/src/Adapter/RemoteProxy/Histogram.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\RemoteProxy; use Hyperf\Context\ApplicationContext; diff --git a/src/Adapter/RemoteProxy/MetricCollector.php b/src/Adapter/RemoteProxy/MetricCollector.php index 8d0bc149d..64a383455 100644 --- a/src/Adapter/RemoteProxy/MetricCollector.php +++ b/src/Adapter/RemoteProxy/MetricCollector.php @@ -9,6 +9,7 @@ * @contact group@hyperf.io * @license https://github.com/hyperf/hyperf/blob/master/LICENSE */ + namespace Hyperf\Metric\Adapter\RemoteProxy; use Hyperf\Metric\Contract\MetricCollectorInterface; diff --git a/src/Adapter/RemoteProxy/MetricCollectorFactory.php b/src/Adapter/RemoteProxy/MetricCollectorFactory.php index bdd33dea1..387004632 100644 --- a/src/Adapter/RemoteProxy/MetricCollectorFactory.php +++ b/src/Adapter/RemoteProxy/MetricCollectorFactory.php @@ -9,6 +9,7 @@ * @contact group@hyperf.io * @license https://github.com/hyperf/hyperf/blob/master/LICENSE */ + namespace Hyperf\Metric\Adapter\RemoteProxy; use Hyperf\Contract\ConfigInterface; diff --git a/src/Adapter/RemoteProxy/MetricFactory.php b/src/Adapter/RemoteProxy/MetricFactory.php index 61a31ed1e..3304c5c44 100644 --- a/src/Adapter/RemoteProxy/MetricFactory.php +++ b/src/Adapter/RemoteProxy/MetricFactory.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\RemoteProxy; use Hyperf\Metric\Contract\CounterInterface; diff --git a/src/Adapter/StatsD/Counter.php b/src/Adapter/StatsD/Counter.php index 08307cfb0..34558fed2 100644 --- a/src/Adapter/StatsD/Counter.php +++ b/src/Adapter/StatsD/Counter.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\StatsD; use Domnikl\Statsd\Client; diff --git a/src/Adapter/StatsD/Gauge.php b/src/Adapter/StatsD/Gauge.php index f134cf212..ab8d4ba17 100644 --- a/src/Adapter/StatsD/Gauge.php +++ b/src/Adapter/StatsD/Gauge.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\StatsD; use Domnikl\Statsd\Client; diff --git a/src/Adapter/StatsD/Histogram.php b/src/Adapter/StatsD/Histogram.php index 2b8475e74..43e4d22a8 100644 --- a/src/Adapter/StatsD/Histogram.php +++ b/src/Adapter/StatsD/Histogram.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\StatsD; use Domnikl\Statsd\Client; diff --git a/src/Adapter/StatsD/MetricFactory.php b/src/Adapter/StatsD/MetricFactory.php index 6950b1bc2..97b578801 100644 --- a/src/Adapter/StatsD/MetricFactory.php +++ b/src/Adapter/StatsD/MetricFactory.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Adapter\StatsD; use Domnikl\Statsd\Client; diff --git a/src/Annotation/Counter.php b/src/Annotation/Counter.php index 264295860..cbe322074 100644 --- a/src/Annotation/Counter.php +++ b/src/Annotation/Counter.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Annotation; use Attribute; diff --git a/src/Annotation/Histogram.php b/src/Annotation/Histogram.php index dc70bb202..014b816b1 100644 --- a/src/Annotation/Histogram.php +++ b/src/Annotation/Histogram.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Annotation; use Attribute; diff --git a/src/Aspect/CounterAnnotationAspect.php b/src/Aspect/CounterAnnotationAspect.php index 83e27716a..79ea6a25a 100644 --- a/src/Aspect/CounterAnnotationAspect.php +++ b/src/Aspect/CounterAnnotationAspect.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Aspect; use Hyperf\Di\Aop\AbstractAspect; diff --git a/src/Aspect/HistogramAnnotationAspect.php b/src/Aspect/HistogramAnnotationAspect.php index 46b2d68eb..a8c971778 100644 --- a/src/Aspect/HistogramAnnotationAspect.php +++ b/src/Aspect/HistogramAnnotationAspect.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Aspect; use Hyperf\Di\Aop\AbstractAspect; diff --git a/src/ConfigProvider.php b/src/ConfigProvider.php index ecff07a19..76ddfc666 100644 --- a/src/ConfigProvider.php +++ b/src/ConfigProvider.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric; use Domnikl\Statsd\Connection; diff --git a/src/Contract/CounterInterface.php b/src/Contract/CounterInterface.php index 207f8282e..13e999213 100644 --- a/src/Contract/CounterInterface.php +++ b/src/Contract/CounterInterface.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Contract; /** diff --git a/src/Contract/GaugeInterface.php b/src/Contract/GaugeInterface.php index b9af0e5a2..4f80d0883 100644 --- a/src/Contract/GaugeInterface.php +++ b/src/Contract/GaugeInterface.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Contract; /** diff --git a/src/Contract/HistogramInterface.php b/src/Contract/HistogramInterface.php index 5571d5323..068eb6776 100644 --- a/src/Contract/HistogramInterface.php +++ b/src/Contract/HistogramInterface.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Contract; /** diff --git a/src/Contract/MetricCollectorInterface.php b/src/Contract/MetricCollectorInterface.php index 54b95ac98..20b992cab 100644 --- a/src/Contract/MetricCollectorInterface.php +++ b/src/Contract/MetricCollectorInterface.php @@ -9,6 +9,7 @@ * @contact group@hyperf.io * @license https://github.com/hyperf/hyperf/blob/master/LICENSE */ + namespace Hyperf\Metric\Contract; interface MetricCollectorInterface diff --git a/src/Contract/MetricFactoryInterface.php b/src/Contract/MetricFactoryInterface.php index 7409d1a41..52113e687 100644 --- a/src/Contract/MetricFactoryInterface.php +++ b/src/Contract/MetricFactoryInterface.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Contract; interface MetricFactoryInterface diff --git a/src/CoroutineServerStats.php b/src/CoroutineServerStats.php index 411ce9857..77bff121e 100644 --- a/src/CoroutineServerStats.php +++ b/src/CoroutineServerStats.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric; use Hyperf\Contract\Arrayable; diff --git a/src/Event/MetricFactoryReady.php b/src/Event/MetricFactoryReady.php index 152fecba6..2ddf8664b 100644 --- a/src/Event/MetricFactoryReady.php +++ b/src/Event/MetricFactoryReady.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Event; use Hyperf\Metric\Contract\MetricFactoryInterface; diff --git a/src/Exception/InvalidArgumentException.php b/src/Exception/InvalidArgumentException.php index 890383263..81a5d5363 100644 --- a/src/Exception/InvalidArgumentException.php +++ b/src/Exception/InvalidArgumentException.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Exception; class InvalidArgumentException extends \InvalidArgumentException diff --git a/src/Exception/RuntimeException.php b/src/Exception/RuntimeException.php index 9785fc886..e08eb6650 100644 --- a/src/Exception/RuntimeException.php +++ b/src/Exception/RuntimeException.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Exception; class RuntimeException extends \RuntimeException diff --git a/src/Listener/DBPoolWatcher.php b/src/Listener/DBPoolWatcher.php index c286f3861..11e602cc8 100644 --- a/src/Listener/DBPoolWatcher.php +++ b/src/Listener/DBPoolWatcher.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Listener; use Hyperf\Contract\ConfigInterface; diff --git a/src/Listener/MetricBufferWatcher.php b/src/Listener/MetricBufferWatcher.php index feeaa1560..957c7ab50 100644 --- a/src/Listener/MetricBufferWatcher.php +++ b/src/Listener/MetricBufferWatcher.php @@ -9,6 +9,7 @@ * @contact group@hyperf.io * @license https://github.com/hyperf/hyperf/blob/master/LICENSE */ + namespace Hyperf\Metric\Listener; use Hyperf\Contract\ConfigInterface; diff --git a/src/Listener/OnBeforeHandle.php b/src/Listener/OnBeforeHandle.php index 206432dc1..8d7ba5c5f 100644 --- a/src/Listener/OnBeforeHandle.php +++ b/src/Listener/OnBeforeHandle.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Listener; use Hyperf\Command\Event\AfterExecute; diff --git a/src/Listener/OnCoroutineServerStart.php b/src/Listener/OnCoroutineServerStart.php index 4fb23eada..65b4f6e02 100644 --- a/src/Listener/OnCoroutineServerStart.php +++ b/src/Listener/OnCoroutineServerStart.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Listener; use Hyperf\Contract\ConfigInterface; diff --git a/src/Listener/OnMetricFactoryReady.php b/src/Listener/OnMetricFactoryReady.php index eec6b384f..9de0a8c3b 100644 --- a/src/Listener/OnMetricFactoryReady.php +++ b/src/Listener/OnMetricFactoryReady.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Listener; use Hyperf\Contract\ConfigInterface; diff --git a/src/Listener/OnPipeMessage.php b/src/Listener/OnPipeMessage.php index 9ab0d7bf5..f0ddaedc6 100644 --- a/src/Listener/OnPipeMessage.php +++ b/src/Listener/OnPipeMessage.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Listener; use Hyperf\Coroutine\Coroutine; diff --git a/src/Listener/OnWorkerStart.php b/src/Listener/OnWorkerStart.php index 347758354..473c4277d 100644 --- a/src/Listener/OnWorkerStart.php +++ b/src/Listener/OnWorkerStart.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Listener; use Hyperf\Contract\ConfigInterface; @@ -23,6 +24,7 @@ use Hyperf\Metric\MetricSetter; use Psr\Container\ContainerInterface; use Psr\EventDispatcher\EventDispatcherInterface; +use Swoole\Server; use function gc_status; use function getrusage; @@ -124,7 +126,7 @@ public function process(object $event): void $timerInterval = $this->config->get('metric.default_metric_interval', 5); $timerId = $this->timer->tick($timerInterval, function () use ($metrics) { - $server = $this->container->get(\Swoole\Server::class); + $server = $this->container->get(Server::class); $serverStats = $server->stats(); $this->trySet('gc_', $metrics, gc_status()); $this->trySet('', $metrics, getrusage()); diff --git a/src/Listener/PoolWatcher.php b/src/Listener/PoolWatcher.php index 43f23c6ce..0044ee840 100644 --- a/src/Listener/PoolWatcher.php +++ b/src/Listener/PoolWatcher.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Listener; use Hyperf\Contract\ConfigInterface; diff --git a/src/Listener/QueueWatcher.php b/src/Listener/QueueWatcher.php index 35c9658e8..9e886a491 100644 --- a/src/Listener/QueueWatcher.php +++ b/src/Listener/QueueWatcher.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Listener; use Hyperf\AsyncQueue\Driver\DriverFactory; diff --git a/src/Listener/RedisPoolWatcher.php b/src/Listener/RedisPoolWatcher.php index 0ea3842ff..e3f3dd54f 100644 --- a/src/Listener/RedisPoolWatcher.php +++ b/src/Listener/RedisPoolWatcher.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Listener; use Hyperf\Contract\ConfigInterface; diff --git a/src/Metric.php b/src/Metric.php index 22984047f..8b54a8bcc 100644 --- a/src/Metric.php +++ b/src/Metric.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric; use Hyperf\Metric\Contract\MetricFactoryInterface; @@ -55,6 +56,7 @@ public static function put(string $name, float $sample, ?array $labels = []) public static function time(string $name, callable $func, ?array $args = [], ?array $labels = []) { + // Must be keep the variable $timer alive, otherwise the destructor will be called right now. $timer = new Timer($name, $labels); return $func(...$args); } diff --git a/src/MetricFactoryPicker.php b/src/MetricFactoryPicker.php index 5b9a83e9a..da98fd310 100644 --- a/src/MetricFactoryPicker.php +++ b/src/MetricFactoryPicker.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric; use Hyperf\Contract\ConfigInterface; diff --git a/src/MetricSetter.php b/src/MetricSetter.php index d697e3558..b8e79e7e4 100644 --- a/src/MetricSetter.php +++ b/src/MetricSetter.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric; use Hyperf\Coroutine\Coroutine; diff --git a/src/Middleware/MetricMiddleware.php b/src/Middleware/MetricMiddleware.php index adc2b877f..36219a4aa 100644 --- a/src/Middleware/MetricMiddleware.php +++ b/src/Middleware/MetricMiddleware.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Middleware; use Hyperf\Contract\ConfigInterface; diff --git a/src/Process/MetricProcess.php b/src/Process/MetricProcess.php index 9252d2fa7..d077a67d6 100644 --- a/src/Process/MetricProcess.php +++ b/src/Process/MetricProcess.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric\Process; use Hyperf\Contract\ConfigInterface; diff --git a/src/Timer.php b/src/Timer.php index 032f47c71..7667102c1 100644 --- a/src/Timer.php +++ b/src/Timer.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace Hyperf\Metric; use Hyperf\Metric\Contract\MetricFactoryInterface; diff --git a/tests/Adapter/Prometheus/RedisStorageFactoryTest.php b/tests/Adapter/Prometheus/RedisStorageFactoryTest.php index 5a55103d2..1ea8014ea 100644 --- a/tests/Adapter/Prometheus/RedisStorageFactoryTest.php +++ b/tests/Adapter/Prometheus/RedisStorageFactoryTest.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace HyperfTest\Metric\Adapter\Prometheus; use Hyperf\Config\Config; diff --git a/tests/Adapter/Prometheus/RedisTest.php b/tests/Adapter/Prometheus/RedisTest.php index 65eafdcb4..81d589124 100644 --- a/tests/Adapter/Prometheus/RedisTest.php +++ b/tests/Adapter/Prometheus/RedisTest.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace HyperfTest\Metric\Adapter\Prometheus; use Hyperf\Metric\Adapter\Prometheus\Redis; diff --git a/tests/Adapter/RemoteProxy/MetricCollectorTest.php b/tests/Adapter/RemoteProxy/MetricCollectorTest.php index e445ae81a..e971f5c86 100644 --- a/tests/Adapter/RemoteProxy/MetricCollectorTest.php +++ b/tests/Adapter/RemoteProxy/MetricCollectorTest.php @@ -9,6 +9,7 @@ * @contact group@hyperf.io * @license https://github.com/hyperf/hyperf/blob/master/LICENSE */ + namespace HyperfTest\Metric\Adapter\RemoteProxy; use Hyperf\Metric\Adapter\RemoteProxy\MetricCollector; diff --git a/tests/Cases/MetricFactoryPickerTest.php b/tests/Cases/MetricFactoryPickerTest.php index caa5dec55..ff7af2472 100644 --- a/tests/Cases/MetricFactoryPickerTest.php +++ b/tests/Cases/MetricFactoryPickerTest.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace HyperfTest\Metric\Cases; use Hyperf\Config\Config; @@ -23,6 +24,7 @@ use Mockery; use PHPUnit\Framework\Attributes\CoversNothing; use PHPUnit\Framework\TestCase; +use Swoole\Process; /** * @internal @@ -98,7 +100,7 @@ public function testProxy() ], ], ]); - ProcessCollector::add('dummy', Mockery::mock(\Swoole\Process::class)); + ProcessCollector::add('dummy', Mockery::mock(Process::class)); $container = Mockery::mock(Container::class); $container->shouldReceive('get')->with(ConfigInterface::class)->andReturn($config); $container->shouldReceive('get')->with(RemoteFactory::class)->andReturn(Mockery::mock(RemoteFactory::class)); @@ -125,7 +127,7 @@ public function testMetricProcess() ], ], ]); - ProcessCollector::add('dummy', Mockery::mock(\Swoole\Process::class)); + ProcessCollector::add('dummy', Mockery::mock(Process::class)); $container = Mockery::mock(Container::class); $container->shouldReceive('get')->with(ConfigInterface::class)->andReturn($config); $container->shouldReceive('get')->with(PrometheusFactory::class)->andReturn(Mockery::mock(PrometheusFactory::class)); diff --git a/tests/Cases/MetricFactoryTest.php b/tests/Cases/MetricFactoryTest.php index 0b90f09ed..becb28b9c 100644 --- a/tests/Cases/MetricFactoryTest.php +++ b/tests/Cases/MetricFactoryTest.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace HyperfTest\Metric\Cases; use Hyperf\Config\Config; diff --git a/tests/Cases/OnWorkerStartTest.php b/tests/Cases/OnWorkerStartTest.php index e981ef20c..43ca97b83 100644 --- a/tests/Cases/OnWorkerStartTest.php +++ b/tests/Cases/OnWorkerStartTest.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace HyperfTest\Metric\Cases; use Hyperf\Config\Config; @@ -52,7 +53,7 @@ public function testHandle() $l = new OnWorkerStart($container); - $l->process(new class() { + $l->process(new class { public $workerId = 1; }); @@ -74,7 +75,7 @@ public function testFireEvent() $container->shouldReceive('get')->with(ConfigInterface::class)->andReturn($config); $container->shouldReceive('get')->with(MetricFactoryInterface::class)->andReturn($factory); $container->shouldReceive('get')->with(EventDispatcherInterface::class)->andReturn( - new class() { + new class { public function dispatch() { return true; @@ -82,10 +83,10 @@ public function dispatch() } )->once(); $l = new OnWorkerStart($container); - $l->process(new class() { + $l->process(new class { public $workerId = 0; }); - $l->process(new class() { + $l->process(new class { public $workerId = 1; }); $this->assertTrue(true); @@ -105,7 +106,7 @@ public function testNotFireEvent() $container->shouldReceive('get')->with(ConfigInterface::class)->andReturn($config); $container->shouldReceive('get')->with(MetricFactoryInterface::class)->andReturn($factory); $l = new OnWorkerStart($container); - $l->process(new class() { + $l->process(new class { public $workerId = 0; }); $this->assertTrue(true); diff --git a/tests/Cases/TimerTest.php b/tests/Cases/TimerTest.php index c19e0213f..673ed20ac 100644 --- a/tests/Cases/TimerTest.php +++ b/tests/Cases/TimerTest.php @@ -9,6 +9,7 @@ * @contact leo@opencodeco.dev * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ + namespace HyperfTest\Metric\Cases; use Hyperf\Context\ApplicationContext; @@ -60,7 +61,7 @@ public function testEndNotCalled() private function mockContainer() { $container = Mockery::mock(Container::class); - $container->shouldReceive('make')->with(MetricFactoryInterface::class, [])->andReturn(new class() { + $container->shouldReceive('make')->with(MetricFactoryInterface::class, [])->andReturn(new class { public function makeHistogram($name, $labels) { $histogram = Mockery::mock(HistogramInterface::class); From 6dd804c050520f55ddab5d621a629382e790804a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Henrique=20Cicilio=20Ara=C3=BAjo?= Date: Fri, 22 Aug 2025 10:17:19 -0300 Subject: [PATCH 31/38] =?UTF-8?q?Adiciona=20sanitiza=C3=A7=C3=A3o=20do=20p?= =?UTF-8?q?ar=C3=A2metro=20external-id=20na=20URI=20(#28)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: adiciona sanitização do parâmetro external-id na URI --- src/Support/Uri.php | 2 ++ tests/Cases/UriTest.php | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/Support/Uri.php b/src/Support/Uri.php index 2323c9552..2fd58bb1e 100644 --- a/src/Support/Uri.php +++ b/src/Support/Uri.php @@ -26,6 +26,7 @@ public static function sanitize(string $uri, array $uriMask = []): string '/\/(?<=\/)([A-Z]{3}-?\d[0-9A-Z]\d{2})(?=\/)?/i', '/\/(?<=\/)[0-9A-F]{16,24}(?=\/)?/i', '/\/(?<=\/)\d+(?=\/)?/', + '/\/(?<=\/)R[RN]\d{16}[A-Za-z0-9]{11}/', ], ), array_merge( @@ -37,6 +38,7 @@ public static function sanitize(string $uri, array $uriMask = []): string '/', '/', '/', + '/', ], ), '/' . ltrim($uri, '/'), diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index ce62c5d6b..7050e0b79 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -150,4 +150,15 @@ public function testWithMaskParams(): void self::assertSame('/v7/test///', Uri::sanitize('/v7/test/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7', $uriMask)); self::assertSame('/v8/test////', Uri::sanitize('/v8/test/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/54cf575c04fdef4667094b6fc4fab8014dd3fa53576b644ec399452c43b5e7f7/', $uriMask)); } + + public function testClearUriExternalIds(): void + { + self::assertSame('/v1/test', Uri::sanitize('/v1/test')); + self::assertSame('/v1/test/', Uri::sanitize('/v1/test/RR2101818220123720H9KJTERfw1a')); + self::assertSame('/v3/test//bar', Uri::sanitize('/v3/test/RN2401818220250720G4KJTQyU6Ds/bar')); + self::assertSame('/v4/test//bar//', Uri::sanitize('/v4/test/RR2101818220123720H9KJTERfw1a/bar/RN2401818220250720G4KJTQyU6Ds/')); + self::assertSame('/v5/test//', Uri::sanitize('/v5/test/RR2101818220123720H9KJTERfw1a/RN2401818220250720G4KJTQyU6Ds')); + self::assertSame('/v7/test////', Uri::sanitize('/v7/test/RR2101818220123720H9KJTERfw1a/RN2001818220123720H9KJTERBd52/RR2123818220123730H9KJTERBd52/')); + self::assertSame('/v9/test//bar/', Uri::sanitize('/v9/test/RR2101818220123720H9KJTERfw1a/bar/12345')); + } } From 3f468743042fd5dd3b8b9931cc4786131cec0e2a Mon Sep 17 00:00:00 2001 From: Jeffeson Pinheiro Date: Wed, 27 Aug 2025 16:58:34 -0300 Subject: [PATCH 32/38] =?UTF-8?q?Adiciona=20sanitiza=C3=A7=C3=A3o=20do=20p?= =?UTF-8?q?ar=C3=A2metro=20bill-uuid=20na=20URI=20(#29)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chore: Include BILL-UUID pattern in URI sanitization --- src/Support/Uri.php | 4 +++- tests/Cases/UriTest.php | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Support/Uri.php b/src/Support/Uri.php index 2fd58bb1e..fed0a269d 100644 --- a/src/Support/Uri.php +++ b/src/Support/Uri.php @@ -27,6 +27,7 @@ public static function sanitize(string $uri, array $uriMask = []): string '/\/(?<=\/)[0-9A-F]{16,24}(?=\/)?/i', '/\/(?<=\/)\d+(?=\/)?/', '/\/(?<=\/)R[RN]\d{16}[A-Za-z0-9]{11}/', + '/\/(?<=\/)BILL-([A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12})(?=\/)?/i', ], ), array_merge( @@ -39,9 +40,10 @@ public static function sanitize(string $uri, array $uriMask = []): string '/', '/', '/', + '/', ], ), '/' . ltrim($uri, '/'), ); } -} \ No newline at end of file +} diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index 7050e0b79..17f7e1cd7 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -161,4 +161,18 @@ public function testClearUriExternalIds(): void self::assertSame('/v7/test////', Uri::sanitize('/v7/test/RR2101818220123720H9KJTERfw1a/RN2001818220123720H9KJTERBd52/RR2123818220123730H9KJTERBd52/')); self::assertSame('/v9/test//bar/', Uri::sanitize('/v9/test/RR2101818220123720H9KJTERfw1a/bar/12345')); } + + public function testClearUriBillUuid(): void + { + $billUuid = 'BILL-123e4567-e89b-12d3-a456-426614174000'; + + self::assertSame('/v1/test', Uri::sanitize('/v1/test')); + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$billUuid}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$billUuid}/bar")); + self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$billUuid}/bar/{$billUuid}/")); + self::assertSame('/v5/test//', Uri::sanitize("/v5/test/{$billUuid}/{$billUuid}")); + self::assertSame('/v6/test///', Uri::sanitize("/v6/test/{$billUuid}/{$billUuid}/")); + self::assertSame('/v7/test///', Uri::sanitize("/v7/test/{$billUuid}/{$billUuid}/{$billUuid}")); + self::assertSame('/v8/test////', Uri::sanitize("/v8/test/{$billUuid}/{$billUuid}/{$billUuid}/")); + } } From dfb0870ff70a920e42d9a29255e544de8802712c Mon Sep 17 00:00:00 2001 From: Jeffeson Pinheiro Date: Thu, 28 Aug 2025 13:15:59 -0300 Subject: [PATCH 33/38] =?UTF-8?q?Altera=20sanitiza=C3=A7=C3=A3o=20do=20UUI?= =?UTF-8?q?D=20para=20permitir=20prefixos=20din=C3=A2micos=20(#31)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit upkeep: Altera sanitização do UUID para permitir prefixos dinâmicos --- src/Support/Uri.php | 4 +- tests/Cases/UriTest.php | 97 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 91 insertions(+), 10 deletions(-) diff --git a/src/Support/Uri.php b/src/Support/Uri.php index fed0a269d..8bd4bceba 100644 --- a/src/Support/Uri.php +++ b/src/Support/Uri.php @@ -27,7 +27,7 @@ public static function sanitize(string $uri, array $uriMask = []): string '/\/(?<=\/)[0-9A-F]{16,24}(?=\/)?/i', '/\/(?<=\/)\d+(?=\/)?/', '/\/(?<=\/)R[RN]\d{16}[A-Za-z0-9]{11}/', - '/\/(?<=\/)BILL-([A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12})(?=\/)?/i', + '/\/(?<=\/)([A-Z]+(?:-[A-Z]+)*)-([0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12})(?=\/|$)/i', ], ), array_merge( @@ -40,7 +40,7 @@ public static function sanitize(string $uri, array $uriMask = []): string '/', '/', '/', - '/', + '/', ], ), '/' . ltrim($uri, '/'), diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index 17f7e1cd7..78e065e9c 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -162,17 +162,98 @@ public function testClearUriExternalIds(): void self::assertSame('/v9/test//bar/', Uri::sanitize('/v9/test/RR2101818220123720H9KJTERfw1a/bar/12345')); } - public function testClearUriBillUuid(): void + public function testClearUriPrefixedUuid(): void { + // Gera prefixos completamente aleatórios + $generateRandomPrefix = function(): string { + $wordCount = rand(1, 3); // 1 a 3 palavras no prefixo + $words = []; + + for ($i = 0; $i < $wordCount; $i++) { + $wordLength = rand(3, 8); // palavras de 3 a 8 caracteres + $word = ''; + for ($j = 0; $j < $wordLength; $j++) { + $word .= chr(rand(65, 90)); // A-Z (65-90 na tabela ASCII) + } + $words[] = $word; + } + + return implode('-', $words); + }; + + $randomPrefix = $generateRandomPrefix(); + + // Gera UUIDs aleatórios (incluindo caracteres não-hexadecimais para testar a regex) + $uuidChars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $randomUuid = sprintf( + '%s-%s-%s-%s-%s', + substr(str_shuffle($uuidChars), 0, 8), + substr(str_shuffle($uuidChars), 0, 4), + substr(str_shuffle($uuidChars), 0, 4), + substr(str_shuffle($uuidChars), 0, 4), + substr(str_shuffle($uuidChars), 0, 12) + ); + + $prefixedUuid = "{$randomPrefix}-{$randomUuid}"; + + // Casos de teste estático para garantir consistência $billUuid = 'BILL-123e4567-e89b-12d3-a456-426614174000'; + $userUuid = 'USER-abc1234d-e56f-78g9-h012-345678901234'; + $companyUuid = 'COMPANY-ADMIN-456e7890-f12a-34b5-c678-901234567890'; + // Gera mais alguns prefixos aleatórios para testes variados + $randomPrefix2 = $generateRandomPrefix(); + $randomUuid2 = sprintf( + '%s-%s-%s-%s-%s', + substr(str_shuffle($uuidChars), 0, 8), + substr(str_shuffle($uuidChars), 0, 4), + substr(str_shuffle($uuidChars), 0, 4), + substr(str_shuffle($uuidChars), 0, 4), + substr(str_shuffle($uuidChars), 0, 12) + ); + $prefixedUuid2 = "{$randomPrefix2}-{$randomUuid2}"; + + // Testes básicos self::assertSame('/v1/test', Uri::sanitize('/v1/test')); - self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$billUuid}")); - self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$billUuid}/bar")); - self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$billUuid}/bar/{$billUuid}/")); - self::assertSame('/v5/test//', Uri::sanitize("/v5/test/{$billUuid}/{$billUuid}")); - self::assertSame('/v6/test///', Uri::sanitize("/v6/test/{$billUuid}/{$billUuid}/")); - self::assertSame('/v7/test///', Uri::sanitize("/v7/test/{$billUuid}/{$billUuid}/{$billUuid}")); - self::assertSame('/v8/test////', Uri::sanitize("/v8/test/{$billUuid}/{$billUuid}/{$billUuid}/")); + + // Testes com prefixos randômicos + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$prefixedUuid}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$prefixedUuid}/bar")); + self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$prefixedUuid}/bar/{$prefixedUuid}/")); + + // Testes com casos estáticos conhecidos + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$billUuid}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$billUuid}/bar")); + self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$billUuid}/bar/{$billUuid}/")); + + // Testes com UUID não-hexadecimal + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$userUuid}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$userUuid}/bar")); + + // Testes com prefixo composto + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$companyUuid}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$companyUuid}/bar")); + + // Testes com múltiplos UUIDs (randômicos + estáticos) + self::assertSame('/v5/test//', Uri::sanitize("/v5/test/{$prefixedUuid}/{$billUuid}")); + self::assertSame('/v6/test///', Uri::sanitize("/v6/test/{$billUuid}/{$prefixedUuid}/")); + self::assertSame('/v7/test///', Uri::sanitize("/v7/test/{$prefixedUuid}/{$billUuid}/{$userUuid}")); + self::assertSame('/v8/test////', Uri::sanitize("/v8/test/{$billUuid}/{$userUuid}/{$prefixedUuid}/")); + + // Testes com dois prefixos aleatórios diferentes + self::assertSame('/v9/test//', Uri::sanitize("/v9/test/{$prefixedUuid}/{$prefixedUuid2}")); + self::assertSame('/v10/test////', Uri::sanitize("/v10/test/{$prefixedUuid}/{$prefixedUuid2}/{$companyUuid}/")); + + // Casos edge: diferentes contextos de API + self::assertSame('/users//profile', Uri::sanitize("/users/{$prefixedUuid}/profile")); + self::assertSame('/api/v1/bills//details', Uri::sanitize("/api/v1/bills/{$billUuid}/details")); + self::assertSame('/companies//admin//settings', Uri::sanitize("/companies/{$prefixedUuid2}/admin/{$prefixedUuid}/settings")); + + // Teste sem barra final + self::assertSame('/test/', Uri::sanitize("/test/{$prefixedUuid}")); + + // Testes com prefixos de diferentes tamanhos + self::assertSame('/short/', Uri::sanitize("/short/{$prefixedUuid}")); + self::assertSame('/long//path', Uri::sanitize("/long/{$prefixedUuid2}/path")); } } From af5a029afe9bc715b485a5327ba2e8bfaa4d1c98 Mon Sep 17 00:00:00 2001 From: Leonardo Teixeira Date: Thu, 28 Aug 2025 17:01:00 -0300 Subject: [PATCH 34/38] Adjust false positives from server errors (#30) * feat: handle HttpException separately in MetricMiddleware Added a catch block for HttpException in MetricMiddleware to treat them as valid HTTP responses, updating request_status label accordingly before ending the timer. This prevents HttpExceptions from being counted as internal errors. * chore: remove close-pull-request and release workflows Deleted GitHub Actions workflows for closing pull requests and handling releases. These workflows are no longer needed or have been moved. --- .github/workflows/close-pull-request.yml | 9 --------- .github/workflows/release.yml | 11 ----------- src/Middleware/MetricMiddleware.php | 8 ++++++++ 3 files changed, 8 insertions(+), 20 deletions(-) delete mode 100644 .github/workflows/close-pull-request.yml delete mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/close-pull-request.yml b/.github/workflows/close-pull-request.yml deleted file mode 100644 index 4cbca9664..000000000 --- a/.github/workflows/close-pull-request.yml +++ /dev/null @@ -1,9 +0,0 @@ -name: Close Pull Request - -on: - pull_request_target: - types: [ opened ] - -jobs: - run: - uses: hyperf/.github/.github/workflows/close-pull-request.yml@master diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 8ec4a62c3..000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,11 +0,0 @@ -on: - push: - # Sequence of patterns matched against refs/tags - tags: - - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 - -name: Release - -jobs: - release: - uses: hyperf/.github/.github/workflows/release.yml@master diff --git a/src/Middleware/MetricMiddleware.php b/src/Middleware/MetricMiddleware.php index 36219a4aa..aa6461671 100644 --- a/src/Middleware/MetricMiddleware.php +++ b/src/Middleware/MetricMiddleware.php @@ -13,6 +13,7 @@ namespace Hyperf\Metric\Middleware; use Hyperf\Contract\ConfigInterface; +use Hyperf\HttpMessage\Exception\HttpException; use Hyperf\HttpServer\Router\Dispatched; use Hyperf\Metric\Metric; use Hyperf\Metric\Support\Uri; @@ -59,6 +60,13 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface $timer->end($labels); return $response; + } catch (HttpException $httpException) { + + // HttpExceptions are valid HTTP responses, not internal errors + $labels['request_status'] = (string) $httpException->getStatusCode(); + $timer->end($labels); + + throw $httpException; } catch (Throwable $exception) { $this->countException($request, $exception); $timer->end($labels); From 725d62d81eefc59e8178673aed202ddc3a7d6ba8 Mon Sep 17 00:00:00 2001 From: Jeffeson Pinheiro Date: Mon, 1 Sep 2025 09:45:25 -0300 Subject: [PATCH 35/38] =?UTF-8?q?upkeep:=20Atualiza=20sanitiza=C3=A7=C3=A3?= =?UTF-8?q?o=20para=20suportar=20IDs=20prefixados=20e=20novos=20fomatos=20?= =?UTF-8?q?de=20ID=20ECOSYSTEM=20(#32)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit upkeep: Atualiza sanitização para suportar IDs prefixados e novos formatos de ID ECOSYSTEM --- src/Support/Uri.php | 4 +-- tests/Cases/UriTest.php | 76 ++++++++++++++++++++++++----------------- 2 files changed, 47 insertions(+), 33 deletions(-) diff --git a/src/Support/Uri.php b/src/Support/Uri.php index 8bd4bceba..7707e732d 100644 --- a/src/Support/Uri.php +++ b/src/Support/Uri.php @@ -27,7 +27,7 @@ public static function sanitize(string $uri, array $uriMask = []): string '/\/(?<=\/)[0-9A-F]{16,24}(?=\/)?/i', '/\/(?<=\/)\d+(?=\/)?/', '/\/(?<=\/)R[RN]\d{16}[A-Za-z0-9]{11}/', - '/\/(?<=\/)([A-Z]+(?:-[A-Z]+)*)-([0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12})(?=\/|$)/i', + '/\/(?<=\/)([A-Z]+(?:-[A-Z]+)*)-([0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}|[A-Z]{3}-\d{10}_\d{3})(?=\/|$)/i', ], ), array_merge( @@ -40,7 +40,7 @@ public static function sanitize(string $uri, array $uriMask = []): string '/', '/', '/', - '/', + '/', ], ), '/' . ltrim($uri, '/'), diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index 78e065e9c..fb31d0ba6 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -181,6 +181,19 @@ public function testClearUriPrefixedUuid(): void return implode('-', $words); }; + // Gera IDs do tipo ECOSYSTEM + $generateEcosystemId = function(): string { + $prefixes = ['ECOSYSTEM', 'PLATFORM', 'SERVICE', 'MODULE']; + $codes = ['EPF', 'ABC', 'XYZ', 'DEF', 'GHI']; + + $prefix = $prefixes[array_rand($prefixes)]; + $code = $codes[array_rand($codes)]; + $number = str_pad((string)rand(1000000000, 9999999999), 10, '0', STR_PAD_LEFT); + $sequence = str_pad((string)rand(1, 999), 3, '0', STR_PAD_LEFT); + + return "{$prefix}-{$code}-{$number}_{$sequence}"; + }; + $randomPrefix = $generateRandomPrefix(); // Gera UUIDs aleatórios (incluindo caracteres não-hexadecimais para testar a regex) @@ -201,6 +214,12 @@ public function testClearUriPrefixedUuid(): void $userUuid = 'USER-abc1234d-e56f-78g9-h012-345678901234'; $companyUuid = 'COMPANY-ADMIN-456e7890-f12a-34b5-c678-901234567890'; + // IDs do tipo ECOSYSTEM (estáticos e aleatórios) + $ecosystemId = 'ECOSYSTEM-EPF-0100290422_001'; + $ecosystemId2 = 'PLATFORM-ABC-1234567890_999'; + $randomEcosystemId = $generateEcosystemId(); + $randomEcosystemId2 = $generateEcosystemId(); + // Gera mais alguns prefixos aleatórios para testes variados $randomPrefix2 = $generateRandomPrefix(); $randomUuid2 = sprintf( @@ -216,44 +235,39 @@ public function testClearUriPrefixedUuid(): void // Testes básicos self::assertSame('/v1/test', Uri::sanitize('/v1/test')); - // Testes com prefixos randômicos - self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$prefixedUuid}")); - self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$prefixedUuid}/bar")); - self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$prefixedUuid}/bar/{$prefixedUuid}/")); - - // Testes com casos estáticos conhecidos - self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$billUuid}")); - self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$billUuid}/bar")); - self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$billUuid}/bar/{$billUuid}/")); + // Testes com UUIDs prefixados randômicos + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$prefixedUuid}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$prefixedUuid}/bar")); + self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$prefixedUuid}/bar/{$prefixedUuid}/")); - // Testes com UUID não-hexadecimal - self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$userUuid}")); - self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$userUuid}/bar")); + // Testes com UUIDs prefixados estáticos + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$billUuid}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$billUuid}/bar")); + self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$billUuid}/bar/{$billUuid}/")); - // Testes com prefixo composto - self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$companyUuid}")); - self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$companyUuid}/bar")); + // Testes com IDs ECOSYSTEM estáticos + self::assertSame('/v5/test/', Uri::sanitize("/v5/test/{$ecosystemId}")); + self::assertSame('/v6/test//details', Uri::sanitize("/v6/test/{$ecosystemId}/details")); + self::assertSame('/v7/test//', Uri::sanitize("/v7/test/{$ecosystemId}/{$ecosystemId2}")); - // Testes com múltiplos UUIDs (randômicos + estáticos) - self::assertSame('/v5/test//', Uri::sanitize("/v5/test/{$prefixedUuid}/{$billUuid}")); - self::assertSame('/v6/test///', Uri::sanitize("/v6/test/{$billUuid}/{$prefixedUuid}/")); - self::assertSame('/v7/test///', Uri::sanitize("/v7/test/{$prefixedUuid}/{$billUuid}/{$userUuid}")); - self::assertSame('/v8/test////', Uri::sanitize("/v8/test/{$billUuid}/{$userUuid}/{$prefixedUuid}/")); + // Testes com IDs ECOSYSTEM aleatórios + self::assertSame('/v8/test/', Uri::sanitize("/v8/test/{$randomEcosystemId}")); + self::assertSame('/v9/test//config', Uri::sanitize("/v9/test/{$randomEcosystemId}/config")); + self::assertSame('/v10/test//', Uri::sanitize("/v10/test/{$randomEcosystemId}/{$randomEcosystemId2}")); - // Testes com dois prefixos aleatórios diferentes - self::assertSame('/v9/test//', Uri::sanitize("/v9/test/{$prefixedUuid}/{$prefixedUuid2}")); - self::assertSame('/v10/test////', Uri::sanitize("/v10/test/{$prefixedUuid}/{$prefixedUuid2}/{$companyUuid}/")); + // Testes mistos: UUIDs prefixados + IDs ECOSYSTEM + self::assertSame('/v11/test//', Uri::sanitize("/v11/test/{$prefixedUuid}/{$ecosystemId}")); + self::assertSame('/v12/test///', Uri::sanitize("/v12/test/{$billUuid}/{$randomEcosystemId}/{$userUuid}")); + self::assertSame('/v13/test////', Uri::sanitize("/v13/test/{$ecosystemId}/{$prefixedUuid2}/{$randomEcosystemId2}/")); // Casos edge: diferentes contextos de API - self::assertSame('/users//profile', Uri::sanitize("/users/{$prefixedUuid}/profile")); - self::assertSame('/api/v1/bills//details', Uri::sanitize("/api/v1/bills/{$billUuid}/details")); - self::assertSame('/companies//admin//settings', Uri::sanitize("/companies/{$prefixedUuid2}/admin/{$prefixedUuid}/settings")); + self::assertSame('/users//profile', Uri::sanitize("/users/{$prefixedUuid}/profile")); + self::assertSame('/api/v1/bills//details', Uri::sanitize("/api/v1/bills/{$billUuid}/details")); + self::assertSame('/ecosystems//platform/', Uri::sanitize("/ecosystems/{$randomEcosystemId}/platform/{$randomEcosystemId2}")); + self::assertSame('/companies//admin//settings', Uri::sanitize("/companies/{$prefixedUuid2}/admin/{$ecosystemId}/settings")); // Teste sem barra final - self::assertSame('/test/', Uri::sanitize("/test/{$prefixedUuid}")); - - // Testes com prefixos de diferentes tamanhos - self::assertSame('/short/', Uri::sanitize("/short/{$prefixedUuid}")); - self::assertSame('/long//path', Uri::sanitize("/long/{$prefixedUuid2}/path")); + self::assertSame('/test/', Uri::sanitize("/test/{$prefixedUuid}")); + self::assertSame('/ecosystem/', Uri::sanitize("/ecosystem/{$randomEcosystemId}")); } } From 29c0d39a9cdf4ddfd47cfdf08dba203d1d24a885 Mon Sep 17 00:00:00 2001 From: Jeffeson Pinheiro Date: Tue, 2 Sep 2025 11:30:30 -0300 Subject: [PATCH 36/38] =?UTF-8?q?upkeep:=20Atualiza=20regex=20para=20supor?= =?UTF-8?q?tar=20novos=20formatos=20de=20ID=20e=20adiciona=20=E2=80=A6=20(?= =?UTF-8?q?#33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit upkeep: Atualiza regex para suportar novos formatos de ID e adiciona código de prefixo ECOSYSTEM --- src/Support/Uri.php | 2 +- tests/Cases/UriTest.php | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Support/Uri.php b/src/Support/Uri.php index 7707e732d..70fb8ae80 100644 --- a/src/Support/Uri.php +++ b/src/Support/Uri.php @@ -27,7 +27,7 @@ public static function sanitize(string $uri, array $uriMask = []): string '/\/(?<=\/)[0-9A-F]{16,24}(?=\/)?/i', '/\/(?<=\/)\d+(?=\/)?/', '/\/(?<=\/)R[RN]\d{16}[A-Za-z0-9]{11}/', - '/\/(?<=\/)([A-Z]+(?:-[A-Z]+)*)-([0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}|[A-Z]{3}-\d{10}_\d{3})(?=\/|$)/i', + '/\/(?<=\/)([A-Z]+(?:-[A-Z]+)*)-([0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}|[A-Z]{3}-\d+(?:_\d{3})?|[A-Za-z0-9-_]+)(?=\/|$)/i', ], ), array_merge( diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index fb31d0ba6..d7fbe5e8d 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -184,14 +184,19 @@ public function testClearUriPrefixedUuid(): void // Gera IDs do tipo ECOSYSTEM $generateEcosystemId = function(): string { $prefixes = ['ECOSYSTEM', 'PLATFORM', 'SERVICE', 'MODULE']; - $codes = ['EPF', 'ABC', 'XYZ', 'DEF', 'GHI']; + $codes = ['EPF', 'ABC', 'XYZ', 'DEF', 'GHI', 'ESF']; $prefix = $prefixes[array_rand($prefixes)]; $code = $codes[array_rand($codes)]; - $number = str_pad((string)rand(1000000000, 9999999999), 10, '0', STR_PAD_LEFT); - $sequence = str_pad((string)rand(1, 999), 3, '0', STR_PAD_LEFT); + $number = (string)rand(100000000, 9999999999); // 9-10 dígitos - return "{$prefix}-{$code}-{$number}_{$sequence}"; + // 50% de chance de ter sequência final + if (rand(0, 1)) { + $sequence = str_pad((string)rand(1, 999), 3, '0', STR_PAD_LEFT); + return "{$prefix}-{$code}-{$number}_{$sequence}"; + } + + return "{$prefix}-{$code}-{$number}"; }; $randomPrefix = $generateRandomPrefix(); From 41c649540d6d8a14ea848a106a0928b24d736b3f Mon Sep 17 00:00:00 2001 From: Jeffeson Pinheiro Date: Tue, 2 Sep 2025 12:22:54 -0300 Subject: [PATCH 37/38] =?UTF-8?q?upkeep:=20Atualiza=20regex=20para=20supor?= =?UTF-8?q?tar=20IDs=20prefixados=20e=20ajusta=20testes=20de=20sanitiza?= =?UTF-8?q?=C3=A7=C3=A3o=20(#34)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Support/Uri.php | 2 +- tests/Cases/UriTest.php | 133 +++++++++++----------------------------- 2 files changed, 36 insertions(+), 99 deletions(-) diff --git a/src/Support/Uri.php b/src/Support/Uri.php index 70fb8ae80..70395059f 100644 --- a/src/Support/Uri.php +++ b/src/Support/Uri.php @@ -27,7 +27,7 @@ public static function sanitize(string $uri, array $uriMask = []): string '/\/(?<=\/)[0-9A-F]{16,24}(?=\/)?/i', '/\/(?<=\/)\d+(?=\/)?/', '/\/(?<=\/)R[RN]\d{16}[A-Za-z0-9]{11}/', - '/\/(?<=\/)([A-Z]+(?:-[A-Z]+)*)-([0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}|[A-Z]{3}-\d+(?:_\d{3})?|[A-Za-z0-9-_]+)(?=\/|$)/i', + '/\/([A-Z]{3,}(?:-[A-Z]{3,})*)-([A-Z0-9]{3}-\d+(?:_\d{3})?|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|[A-Za-z0-9]{8,})(?=\/|$)/i', ], ), array_merge( diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index d7fbe5e8d..53bcc04e0 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -162,117 +162,54 @@ public function testClearUriExternalIds(): void self::assertSame('/v9/test//bar/', Uri::sanitize('/v9/test/RR2101818220123720H9KJTERfw1a/bar/12345')); } - public function testClearUriPrefixedUuid(): void + public function testClearUriPrefixedId(): void { - // Gera prefixos completamente aleatórios - $generateRandomPrefix = function(): string { - $wordCount = rand(1, 3); // 1 a 3 palavras no prefixo - $words = []; - - for ($i = 0; $i < $wordCount; $i++) { - $wordLength = rand(3, 8); // palavras de 3 a 8 caracteres - $word = ''; - for ($j = 0; $j < $wordLength; $j++) { - $word .= chr(rand(65, 90)); // A-Z (65-90 na tabela ASCII) - } - $words[] = $word; - } - - return implode('-', $words); - }; - - // Gera IDs do tipo ECOSYSTEM - $generateEcosystemId = function(): string { - $prefixes = ['ECOSYSTEM', 'PLATFORM', 'SERVICE', 'MODULE']; - $codes = ['EPF', 'ABC', 'XYZ', 'DEF', 'GHI', 'ESF']; - - $prefix = $prefixes[array_rand($prefixes)]; - $code = $codes[array_rand($codes)]; - $number = (string)rand(100000000, 9999999999); // 9-10 dígitos - - // 50% de chance de ter sequência final - if (rand(0, 1)) { - $sequence = str_pad((string)rand(1, 999), 3, '0', STR_PAD_LEFT); - return "{$prefix}-{$code}-{$number}_{$sequence}"; - } - - return "{$prefix}-{$code}-{$number}"; - }; - - $randomPrefix = $generateRandomPrefix(); - - // Gera UUIDs aleatórios (incluindo caracteres não-hexadecimais para testar a regex) - $uuidChars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - $randomUuid = sprintf( - '%s-%s-%s-%s-%s', - substr(str_shuffle($uuidChars), 0, 8), - substr(str_shuffle($uuidChars), 0, 4), - substr(str_shuffle($uuidChars), 0, 4), - substr(str_shuffle($uuidChars), 0, 4), - substr(str_shuffle($uuidChars), 0, 12) - ); - - $prefixedUuid = "{$randomPrefix}-{$randomUuid}"; - - // Casos de teste estático para garantir consistência - $billUuid = 'BILL-123e4567-e89b-12d3-a456-426614174000'; - $userUuid = 'USER-abc1234d-e56f-78g9-h012-345678901234'; - $companyUuid = 'COMPANY-ADMIN-456e7890-f12a-34b5-c678-901234567890'; - - // IDs do tipo ECOSYSTEM (estáticos e aleatórios) - $ecosystemId = 'ECOSYSTEM-EPF-0100290422_001'; - $ecosystemId2 = 'PLATFORM-ABC-1234567890_999'; - $randomEcosystemId = $generateEcosystemId(); - $randomEcosystemId2 = $generateEcosystemId(); - - // Gera mais alguns prefixos aleatórios para testes variados - $randomPrefix2 = $generateRandomPrefix(); - $randomUuid2 = sprintf( - '%s-%s-%s-%s-%s', - substr(str_shuffle($uuidChars), 0, 8), - substr(str_shuffle($uuidChars), 0, 4), - substr(str_shuffle($uuidChars), 0, 4), - substr(str_shuffle($uuidChars), 0, 4), - substr(str_shuffle($uuidChars), 0, 12) - ); - $prefixedUuid2 = "{$randomPrefix2}-{$randomUuid2}"; + // Casos de teste específicos solicitados + $ecosystemId1 = 'ECOSYSTEM-PPF-0100206721_003'; + $ecosystemId2 = 'ECOSYSTEM-EPF-0100308183_001'; + $ecosystemId3 = 'ECOSYSTEM-ESF-105454545'; + $billUuid = 'BILL-1811cd92-ed15-4b8a-a571-6cfa44002703'; // Testes básicos self::assertSame('/v1/test', Uri::sanitize('/v1/test')); - // Testes com UUIDs prefixados randômicos - self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$prefixedUuid}")); - self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$prefixedUuid}/bar")); - self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$prefixedUuid}/bar/{$prefixedUuid}/")); + // Testes com ECOSYSTEM-PPF-0100206721_003 + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$ecosystemId1}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$ecosystemId1}/bar")); + self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$ecosystemId1}/bar/{$ecosystemId1}/")); - // Testes com UUIDs prefixados estáticos - self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$billUuid}")); - self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$billUuid}/bar")); - self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$billUuid}/bar/{$billUuid}/")); + // Testes com ECOSYSTEM-EPF-0100308183_001 + self::assertSame('/v5/test/', Uri::sanitize("/v5/test/{$ecosystemId2}")); + self::assertSame('/v6/test//details', Uri::sanitize("/v6/test/{$ecosystemId2}/details")); + self::assertSame('/v7/test//', Uri::sanitize("/v7/test/{$ecosystemId2}/{$ecosystemId1}")); - // Testes com IDs ECOSYSTEM estáticos - self::assertSame('/v5/test/', Uri::sanitize("/v5/test/{$ecosystemId}")); - self::assertSame('/v6/test//details', Uri::sanitize("/v6/test/{$ecosystemId}/details")); - self::assertSame('/v7/test//', Uri::sanitize("/v7/test/{$ecosystemId}/{$ecosystemId2}")); + // Testes com ECOSYSTEM-ESF-105454545 + self::assertSame('/v8/test/', Uri::sanitize("/v8/test/{$ecosystemId3}")); + self::assertSame('/v9/test//config', Uri::sanitize("/v9/test/{$ecosystemId3}/config")); - // Testes com IDs ECOSYSTEM aleatórios - self::assertSame('/v8/test/', Uri::sanitize("/v8/test/{$randomEcosystemId}")); - self::assertSame('/v9/test//config', Uri::sanitize("/v9/test/{$randomEcosystemId}/config")); - self::assertSame('/v10/test//', Uri::sanitize("/v10/test/{$randomEcosystemId}/{$randomEcosystemId2}")); + // Testes com BILL-1811cd92-ed15-4b8a-a571-6cfa44002703 + self::assertSame('/v10/test/', Uri::sanitize("/v10/test/{$billUuid}")); + self::assertSame('/v11/test//profile', Uri::sanitize("/v11/test/{$billUuid}/profile")); + self::assertSame('/v12/test//bar//', Uri::sanitize("/v12/test/{$billUuid}/bar/{$billUuid}/")); - // Testes mistos: UUIDs prefixados + IDs ECOSYSTEM - self::assertSame('/v11/test//', Uri::sanitize("/v11/test/{$prefixedUuid}/{$ecosystemId}")); - self::assertSame('/v12/test///', Uri::sanitize("/v12/test/{$billUuid}/{$randomEcosystemId}/{$userUuid}")); - self::assertSame('/v13/test////', Uri::sanitize("/v13/test/{$ecosystemId}/{$prefixedUuid2}/{$randomEcosystemId2}/")); + // Testes mistos entre os IDs + self::assertSame('/v13/test//', Uri::sanitize("/v13/test/{$billUuid}/{$ecosystemId3}")); + self::assertSame('/v14/test///', Uri::sanitize("/v14/test/{$ecosystemId1}/{$ecosystemId2}/{$billUuid}")); + self::assertSame('/v15/test////', Uri::sanitize("/v15/test/{$ecosystemId3}/{$billUuid}/{$ecosystemId1}/")); // Casos edge: diferentes contextos de API - self::assertSame('/users//profile', Uri::sanitize("/users/{$prefixedUuid}/profile")); + self::assertSame('/users//profile', Uri::sanitize("/users/{$billUuid}/profile")); self::assertSame('/api/v1/bills//details', Uri::sanitize("/api/v1/bills/{$billUuid}/details")); - self::assertSame('/ecosystems//platform/', Uri::sanitize("/ecosystems/{$randomEcosystemId}/platform/{$randomEcosystemId2}")); - self::assertSame('/companies//admin//settings', Uri::sanitize("/companies/{$prefixedUuid2}/admin/{$ecosystemId}/settings")); + self::assertSame('/ecosystems//platform/', Uri::sanitize("/ecosystems/{$ecosystemId1}/platform/{$ecosystemId2}")); + self::assertSame('/companies//admin//settings', Uri::sanitize("/companies/{$billUuid}/admin/{$ecosystemId3}/settings")); + + // Casos críticos: evitar falsos positivos + self::assertSame('/pic-pay/entry/id/', Uri::sanitize("/pic-pay/entry/id/{$ecosystemId3}")); + self::assertSame('/api-gateway/service/', Uri::sanitize("/api-gateway/service/{$ecosystemId2}")); + self::assertSame('/health-check/status/', Uri::sanitize("/health-check/status/{$billUuid}")); // Teste sem barra final - self::assertSame('/test/', Uri::sanitize("/test/{$prefixedUuid}")); - self::assertSame('/ecosystem/', Uri::sanitize("/ecosystem/{$randomEcosystemId}")); + self::assertSame('/test/', Uri::sanitize("/test/{$billUuid}")); + self::assertSame('/ecosystem/', Uri::sanitize("/ecosystem/{$ecosystemId1}")); } } From a71e5c01f43004482f0ba68a1ef21c381edb3bdc Mon Sep 17 00:00:00 2001 From: annacia Date: Fri, 17 Oct 2025 15:54:36 -0300 Subject: [PATCH 38/38] mask for phone number and email --- src/Support/Uri.php | 4 ++++ tests/Cases/UriTest.php | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/Support/Uri.php b/src/Support/Uri.php index 70395059f..41bb4f4cc 100644 --- a/src/Support/Uri.php +++ b/src/Support/Uri.php @@ -26,7 +26,9 @@ public static function sanitize(string $uri, array $uriMask = []): string '/\/(?<=\/)([A-Z]{3}-?\d[0-9A-Z]\d{2})(?=\/)?/i', '/\/(?<=\/)[0-9A-F]{16,24}(?=\/)?/i', '/\/(?<=\/)\d+(?=\/)?/', + '/\/(?<=\/)\+?\d{10,15}(?=\/|$)/', '/\/(?<=\/)R[RN]\d{16}[A-Za-z0-9]{11}/', + '/\/(?<=\/)[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}(?=\/|$)/i', '/\/([A-Z]{3,}(?:-[A-Z]{3,})*)-([A-Z0-9]{3}-\d+(?:_\d{3})?|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|[A-Za-z0-9]{8,})(?=\/|$)/i', ], ), @@ -39,7 +41,9 @@ public static function sanitize(string $uri, array $uriMask = []): string '/', '/', '/', + '/', '/', + '/', '/', ], ), diff --git a/tests/Cases/UriTest.php b/tests/Cases/UriTest.php index 53bcc04e0..2db72cfea 100644 --- a/tests/Cases/UriTest.php +++ b/tests/Cases/UriTest.php @@ -32,6 +32,21 @@ public function testSanitizeNumbers(): void self::assertSame('/v8/test////', Uri::sanitize('/v8/test/123/456/789/')); } + public function testSanitizePhoneNumber(): void + { + $phoneNumber = '+5511983999292'; + $phoneNumber2 = '+9607392675'; + + self::assertSame('/v1/test', Uri::sanitize('/v1/test')); + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$phoneNumber}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$phoneNumber}/bar")); + self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$phoneNumber}/bar/{$phoneNumber2}/")); + self::assertSame('/v5/test//', Uri::sanitize("/v5/test/$phoneNumber/$phoneNumber2")); + self::assertSame('/v6/test///', Uri::sanitize("/v6/test/$phoneNumber/$phoneNumber2/")); + self::assertSame('/v7/test///', Uri::sanitize("/v7/test/$phoneNumber/$phoneNumber2/$phoneNumber")); + self::assertSame('/v8/test////', Uri::sanitize("/v8/test/$phoneNumber/$phoneNumber2/$phoneNumber/")); + } + public function testSanitizeLicensePlatesStrings(): void { self::assertSame('/v1/test', Uri::sanitize('/v1/test')); @@ -162,6 +177,21 @@ public function testClearUriExternalIds(): void self::assertSame('/v9/test//bar/', Uri::sanitize('/v9/test/RR2101818220123720H9KJTERfw1a/bar/12345')); } + public function testSanitizeEmail(): void + { + $email = 'abcdwxyz@fghijk.com'; + $email2 = 'elmnopq@rstuvw.com.br'; + + self::assertSame('/v1/test', Uri::sanitize('/v1/test')); + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$email}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$email}/bar")); + self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$email}/bar/{$email2}/")); + self::assertSame('/v5/test//', Uri::sanitize("/v5/test/$email/$email2")); + self::assertSame('/v6/test///', Uri::sanitize("/v6/test/$email/$email2/")); + self::assertSame('/v7/test///', Uri::sanitize("/v7/test/$email/$email2/$email")); + self::assertSame('/v8/test////', Uri::sanitize("/v8/test/$email/$email2/$email/")); + } + public function testClearUriPrefixedId(): void { // Casos de teste específicos solicitados