diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0f09d0b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+*.cache
+.idea
+.vscode
+vendor/
diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php
new file mode 100644
index 0000000..1b4f0b7
--- /dev/null
+++ b/.php-cs-fixer.php
@@ -0,0 +1,99 @@
+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,
+ 'global_namespace_import' => [
+ 'import_classes' => true,
+ 'import_constants' => true,
+ 'import_functions' => true,
+ ],
+ ])
+ ->setFinder(
+ PhpCsFixer\Finder::create()
+ ->exclude('vendor')
+ ->in(__DIR__)
+ )
+ ->setUsingCache(true);
diff --git a/LICENSE b/LICENSE
index c35d3f5..36eac04 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/README.md b/README.md
new file mode 100644
index 0000000..7193034
--- /dev/null
+++ b/README.md
@@ -0,0 +1,19 @@
+# Hyperf Tracer
+
+đź” Drop-in replacement for the `hyperf/tracer` component.
+
+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/tracer`:
+```shell
+composer update hyperf/tracer
+```
diff --git a/class_map/Map.php b/class_map/Map.php
index be7bde9..e5e9035 100644
--- a/class_map/Map.php
+++ b/class_map/Map.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 Zipkin\Propagation;
diff --git a/class_map/SpanContext.php b/class_map/SpanContext.php
new file mode 100644
index 0000000..425889c
--- /dev/null
+++ b/class_map/SpanContext.php
@@ -0,0 +1,98 @@
+baggage = $baggage ?? [];
+ }
+
+ #[ReturnTypeWillChange]
+ public function getIterator(): ArrayIterator|iterable
+ {
+ return new ArrayIterator($this->baggage);
+ }
+
+ public function getBaggageItem(string $key): ?string
+ {
+ return $this->baggage[$key] ?? null;
+ }
+
+ /**
+ * @return SpanContext
+ */
+ public function withBaggageItem(string $key, string $value): OTSpanContext
+ {
+ return new self(
+ $this->traceId,
+ $this->spanId,
+ $this->parentId,
+ $this->flags,
+ [$key => $value] + $this->baggage
+ );
+ }
+
+ public function getTraceId(): string
+ {
+ return $this->traceId;
+ }
+
+ public function setTraceId(string $traceId): self
+ {
+ $this->traceId = $traceId;
+ return $this;
+ }
+
+ public function getParentId(): ?string
+ {
+ return $this->parentId;
+ }
+
+ public function getSpanId(): string
+ {
+ return $this->spanId;
+ }
+
+ public function getFlags(): ?int
+ {
+ return $this->flags;
+ }
+
+ public function getBaggage(): array
+ {
+ return $this->baggage;
+ }
+
+ public function getDebugId(): ?int
+ {
+ return $this->debugId;
+ }
+
+ public function isDebugIdContainerOnly(): bool
+ {
+ return ($this->traceId === null) && ($this->debugId !== null);
+ }
+}
diff --git a/class_map/TextCodec.php b/class_map/TextCodec.php
new file mode 100644
index 0000000..9c35b46
--- /dev/null
+++ b/class_map/TextCodec.php
@@ -0,0 +1,207 @@
+urlEncoding = $urlEncoding;
+ $this->traceIdHeader = str_replace('_', '-', strtolower($traceIdHeader));
+ $this->baggagePrefix = str_replace('_', '-', strtolower($baggageHeaderPrefix));
+ $this->debugIdHeader = str_replace('_', '-', strtolower($debugIdHeader));
+ $this->prefixLength = strlen($baggageHeaderPrefix);
+ $this->openTelemetryCodec = new TextCodecOtel();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @param SpanContext $spanContext
+ * @param mixed $carrier
+ *
+ * @return void
+ * @see \Jaeger\Tracer::inject
+ *
+ */
+ public function inject(SpanContext $spanContext, &$carrier)
+ {
+ $this->openTelemetryCodec->inject($spanContext, $carrier);
+
+ $carrier[$this->traceIdHeader] = $this->spanContextToString(
+ $spanContext->getTraceId(),
+ $spanContext->getSpanId(),
+ $spanContext->getParentId(),
+ $spanContext->getFlags()
+ );
+
+ $baggage = $spanContext->getBaggage();
+ if (empty($baggage)) {
+ return;
+ }
+
+ foreach ($baggage as $key => $value) {
+ $encodedValue = $value;
+
+ if ($this->urlEncoding) {
+ $encodedValue = urlencode($value);
+ }
+ $headerName = $this->baggagePrefix . $key;
+
+ if (!GuzzleHeaderValidate::isValidHeader($headerName, $encodedValue)) {
+ continue;
+ }
+ $carrier[$headerName] = $encodedValue;
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @param mixed $carrier
+ * @return SpanContext|null
+ *
+ * @throws Exception
+ * @see \Jaeger\Tracer::extract
+ *
+ */
+ public function extract($carrier)
+ {
+ $spanContext = $this->openTelemetryCodec->extract($carrier);
+ if ($spanContext !== null) {
+ return $spanContext;
+ }
+
+ $traceId = null;
+ $spanId = null;
+ $parentId = null;
+ $flags = null;
+ $baggage = null;
+ $debugId = null;
+
+ foreach ((array)$carrier as $key => $value) {
+ $ucKey = strtolower($key);
+
+ if ($ucKey === $this->traceIdHeader) {
+ if ($this->urlEncoding) {
+ $value = urldecode($value);
+ }
+ [$traceId, $spanId, $parentId, $flags] =
+ $this->spanContextFromString($value);
+ } elseif ($this->startsWith($ucKey, $this->baggagePrefix)) {
+ if ($this->urlEncoding) {
+ $value = urldecode($value);
+ }
+ $attrKey = substr($key, $this->prefixLength);
+ if ($baggage === null) {
+ $baggage = [strtolower($attrKey) => $value];
+ } else {
+ $baggage[strtolower($attrKey)] = $value;
+ }
+ } elseif ($ucKey === $this->debugIdHeader) {
+ if ($this->urlEncoding) {
+ $value = urldecode($value);
+ }
+ $debugId = $value;
+ }
+ }
+
+ if ($traceId === null && $baggage !== null) {
+ throw new Exception('baggage without trace ctx');
+ }
+
+ if ($traceId === null) {
+ if ($debugId !== null) {
+ return new SpanContext(null, null, null, null, [], $debugId);
+ }
+ return null;
+ }
+
+ return new SpanContext($traceId, $spanId, $parentId, $flags, $baggage);
+ }
+
+ /**
+ * Store a span context to a string.
+ *
+ * @param int $traceId
+ * @param int $spanId
+ * @param int $parentId
+ * @param int $flags
+ * @return string
+ */
+ private function spanContextToString($traceId, $spanId, $parentId, $flags)
+ {
+ $parentId = $parentId ?? 0;
+ if (is_int($traceId)) {
+ $traceId = sprintf('%016x', $traceId);
+ }
+ return sprintf('%s:%x:%x:%x', $traceId, $spanId, $parentId, $flags);
+ }
+
+ /**
+ * Create a span context from a string.
+ *
+ * @param string $value
+ * @return array
+ *
+ * @throws Exception
+ */
+ private function spanContextFromString($value): array
+ {
+ $parts = explode(':', $value);
+
+ if (count($parts) != 4) {
+ throw new Exception('Malformed tracer state string.');
+ }
+
+ return [
+ $parts[0],
+ CodecUtility::hexToInt64($parts[1]),
+ CodecUtility::hexToInt64($parts[2]),
+ $parts[3],
+ ];
+ }
+
+ /**
+ * Checks that a string ($haystack) starts with a given prefix ($needle).
+ *
+ * @param string $haystack
+ * @param string $needle
+ * @return bool
+ */
+ private function startsWith(string $haystack, string $needle): bool
+ {
+ return substr($haystack, 0, strlen($needle)) == $needle;
+ }
+}
diff --git a/class_map/ThriftUdpTransport.php b/class_map/ThriftUdpTransport.php
index b22f3ee..90ab61c 100644
--- a/class_map/ThriftUdpTransport.php
+++ b/class_map/ThriftUdpTransport.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 Jaeger;
@@ -25,39 +25,19 @@
use Thrift\Transport\TTransport;
use Throwable;
+use function Hyperf\Support\env;
+
class ThriftUdpTransport extends TTransport
{
- /**
- * @var string
- */
- private $host;
-
- /**
- * @var int
- */
- private $port;
-
- /**
- * @var LoggerInterface
- */
- private $logger;
-
- /**
- * @var null|resource|Socket
- */
- private $socket;
+ private null|Socket $socket = null;
- /**
- * @var ?Channel
- */
- private $chan;
+ private ?Channel $chan = null;
- public function __construct(string $host, int $port, ?LoggerInterface $logger = null)
- {
- $this->host = $host;
- $this->port = $port;
- $this->logger = $logger ?? new NullLogger();
- }
+ public function __construct(
+ private string $host,
+ private int $port,
+ private LoggerInterface $logger
+ ) {}
/**
* Whether this transport is open.
@@ -141,9 +121,17 @@ public function write($buf)
$this->loop();
}
- $this->chan->push(function () use ($buf) {
+ $pushed = $this->chan->push(function () use ($buf) {
$this->doWrite($buf);
- });
+ }, (float) env('TRACE_THRIFT_UDP_TIMEOUT', 0.1));
+
+ if (! $pushed) {
+ $this->logger->error('ThriftUdpTransport error:' . match (true) {
+ $this->chan->isTimeout() => 'Channel Timeout',
+ $this->chan->isClosing() => 'Channel Close',
+ default => 'Channel Error'
+ });
+ }
}
private function doOpen(): void
@@ -172,7 +160,14 @@ private function loop(): void
$this->chan = new Channel(1);
Coroutine::create(function () {
while (true) {
- $this->doOpen();
+ try {
+ $this->doOpen();
+ } catch (Throwable $e) {
+ $this->chan->close();
+ $this->chan = null;
+ throw $e;
+ }
+
while (true) {
try {
$closure = $this->chan->pop();
@@ -181,13 +176,7 @@ private function loop(): void
}
$closure->call($this);
} catch (Throwable $e) {
- if (ApplicationContext::hasContainer()) {
- if (ApplicationContext::getContainer()->has(StdoutLoggerInterface::class)) {
- ApplicationContext::getContainer()
- ->get(StdoutLoggerInterface::class)
- ->error('ThriftUdpTransport error:' . $e->getMessage());
- }
- }
+ $this->logger->error('ThriftUdpTransport error:' . $e->getMessage());
@socket_close($this->socket);
$this->socket = null;
break;
diff --git a/composer.json b/composer.json
index e3f3dbf..2130750 100644
--- a/composer.json
+++ b/composer.json
@@ -1,12 +1,13 @@
{
"name": "hyperf/tracer",
- "description": "A open tracing system implemented for Hyperf or other coroutine framework",
+ "description": "Drop-in replacement for the Hyperf Tracer component.",
"license": "MIT",
"keywords": [
"php",
"hyperf",
"open-tracing",
- "zipkin"
+ "zipkin",
+ "jaeger"
],
"homepage": "https://hyperf.io",
"support": {
@@ -23,8 +24,19 @@
"hyperf/support": "~3.1.0",
"hyperf/utils": "~3.1.0",
"jcchavezs/zipkin-opentracing": "^2.0",
+ "jonahgeorge/jaeger-client-php": "^1.4",
"opentracing/opentracing": "^1.0",
- "psr/http-message": "^1.0 || ^2.0"
+ "psr/http-message": "^1.0|^2.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.21",
+ "hyperf/config": "^3.0",
+ "hyperf/testing": "^3.0",
+ "mockery/mockery": "^1.6",
+ "phpstan/extension-installer": "^1.3",
+ "phpstan/phpstan": "^1.10",
+ "phpstan/phpstan-mockery": "^1.1",
+ "rector/rector": "^0.17.5"
},
"suggest": {
"hyperf/event": "Required to use DbQueryExecutedListener.",
@@ -41,8 +53,18 @@
"HyperfTest\\Tracer\\": "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"
+ },
"config": {
- "sort-packages": true
+ "sort-packages": true,
+ "allow-plugins": {
+ "phpstan/extension-installer": true
+ }
},
"extra": {
"branch-alias": {
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..1daff2e
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,7372 @@
+{
+ "_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": "f42f85bc37ab21c5cb3edf2d38e78db3",
+ "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": "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": "graham-campbell/result-type",
+ "version": "v1.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/GrahamCampbell/Result-Type.git",
+ "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862"
+ },
+ "dist": {
+ "type": "zip",
+ "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.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2"
+ },
+ "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.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-11-12T22:16:48+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "7.8.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "41042bc7ab002487b876a0683fc8dce04ddce104"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104",
+ "reference": "41042bc7ab002487b876a0683fc8dce04ddce104",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "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"
+ },
+ "provide": {
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "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.36 || ^9.6.15",
+ "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.8.1"
+ },
+ "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-12-03T20:35:24+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223"
+ },
+ "dist": {
+ "type": "zip",
+ "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.2",
+ "phpunit/phpunit": "^8.5.36 || ^9.6.15"
+ },
+ "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.2"
+ },
+ "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-12-03T20:19:20+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.6.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221",
+ "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0",
+ "ralouphie/getallheaders": "^3.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "http-interop/http-factory-tests": "^0.9",
+ "phpunit/phpunit": "^8.5.36 || ^9.6.15"
+ },
+ "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.6.2"
+ },
+ "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-12-03T20:05:35+00:00"
+ },
+ {
+ "name": "hyperf/code-parser",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/code-parser.git",
+ "reference": "b2b42ea957463fbdf6fbb762fcff0ff578c36a4c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/code-parser/zipball/b2b42ea957463fbdf6fbb762fcff0ff578c36a4c",
+ "reference": "b2b42ea957463fbdf6fbb762fcff0ff578c36a4c",
+ "shasum": ""
+ },
+ "require": {
+ "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)",
+ "nikic/php-parser": "Required to use PhpParser. (^4.0)"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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"
+ },
+ "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/codec",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/codec.git",
+ "reference": "18db58e92688b7992e3d939b6c5b7790a45f2d2b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/codec/zipball/18db58e92688b7992e3d939b6c5b7790a45f2d2b",
+ "reference": "18db58e92688b7992e3d939b6c5b7790a45f2d2b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-xml": "*",
+ "hyperf/contract": "~3.1.0",
+ "php": ">=8.1"
+ },
+ "suggest": {
+ "ext-igbinary": "Required to use IgbinarySerializerPacker."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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"
+ },
+ "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/collection",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/collection.git",
+ "reference": "a71303f5d21786253f6814aa9e1663c5e53ec575"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/collection/zipball/a71303f5d21786253f6814aa9e1663c5e53ec575",
+ "reference": "a71303f5d21786253f6814aa9e1663c5e53ec575",
+ "shasum": ""
+ },
+ "require": {
+ "hyperf/contract": "~3.1.0",
+ "hyperf/macroable": "~3.1.0",
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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"
+ },
+ "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/conditionable",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/conditionable.git",
+ "reference": "18da1405ae39a775bd3fae8cec98841eaa22f013"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/conditionable/zipball/18da1405ae39a775bd3fae8cec98841eaa22f013",
+ "reference": "18da1405ae39a775bd3fae8cec98841eaa22f013",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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"
+ },
+ "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.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/context.git",
+ "reference": "8307d6c924ed67c7abd47874ec14f0e2e3e4b732"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/context/zipball/8307d6c924ed67c7abd47874ec14f0e2e3e4b732",
+ "reference": "8307d6c924ed67c7abd47874ec14f0e2e3e4b732",
+ "shasum": ""
+ },
+ "require": {
+ "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.1-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"
+ },
+ "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.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/contract.git",
+ "reference": "2b2f3610fce6c080c6b61764cad2745f7c9a312b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/contract/zipball/2b2f3610fce6c080c6b61764cad2745f7c9a312b",
+ "reference": "2b2f3610fce6c080c6b61764cad2745f7c9a312b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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"
+ },
+ "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/coordinator",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/coordinator.git",
+ "reference": "9f589319ba689ece5e4399b7ee218a223b089cba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/coordinator/zipball/9f589319ba689ece5e4399b7ee218a223b089cba",
+ "reference": "9f589319ba689ece5e4399b7ee218a223b089cba",
+ "shasum": ""
+ },
+ "require": {
+ "hyperf/engine": "^2.0",
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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"
+ },
+ "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/coroutine",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/coroutine.git",
+ "reference": "60ed5835ec00a07da9fb34fb605fd7a99c9f8a5e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/coroutine/zipball/60ed5835ec00a07da9fb34fb605fd7a99c9f8a5e",
+ "reference": "60ed5835ec00a07da9fb34fb605fd7a99c9f8a5e",
+ "shasum": ""
+ },
+ "require": {
+ "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.1-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"
+ },
+ "funding": [
+ {
+ "url": "https://hyperf.wiki/#/zh-cn/donate",
+ "type": "custom"
+ },
+ {
+ "url": "https://opencollective.com/hyperf",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2023-11-24T03:10:53+00:00"
+ },
+ {
+ "name": "hyperf/di",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/di.git",
+ "reference": "08efa8748caf3af777707b82c270b60313bfd878"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/di/zipball/08efa8748caf3af777707b82c270b60313bfd878",
+ "reference": "08efa8748caf3af777707b82c270b60313bfd878",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.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.1",
+ "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.1-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"
+ },
+ "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/engine",
+ "version": "v2.10.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/engine.git",
+ "reference": "7e7238708f29f39df643aba25485ba1c075943c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/engine/zipball/7e7238708f29f39df643aba25485ba1c075943c1",
+ "reference": "7e7238708f29f39df643aba25485ba1c075943c1",
+ "shasum": ""
+ },
+ "require": {
+ "hyperf/engine-contract": "~1.9.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.10-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.10.3"
+ },
+ "time": "2023-09-30T14:57:09+00:00"
+ },
+ {
+ "name": "hyperf/engine-contract",
+ "version": "v1.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/engine-contract.git",
+ "reference": "45c9c49766d8b0e539975fe4c5ed6807221c4b38"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/engine-contract/zipball/45c9c49766d8b0e539975fe4c5ed6807221c4b38",
+ "reference": "45c9c49766d8b0e539975fe4c5ed6807221c4b38",
+ "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.9-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.9.0"
+ },
+ "time": "2023-07-14T02:21:02+00:00"
+ },
+ {
+ "name": "hyperf/guzzle",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/guzzle.git",
+ "reference": "df01c9b6ba645347a05113c6bcac2314145e611c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/guzzle/zipball/df01c9b6ba645347a05113c6bcac2314145e611c",
+ "reference": "df01c9b6ba645347a05113c6bcac2314145e611c",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": "^6.3|^7.0",
+ "php": ">=8.1",
+ "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.1-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.1.0"
+ },
+ "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.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/macroable.git",
+ "reference": "de5b07be74d666f04ecef4ce5ee6ceb97d846cfa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/macroable/zipball/de5b07be74d666f04ecef4ce5ee6ceb97d846cfa",
+ "reference": "de5b07be74d666f04ecef4ce5ee6ceb97d846cfa",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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"
+ },
+ "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.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/pipeline.git",
+ "reference": "44352f9b20c61c372dae655894f7a8f2bb86d0de"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/pipeline/zipball/44352f9b20c61c372dae655894f7a8f2bb86d0de",
+ "reference": "44352f9b20c61c372dae655894f7a8f2bb86d0de",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^1.0|^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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"
+ },
+ "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.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/serializer.git",
+ "reference": "8fae2fa4342cbefead70b54e42e11c228d8be94b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/serializer/zipball/8fae2fa4342cbefead70b54e42e11c228d8be94b",
+ "reference": "8fae2fa4342cbefead70b54e42e11c228d8be94b",
+ "shasum": ""
+ },
+ "require": {
+ "hyperf/contract": "~3.1.0",
+ "php": ">=8.1"
+ },
+ "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.1-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"
+ },
+ "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/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/stringable",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/stringable.git",
+ "reference": "10465337a7bbf528ab28bd84330d795a5b3e06bd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/stringable/zipball/10465337a7bbf528ab28bd84330d795a5b3e06bd",
+ "reference": "10465337a7bbf528ab28bd84330d795a5b3e06bd",
+ "shasum": ""
+ },
+ "require": {
+ "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)",
+ "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.1-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"
+ },
+ "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.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/support.git",
+ "reference": "7752db2c4d292e4a44dadbc49e39bdfba4c8947e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/support/zipball/7752db2c4d292e4a44dadbc49e39bdfba4c8947e",
+ "reference": "7752db2c4d292e4a44dadbc49e39bdfba4c8947e",
+ "shasum": ""
+ },
+ "require": {
+ "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)"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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"
+ },
+ "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/tappable",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/tappable.git",
+ "reference": "f640e37006dad09ca6f2b9a4cf047907aaebf002"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/tappable/zipball/f640e37006dad09ca6f2b9a4cf047907aaebf002",
+ "reference": "f640e37006dad09ca6f2b9a4cf047907aaebf002",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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"
+ },
+ "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.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/utils.git",
+ "reference": "10522904195eb5af9090bbd072589fb387c91041"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/utils/zipball/10522904195eb5af9090bbd072589fb387c91041",
+ "reference": "10522904195eb5af9090bbd072589fb387c91041",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/inflector": "^2.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.1-dev"
+ }
+ },
+ "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"
+ },
+ "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": "jcchavezs/zipkin-opentracing",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jcchavezs/zipkin-php-opentracing.git",
+ "reference": "bb8f1c5c3643594c0328c7df98e49fef86c85710"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jcchavezs/zipkin-php-opentracing/zipball/bb8f1c5c3643594c0328c7df98e49fef86c85710",
+ "reference": "bb8f1c5c3643594c0328c7df98e49fef86c85710",
+ "shasum": ""
+ },
+ "require": {
+ "opentracing/opentracing": "^1.0.1",
+ "openzipkin/zipkin": "^3.0.0",
+ "php": ">=7.4 || ^8.0"
+ },
+ "provide": {
+ "opentracing/opentracing": "1.0.0"
+ },
+ "require-dev": {
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpstan/phpstan": "^0.12.26",
+ "phpunit/phpunit": "^9.0",
+ "squizlabs/php_codesniffer": "3.*"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ZipkinOpenTracing\\": "./src/ZipkinOpenTracing/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "José Carlos Chávez",
+ "email": "jcchavezs@gmail.com"
+ }
+ ],
+ "description": "A Zipkin bridge with OpenTracing",
+ "support": {
+ "issues": "https://github.com/jcchavezs/zipkin-php-opentracing/issues",
+ "source": "https://github.com/jcchavezs/zipkin-php-opentracing/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.me/jcchavezs",
+ "type": "paypal"
+ }
+ ],
+ "time": "2023-06-08T11:40:46+00:00"
+ },
+ {
+ "name": "jonahgeorge/jaeger-client-php",
+ "version": "v1.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jonahgeorge/jaeger-client-php.git",
+ "reference": "39e35bc3168da12cf596038cd1332e700b5131e9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jonahgeorge/jaeger-client-php/zipball/39e35bc3168da12cf596038cd1332e700b5131e9",
+ "reference": "39e35bc3168da12cf596038cd1332e700b5131e9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-sockets": "*",
+ "opentracing/opentracing": "^1.0",
+ "packaged/thrift": "^0.13",
+ "php": "^7.1 || ^8.0 || ^8.1",
+ "psr/cache": "^1.0 || ^2.0 || ^3.0",
+ "psr/log": "^1.0 || ^2.0 || ^3.0"
+ },
+ "require-dev": {
+ "cache/array-adapter": "^1.0",
+ "phpunit/phpunit": "^7 || ^8 || ^9",
+ "squizlabs/php_codesniffer": "3.*",
+ "symfony/polyfill-php73": "^1.10"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "./src/Jaeger/Constants.php"
+ ],
+ "psr-4": {
+ "Jaeger\\": "src/Jaeger/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jonah George",
+ "homepage": "http://twitter.com/jonahgeorge"
+ },
+ {
+ "name": "José Carlos Chávez",
+ "email": "jcchavezs@gmail.com"
+ },
+ {
+ "name": "Contributors",
+ "homepage": "https://github.com/jonahgeorge/jaeger-client-php/graphs/contributors"
+ }
+ ],
+ "description": "Jaeger Bindings for PHP OpenTracing API",
+ "keywords": [
+ "jaeger",
+ "opentracing",
+ "trace",
+ "tracing"
+ ],
+ "support": {
+ "issues": "https://github.com/jonahgeorge/jaeger-client-php/issues",
+ "source": "https://github.com/jonahgeorge/jaeger-client-php/tree/v1.5.0"
+ },
+ "time": "2023-08-26T09:30:03+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.17.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
+ "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
+ "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.17.1"
+ },
+ "time": "2023-08-13T19:53:39+00:00"
+ },
+ {
+ "name": "opentracing/opentracing",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/opentracing/opentracing-php.git",
+ "reference": "cd60bd1fb2a25280600bc74c7f9e0c13881a9116"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/opentracing/opentracing-php/zipball/cd60bd1fb2a25280600bc74c7f9e0c13881a9116",
+ "reference": "cd60bd1fb2a25280600bc74c7f9e0c13881a9116",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "~0.12",
+ "phpunit/phpunit": "^7.0 || ^9.0",
+ "squizlabs/php_codesniffer": "3.*"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/OpenTracing/Tags.php",
+ "src/OpenTracing/Formats.php"
+ ],
+ "psr-4": {
+ "OpenTracing\\": "src/OpenTracing/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "José Carlos Chávez",
+ "email": "jcchavezs@gmail.com"
+ }
+ ],
+ "description": "OpenTracing API for PHP",
+ "support": {
+ "issues": "https://github.com/opentracing/opentracing-php/issues",
+ "source": "https://github.com/opentracing/opentracing-php/tree/1.0.2"
+ },
+ "time": "2022-01-27T19:59:21+00:00"
+ },
+ {
+ "name": "openzipkin/zipkin",
+ "version": "3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/openzipkin/zipkin-php.git",
+ "reference": "e2809f8b6775796d2116b3ca73576a1734296ff6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/openzipkin/zipkin-php/zipball/e2809f8b6775796d2116b3ca73576a1734296ff6",
+ "reference": "e2809f8b6775796d2116b3ca73576a1734296ff6",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "php": "^7.4 || ^8.0",
+ "psr/http-message": "~1.0 || ~2.0",
+ "psr/log": "^1.0 || ^2.0 || ^3.0"
+ },
+ "require-dev": {
+ "ext-mysqli": "*",
+ "jcchavezs/httptest": "~0.2",
+ "middlewares/fast-route": "^2.0",
+ "middlewares/request-handler": "^2.0",
+ "nyholm/psr7": "^1.4",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpstan/phpstan": "^0.12.26",
+ "phpunit/phpunit": "~9",
+ "psr/http-client": "^1.0",
+ "psr/http-server-middleware": "^1.0",
+ "squizlabs/php_codesniffer": "3.*"
+ },
+ "suggest": {
+ "ext-mysqli": "Allows to use mysqli instrumentation.",
+ "psr/http-client": "Allows to instrument HTTP clients following PSR18.",
+ "psr/http-server-middleware": "Allows to instrument HTTP servers via middlewares following PSR15."
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "./src/Zipkin/Propagation/Id.php",
+ "./src/Zipkin/Timestamp.php",
+ "./src/Zipkin/Kind.php",
+ "./src/Zipkin/Tags.php",
+ "./src/Zipkin/Annotations.php",
+ "./src/Zipkin/SpanName.php"
+ ],
+ "psr-4": {
+ "Zipkin\\": "./src/Zipkin/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "José Carlos Chávez",
+ "email": "jcchavezs@gmail.com"
+ }
+ ],
+ "description": "A Zipkin instrumentation for PHP",
+ "homepage": "https://github.com/openzipkin/zipkin-php",
+ "keywords": [
+ "distributed-tracing",
+ "openzipkin",
+ "tracing",
+ "zipkin"
+ ],
+ "support": {
+ "issues": "https://github.com/openzipkin/zipkin-php/issues",
+ "source": "https://github.com/openzipkin/zipkin-php/tree/3.2.0"
+ },
+ "time": "2023-09-28T20:54:04+00:00"
+ },
+ {
+ "name": "packaged/thrift",
+ "version": "0.13.01",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/packaged/thrift.git",
+ "reference": "e3dbcfb79e319971d64264ffe9c340590cc8a228"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/packaged/thrift/zipball/e3dbcfb79e319971d64264ffe9c340590cc8a228",
+ "reference": "e3dbcfb79e319971d64264ffe9c340590cc8a228",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5 || ^7.0 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Thrift\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "Apache Thrift",
+ "homepage": "http://thrift.apache.org/",
+ "keywords": [
+ "apache",
+ "thrift"
+ ],
+ "support": {
+ "issues": "https://github.com/packaged/thrift/issues",
+ "source": "https://github.com/packaged/thrift/tree/0.13.01"
+ },
+ "time": "2021-01-25T13:32:28+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.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/schmittjoh/php-option.git",
+ "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820",
+ "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2"
+ },
+ "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.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-11-12T21:59:55+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
+ },
+ "time": "2021-02-03T23:26:27+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/http-client",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "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"
+ },
+ "time": "2023-09-23T14:17:50+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": "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": "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.4.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.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-23T14:45:45+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v6.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "11d736e97f116ac375a81f96e662911a34cd50ce"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce",
+ "reference": "11d736e97f116ac375a81f96e662911a34cd50ce",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v6.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-10-31T17:30:12+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+ "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-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.28.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-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "42292d99c55abe617799667f454222c54c60e229"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
+ "reference": "42292d99c55abe617799667f454222c54c60e229",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-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.28.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-07-28T09:04:16+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+ "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-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.28.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-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "vlucas/phpdotenv",
+ "version": "v5.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/vlucas/phpdotenv.git",
+ "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4",
+ "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4",
+ "shasum": ""
+ },
+ "require": {
+ "ext-pcre": "*",
+ "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.8.2",
+ "ext-filter": "*",
+ "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2"
+ },
+ "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.6-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.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-11-12T22:43:29+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "composer/pcre",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/pcre.git",
+ "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9",
+ "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9",
+ "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.1"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-10-11T07:11:09+00:00"
+ },
+ {
+ "name": "composer/semver",
+ "version": "3.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32",
+ "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32",
+ "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": "ircs://irc.libera.chat:6697/composer",
+ "issues": "https://github.com/composer/semver/issues",
+ "source": "https://github.com/composer/semver/tree/3.4.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": "2023-08-31T09:50:34+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": "friendsofphp/php-cs-fixer",
+ "version": "v3.40.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
+ "reference": "4344562a516b76afe8f2d64b2e52214c30d64ed8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/4344562a516b76afe8f2d64b2e52214c30d64ed8",
+ "reference": "4344562a516b76afe8f2d64b2e52214c30d64ed8",
+ "shasum": ""
+ },
+ "require": {
+ "composer/semver": "^3.4",
+ "composer/xdebug-handler": "^3.0.3",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": "^7.4 || ^8.0",
+ "sebastian/diff": "^4.0 || ^5.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.1",
+ "mikey179/vfsstream": "^1.6.11",
+ "php-coveralls/php-coveralls": "^2.7",
+ "php-cs-fixer/accessible-object": "^1.1",
+ "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4",
+ "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4",
+ "phpspec/prophecy": "^1.17",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpunit/phpunit": "^9.6",
+ "symfony/phpunit-bridge": "^6.3.8 || ^7.0",
+ "symfony/yaml": "^5.4 || ^6.0 || ^7.0"
+ },
+ "suggest": {
+ "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.40.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/keradus",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-03T09:21:33+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/config",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/config.git",
+ "reference": "f619a0e6118704707932de56fa8e86ffeec042f1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/config/zipball/f619a0e6118704707932de56fa8e86ffeec042f1",
+ "reference": "f619a0e6118704707932de56fa8e86ffeec042f1",
+ "shasum": ""
+ },
+ "require": {
+ "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"
+ },
+ "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",
+ "vlucas/phpdotenv": "Allows using enviroment value to override the config"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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"
+ },
+ "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/dispatcher",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/dispatcher.git",
+ "reference": "582dc948da50db771294130bba465d8163f11ab1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/dispatcher/zipball/582dc948da50db771294130bba465d8163f11ab1",
+ "reference": "582dc948da50db771294130bba465d8163f11ab1",
+ "shasum": ""
+ },
+ "require": {
+ "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"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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"
+ },
+ "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.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/event.git",
+ "reference": "6eada5f74ce80786c567d5aed0361d51175217bb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/event/zipball/6eada5f74ce80786c567d5aed0361d51175217bb",
+ "reference": "6eada5f74ce80786c567d5aed0361d51175217bb",
+ "shasum": ""
+ },
+ "require": {
+ "hyperf/contract": "~3.1.0",
+ "hyperf/stdlib": "~3.1.0",
+ "php": ">=8.1",
+ "psr/event-dispatcher": "^1.0"
+ },
+ "suggest": {
+ "hyperf/di": "Required to use annotatioins."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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"
+ },
+ "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.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/exception-handler.git",
+ "reference": "941a7b426d7ecc6f34fa56d19749e8ab57a737f8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/exception-handler/zipball/941a7b426d7ecc6f34fa56d19749e8ab57a737f8",
+ "reference": "941a7b426d7ecc6f34fa56d19749e8ab57a737f8",
+ "shasum": ""
+ },
+ "require": {
+ "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",
+ "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.1-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"
+ },
+ "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.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/http-message.git",
+ "reference": "1aa6b862003262d1186f5978f251970f687c16d5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/http-message/zipball/1aa6b862003262d1186f5978f251970f687c16d5",
+ "reference": "1aa6b862003262d1186f5978f251970f687c16d5",
+ "shasum": ""
+ },
+ "require": {
+ "hyperf/codec": "~3.1.0",
+ "hyperf/engine": "^2.7",
+ "hyperf/support": "~3.1.0",
+ "laminas/laminas-mime": "^2.7",
+ "php": ">=8.1",
+ "psr/http-message": "^1.0|^2.0",
+ "swow/psr7-plus": "^1.0"
+ },
+ "suggest": {
+ "psr/container": "Required to replace RequestParserInterface."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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.1.0"
+ },
+ "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.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/http-server.git",
+ "reference": "022da795a5b2712380b657b2c736d85f70b33395"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/http-server/zipball/022da795a5b2712380b657b2c736d85f70b33395",
+ "reference": "022da795a5b2712380b657b2c736d85f70b33395",
+ "shasum": ""
+ },
+ "require": {
+ "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.1",
+ "psr/container": "^1.0|^2.0",
+ "swow/psr7-plus": "^1.0"
+ },
+ "suggest": {
+ "hyperf/di": "Required to use annotations."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-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"
+ },
+ "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.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/server.git",
+ "reference": "2c667e0977945d26a56bec53b1c946286cffc3a2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/server/zipball/2c667e0977945d26a56bec53b1c946286cffc3a2",
+ "reference": "2c667e0977945d26a56bec53b1c946286cffc3a2",
+ "shasum": ""
+ },
+ "require": {
+ "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"
+ },
+ "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.1-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"
+ },
+ "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.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hyperf/testing.git",
+ "reference": "a0b4f5472953ccadb4b54a39dfd6695dff5d3dcd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hyperf/testing/zipball/a0b4f5472953ccadb4b54a39dfd6695dff5d3dcd",
+ "reference": "a0b4f5472953ccadb4b54a39dfd6695dff5d3dcd",
+ "shasum": ""
+ },
+ "require": {
+ "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.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hyperf\\Testing\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Testing for hyperf",
+ "keywords": [
+ "dev",
+ "php",
+ "swoole",
+ "testing"
+ ],
+ "support": {
+ "source": "https://github.com/hyperf/testing/tree/v3.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://hyperf.wiki/#/zh-cn/donate",
+ "type": "custom"
+ },
+ {
+ "url": "https://opencollective.com/hyperf",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2023-11-29T03:44:48+00:00"
+ },
+ {
+ "name": "laminas/laminas-mime",
+ "version": "2.12.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laminas/laminas-mime.git",
+ "reference": "08cc544778829b7d68d27a097885bd6e7130135e"
+ },
+ "dist": {
+ "type": "zip",
+ "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 || ~8.3.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": "2023-11-02T16:47:19+00:00"
+ },
+ {
+ "name": "laminas/laminas-stdlib",
+ "version": "3.18.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laminas/laminas-stdlib.git",
+ "reference": "e85b29076c6216e7fc98e72b42dbe1bbc3b95ecf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/e85b29076c6216e7fc98e72b42dbe1bbc3b95ecf",
+ "reference": "e85b29076c6216e7fc98e72b42dbe1bbc3b95ecf",
+ "shasum": ""
+ },
+ "require": {
+ "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.14",
+ "phpunit/phpunit": "^10.3.3",
+ "psalm/plugin-phpunit": "^0.18.4",
+ "vimeo/psalm": "^5.15.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Laminas\\Stdlib\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "SPL extensions, array utilities, error handlers, and more",
+ "homepage": "https://laminas.dev",
+ "keywords": [
+ "laminas",
+ "stdlib"
+ ],
+ "support": {
+ "chat": "https://laminas.dev/chat",
+ "docs": "https://docs.laminas.dev/laminas-stdlib/",
+ "forum": "https://discourse.laminas.dev",
+ "issues": "https://github.com/laminas/laminas-stdlib/issues",
+ "rss": "https://github.com/laminas/laminas-stdlib/releases.atom",
+ "source": "https://github.com/laminas/laminas-stdlib"
+ },
+ "funding": [
+ {
+ "url": "https://funding.communitybridge.org/projects/laminas-project",
+ "type": "community_bridge"
+ }
+ ],
+ "time": "2023-09-19T10:15:21+00:00"
+ },
+ {
+ "name": "mockery/mockery",
+ "version": "1.6.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mockery/mockery.git",
+ "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mockery/mockery/zipball/b8e0bb7d8c604046539c1115994632c74dcb361e",
+ "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e",
+ "shasum": ""
+ },
+ "require": {
+ "hamcrest/hamcrest-php": "^2.0.1",
+ "lib-pcre": ">=7.0",
+ "php": ">=7.3"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5 || ^9.6.10",
+ "psalm/plugin-phpunit": "^0.18.4",
+ "symplify/easy-coding-standard": "^11.5.0",
+ "vimeo/psalm": "^4.30"
+ },
+ "type": "library",
+ "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": "https://github.com/padraic",
+ "role": "Author"
+ },
+ {
+ "name": "Dave Marshall",
+ "email": "dave.marshall@atstsolutions.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",
+ "homepage": "https://github.com/mockery/mockery",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "library",
+ "mock",
+ "mock objects",
+ "mockery",
+ "stub",
+ "test",
+ "test double",
+ "testing"
+ ],
+ "support": {
+ "docs": "https://docs.mockery.io/",
+ "issues": "https://github.com/mockery/mockery/issues",
+ "rss": "https://github.com/mockery/mockery/releases.atom",
+ "security": "https://github.com/mockery/mockery/security/advisories",
+ "source": "https://github.com/mockery/mockery"
+ },
+ "time": "2023-08-09T00:03: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": "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": "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": "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.47",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan.git",
+ "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/84dbb33b520ea28b6cf5676a3941f4bae1c1ff39",
+ "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39",
+ "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-12-01T15:19:17+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": "10.1.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/a56a9ab2f680246adcf3db43f38ddf1765774735",
+ "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.15",
+ "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": "^10.1"
+ },
+ "suggest": {
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "10.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": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.9"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-11-23T12:23:20+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c",
+ "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-08-31T06:24:48+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+ "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^10.0"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "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/4.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:56:09+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748",
+ "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "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": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "security": "https://github.com/sebastianbergmann/php-text-template/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-08-31T14:07:24+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "6.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d",
+ "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "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/6.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:57:52+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "10.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "5aedff46afba98dddecaa12349ec044d9103d4fe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5aedff46afba98dddecaa12349ec044d9103d4fe",
+ "reference": "5aedff46afba98dddecaa12349ec044d9103d4fe",
+ "shasum": ""
+ },
+ "require": {
+ "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": ">=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"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "10.5-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.2"
+ },
+ "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-12-05T14:54:33+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-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": "rector/rector",
+ "version": "0.17.13",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/rectorphp/rector.git",
+ "reference": "e2003ba7c5bda06d7bb419cf4be8dae5f8672132"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/rectorphp/rector/zipball/e2003ba7c5bda06d7bb419cf4be8dae5f8672132",
+ "reference": "e2003ba7c5bda06d7bb419cf4be8dae5f8672132",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0",
+ "phpstan/phpstan": "^1.10.26"
+ },
+ "conflict": {
+ "rector/rector-doctrine": "*",
+ "rector/rector-downgrade-php": "*",
+ "rector/rector-phpunit": "*",
+ "rector/rector-symfony": "*"
+ },
+ "bin": [
+ "bin/rector"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Instant Upgrade and Automated Refactoring of any PHP code",
+ "keywords": [
+ "automation",
+ "dev",
+ "migration",
+ "refactoring"
+ ],
+ "support": {
+ "issues": "https://github.com/rectorphp/rector/issues",
+ "source": "https://github.com/rectorphp/rector/tree/0.17.13"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/tomasvotruba",
+ "type": "github"
+ }
+ ],
+ "time": "2023-08-14T16:33:29+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae",
+ "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "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 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/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:58:15+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "a81fee9eef0b7a76af11d121767abc44c104e503"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503",
+ "reference": "a81fee9eef0b7a76af11d121767abc44c104e503",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "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": "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/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:58:43+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+ "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "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": "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/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:59:15+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "5.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "2db5010a484d53ebf536087a70b4a5423c102372"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372",
+ "reference": "2db5010a484d53ebf536087a70b4a5423c102372",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-mbstring": "*",
+ "php": ">=8.1",
+ "sebastian/diff": "^5.0",
+ "sebastian/exporter": "^5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "security": "https://github.com/sebastianbergmann/comparator/security/policy",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-08-14T13:18:12+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "68cfb347a44871f01e33ab0ef8215966432f6957"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957",
+ "reference": "68cfb347a44871f01e33ab0ef8215966432f6957",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.10",
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "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": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "security": "https://github.com/sebastianbergmann/complexity/security/policy",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-09-28T11:50:59+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "5.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b",
+ "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "security": "https://github.com/sebastianbergmann/diff/security/policy",
+ "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-05-01T07:48:21+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "6.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951",
+ "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "https://github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "security": "https://github.com/sebastianbergmann/environment/security/policy",
+ "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-04-11T05:39:26+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "5.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc",
+ "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=8.1",
+ "sebastian/recursion-context": "^5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "security": "https://github.com/sebastianbergmann/exporter/security/policy",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-09-24T13:22:09+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "6.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4",
+ "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "sebastian/object-reflector": "^3.0",
+ "sebastian/recursion-context": "^5.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "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",
+ "security": "https://github.com/sebastianbergmann/global-state/security/policy",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-07-19T07:19:23+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d",
+ "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.10",
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "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 counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-08-31T09:25:50+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906",
+ "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "sebastian/object-reflector": "^3.0",
+ "sebastian/recursion-context": "^5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "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/5.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:08:32+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "24ed13d98130f0e7122df55d06c5c4942a577957"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957",
+ "reference": "24ed13d98130f0e7122df55d06c5c4942a577957",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "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": "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/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:06:18+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "05909fb5bc7df4c52992396d0116aed689f93712"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712",
+ "reference": "05909fb5bc7df4c52992396d0116aed689f93712",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "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/5.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:05:40+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "462699a16464c3944eefc02ebdd77882bd3925bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf",
+ "reference": "462699a16464c3944eefc02ebdd77882bd3925bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "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/4.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:10:45+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17",
+ "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library 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/4.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-07T11:34:05+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-06-15T09:18:11+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v6.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/a550a7c99daeedef3f9d23fb82e3531525ff11fd",
+ "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd",
+ "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|^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"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/lock": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v6.4.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-11-30T10:54:28+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v7.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "c459b40ffe67c49af6fd392aac374c9edf8a027e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/c459b40ffe67c49af6fd392aac374c9edf8a027e",
+ "reference": "c459b40ffe67c49af6fd392aac374c9edf8a027e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/event-dispatcher-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<6.4",
+ "symfony/service-contracts": "<2.5"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/stopwatch": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-07-27T16:29:09+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v3.4.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.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-23T14:45:45+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v7.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "7da8ea2362a283771478c5f7729cfcb43a76b8b7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/7da8ea2362a283771478c5f7729cfcb43a76b8b7",
+ "reference": "7da8ea2362a283771478c5f7729cfcb43a76b8b7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides basic utilities for the filesystem",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v7.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-07-27T06:33:22+00:00"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v6.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-foundation.git",
+ "reference": "44a6d39a9cc11e154547d882d5aac1e014440771"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/44a6d39a9cc11e154547d882d5aac1e014440771",
+ "reference": "44a6d39a9cc11e154547d882d5aac1e014440771",
+ "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.3"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^2.13.1|^3|^4",
+ "predis/predis": "^1.1|^2.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": {
+ "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.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-11-20T16:41:16+00:00"
+ },
+ {
+ "name": "symfony/options-resolver",
+ "version": "v7.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/options-resolver.git",
+ "reference": "700ff4096e346f54cb628ea650767c8130f1001f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/700ff4096e346f54cb628ea650767c8130f1001f",
+ "reference": "700ff4096e346f54cb628ea650767c8130f1001f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "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/v7.0.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-08-08T10:20:21+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "875e90aeea2777b6f135677f618529449334a612"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612",
+ "reference": "875e90aeea2777b6f135677f618529449334a612",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-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.28.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-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+ "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-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.28.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-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php81",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php81.git",
+ "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b",
+ "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-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.28.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-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php83",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php83.git",
+ "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11",
+ "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "symfony/polyfill-php80": "^1.14"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php83\\": ""
+ },
+ "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.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.28.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-08-16T06:22:46+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v7.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "13bdb1670c7f510494e04fcb2bfa29af63db9c0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/13bdb1670c7f510494e04fcb2bfa29af63db9c0d",
+ "reference": "13bdb1670c7f510494e04fcb2bfa29af63db9c0d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v7.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-11-20T16:43:42+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838",
+ "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838",
+ "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.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-07-30T20:28:31+00:00"
+ },
+ {
+ "name": "symfony/stopwatch",
+ "version": "v7.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/stopwatch.git",
+ "reference": "7bbfa3dd564a0ce12eb4acaaa46823c740f9cb7a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/7bbfa3dd564a0ce12eb4acaaa46823c740f9cb7a",
+ "reference": "7bbfa3dd564a0ce12eb4acaaa46823c740f9cb7a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "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/v7.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-07-05T13:06:06+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v7.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "92bd2bfbba476d4a1838e5e12168bef2fd1e6620"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/92bd2bfbba476d4a1838e5e12168bef2fd1e6620",
+ "reference": "92bd2bfbba476d4a1838e5e12168bef2fd1e6620",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/http-client": "^6.4|^7.0",
+ "symfony/intl": "^6.4|^7.0",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v7.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-11-29T08:40:23+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96",
+ "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96",
+ "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.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2023-11-20T00:12:19+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=8.0"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.6.0"
+}
diff --git a/phpstan.neon b/phpstan.neon
new file mode 100644
index 0000000..f25d7d9
--- /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 0000000..bb72997
--- /dev/null
+++ b/phpunit.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ src
+
+
+
+
+ tests
+
+
+
diff --git a/publish/opentracing.php b/publish/opentracing.php
index 9839059..67589be 100644
--- a/publish/opentracing.php
+++ b/publish/opentracing.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\Tracer\Adapter\JaegerTracerFactory;
use Hyperf\Tracer\Adapter\NoOpTracerFactory;
diff --git a/rector.php b/rector.php
new file mode 100644
index 0000000..6d8c034
--- /dev/null
+++ b/rector.php
@@ -0,0 +1,31 @@
+paths([
+ __DIR__ . '/class_map',
+ __DIR__ . '/publish',
+ __DIR__ . '/src',
+ __DIR__ . '/tests',
+ ]);
+
+ // register a single rule
+ $rectorConfig->rule(InlineConstructorDefaultToPropertyRector::class);
+
+ // define sets of rules
+ $rectorConfig->sets([
+ LevelSetList::UP_TO_PHP_80,
+ ]);
+};
diff --git a/src/Adapter/HttpClientFactory.php b/src/Adapter/HttpClientFactory.php
index 30d92b5..fcb1716 100644
--- a/src/Adapter/HttpClientFactory.php
+++ b/src/Adapter/HttpClientFactory.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\Tracer\Adapter;
diff --git a/src/Adapter/JaegerTracerFactory.php b/src/Adapter/JaegerTracerFactory.php
index 3383413..e3a063a 100644
--- a/src/Adapter/JaegerTracerFactory.php
+++ b/src/Adapter/JaegerTracerFactory.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\Tracer\Adapter;
@@ -27,9 +27,7 @@ class JaegerTracerFactory implements NamedFactoryInterface
private string $name = '';
- public function __construct(private ConfigInterface $config, private ?LoggerInterface $logger = null, private ?CacheItemPoolInterface $cache = null)
- {
- }
+ public function __construct(private ConfigInterface $config, private LoggerInterface $logger, private ?CacheItemPoolInterface $cache = null) {}
public function make(string $name): Tracer
{
diff --git a/src/Adapter/NoopTracerFactory.php b/src/Adapter/NoopTracerFactory.php
new file mode 100644
index 0000000..d97829d
--- /dev/null
+++ b/src/Adapter/NoopTracerFactory.php
@@ -0,0 +1,25 @@
+switchManager->isEnable('db') === false) {
+ if ($this->switchManager->isEnabled('db') === false) {
return $proceedingJoinPoint->process();
}
$arguments = $proceedingJoinPoint->arguments['keys'];
$span = $this->startSpan('Db::' . $arguments['name']);
- $span->setTag($this->spanTagManager->get('db', 'db.query'), json_encode($arguments['arguments']));
+ $span->setTag($this->spanTagManager->get('db', 'db.query'), json_encode($arguments['arguments'], JSON_THROW_ON_ERROR));
try {
$result = $proceedingJoinPoint->process();
} catch (Throwable $e) {
diff --git a/src/Aspect/ElasticserachAspect.php b/src/Aspect/ElasticserachAspect.php
index 419cc55..587fc89 100644
--- a/src/Aspect/ElasticserachAspect.php
+++ b/src/Aspect/ElasticserachAspect.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\Tracer\Aspect;
diff --git a/src/Aspect/HttpClientAspect.php b/src/Aspect/HttpClientAspect.php
index dfc5370..9e1ab08 100644
--- a/src/Aspect/HttpClientAspect.php
+++ b/src/Aspect/HttpClientAspect.php
@@ -2,23 +2,32 @@
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\Tracer\Aspect;
use GuzzleHttp\Client;
+use GuzzleHttp\Exception\RequestException;
+use GuzzleHttp\Promise\Create;
+use GuzzleHttp\Promise\PromiseInterface;
+use GuzzleHttp\Psr7\Uri;
use Hyperf\Di\Aop\AbstractAspect;
use Hyperf\Di\Aop\ProceedingJoinPoint;
+use Hyperf\Di\Exception\Exception;
+use Hyperf\Tracer\ExceptionAppender;
use Hyperf\Tracer\SpanStarter;
use Hyperf\Tracer\SpanTagManager;
+use Hyperf\Tracer\Support\Uri as SupportUri;
use Hyperf\Tracer\SwitchManager;
use Hyperf\Tracer\TracerContext;
+use OpenTracing\Span;
+use OpenTracing\Tracer;
use Psr\Http\Message\ResponseInterface;
use Throwable;
@@ -27,6 +36,7 @@
class HttpClientAspect extends AbstractAspect
{
use SpanStarter;
+ use ExceptionAppender;
public array $classes = [
Client::class . '::request',
@@ -42,26 +52,40 @@ public function __construct(private SwitchManager $switchManager, private SpanTa
*/
public function process(ProceedingJoinPoint $proceedingJoinPoint)
{
- if ($this->switchManager->isEnable('guzzle') === false) {
+ if ($this->switchManager->isEnabled('guzzle') === false) {
return $proceedingJoinPoint->process();
}
$options = $proceedingJoinPoint->arguments['keys']['options'];
if (isset($options['no_aspect']) && $options['no_aspect'] === true) {
return $proceedingJoinPoint->process();
}
- // Disable the aspect for the requestAsync method.
- if ($proceedingJoinPoint->methodName == 'request') {
- $options['no_aspect'] = true;
- }
+ /** @var Client $instance */
+ $instance = $proceedingJoinPoint->getInstance();
+ /** @var Uri $base_uri */
+ $base_uri = $instance->getConfig('base_uri');
$arguments = $proceedingJoinPoint->arguments;
- $method = $arguments['keys']['method'] ?? 'Null';
- $uri = $arguments['keys']['uri'] ?? 'Null';
- $key = "HTTP Request [{$method}] {$uri}";
- $span = $this->startSpan($key);
+ $method = strtoupper($arguments['keys']['method'] ?? '');
+ $uri = $arguments['keys']['uri'] ?? '';
+ $host = $base_uri === null ? (parse_url($uri, PHP_URL_HOST) ?? '') : $base_uri->getHost();
+ $span = $this->startSpan(
+ sprintf(
+ '%s %s/%s',
+ $method,
+ rtrim((string) ($base_uri ?? ''), '/'),
+ ltrim(parse_url(SupportUri::sanitize($uri), PHP_URL_PATH) ?? '', '/')
+ )
+ );
+
+ $span->setTag('category', 'http');
+ $span->setTag('component', 'GuzzleHttp');
+ $span->setTag('kind', 'client');
$span->setTag('source', $proceedingJoinPoint->className . '::' . $proceedingJoinPoint->methodName);
if ($this->spanTagManager->has('http_client', 'http.url')) {
$span->setTag($this->spanTagManager->get('http_client', 'http.url'), $uri);
}
+ if ($this->spanTagManager->has('http_client', 'http.host')) {
+ $span->setTag($this->spanTagManager->get('http_client', 'http.host'), $host);
+ }
if ($this->spanTagManager->has('http_client', 'http.method')) {
$span->setTag($this->spanTagManager->get('http_client', 'http.method'), $method);
}
@@ -75,20 +99,57 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint)
$options['headers'] = array_replace($options['headers'] ?? [], $appendHeaders);
$proceedingJoinPoint->arguments['keys']['options'] = $options;
- try {
- $result = $proceedingJoinPoint->process();
- if ($result instanceof ResponseInterface) {
- $span->setTag($this->spanTagManager->get('http_client', 'http.status_code'), (string) $result->getStatusCode());
- }
- } catch (Throwable $e) {
- if ($this->switchManager->isEnable('exception') && ! $this->switchManager->isIgnoreException($e)) {
- $span->setTag('error', true);
- $span->log(['message', $e->getMessage(), 'code' => $e->getCode(), 'stacktrace' => $e->getTraceAsString()]);
- }
- throw $e;
- } finally {
- $span->finish();
- }
+ $this->appendCustomSpan($span, $options);
+
+ /** @var PromiseInterface $result */
+ $result = $proceedingJoinPoint->process();
+ $result->then(
+ $this->onFullFilled($span, $options),
+ $this->onRejected($span, $options)
+ );
+ $span->finish();
+
return $result;
}
+
+ protected function appendCustomSpan(Span $span, array $options): void
+ {
+ // just for override
+ }
+
+ protected function appendCustomResponseSpan(Span $span, array $options, ?ResponseInterface $response): void
+ {
+ // just for override
+ }
+
+ private function onFullFilled(Span $span, array $options): callable
+ {
+ return function (ResponseInterface $response) use ($span, $options) {
+ $span->setTag(
+ $this->spanTagManager->get('http_client', 'http.status_code'),
+ $response->getStatusCode()
+ );
+ $span->setTag('otel.status_code', 'OK');
+
+ $this->appendCustomResponseSpan($span, $options, $response);
+ };
+ }
+
+ private function onRejected(Span $span, array $options): callable
+ {
+ return function (RequestException $exception) use ($span, $options) {
+ if ($this->switchManager->isEnabled('exception')) {
+ $this->appendExceptionToSpan($span, $exception);
+ }
+
+ $span->setTag(
+ $this->spanTagManager->get('http_client', 'http.status_code'),
+ $exception->getResponse()->getStatusCode()
+ );
+
+ $this->appendCustomResponseSpan($span, $options, $exception->getResponse());
+
+ return Create::rejectionFor($exception);
+ };
+ }
}
diff --git a/src/Aspect/JsonRpcAspect.php b/src/Aspect/JsonRpcAspect.php
index a65a5c6..9412225 100644
--- a/src/Aspect/JsonRpcAspect.php
+++ b/src/Aspect/JsonRpcAspect.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\Tracer\Aspect;
diff --git a/src/Aspect/MethodAspect.php b/src/Aspect/MethodAspect.php
index 099c6b9..789bb2e 100644
--- a/src/Aspect/MethodAspect.php
+++ b/src/Aspect/MethodAspect.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\Tracer\Aspect;
@@ -35,7 +35,7 @@ public function __construct(private SwitchManager $switchManager)
*/
public function process(ProceedingJoinPoint $proceedingJoinPoint)
{
- if ($this->switchManager->isEnable('method') === false) {
+ if ($this->switchManager->isEnabled('method') === false) {
return $proceedingJoinPoint->process();
}
diff --git a/src/Aspect/MongoCollectionAspect.php b/src/Aspect/MongoCollectionAspect.php
new file mode 100644
index 0000000..20013a5
--- /dev/null
+++ b/src/Aspect/MongoCollectionAspect.php
@@ -0,0 +1,121 @@
+tracer = $tracer;
+ $this->spanTagManager = $spanTagManager;
+ }
+
+ public function process(ProceedingJoinPoint $proceedingJoinPoint)
+ {
+ if ($this->switchManager->isEnabled('mongo') === false) {
+ return $proceedingJoinPoint->process();
+ }
+
+ if (in_array($proceedingJoinPoint->methodName, $this->ignoredMethods)) {
+ return $proceedingJoinPoint->process();
+ }
+
+ $collectionName = $this->getCollectionName($proceedingJoinPoint);
+ $method = $proceedingJoinPoint->methodName;
+ $span = $this->startSpan(
+ sprintf(
+ 'Mongo::%s on %s',
+ $method,
+ $collectionName
+ )
+ );
+
+ $span->setTag('category', 'datastore');
+ $span->setTag('kind', 'client');
+ $span->setTag('component', 'MongoDB');
+ $span->setTag('db.system', 'mongodb');
+ $span->setTag('source', $proceedingJoinPoint->className . '::' . $proceedingJoinPoint->methodName);
+
+ if ($this->spanTagManager->has('mongo', 'collection')) {
+ $span->setTag($this->spanTagManager->get('mongo', 'collection'), $collectionName);
+ }
+
+ if ($this->spanTagManager->has('mongo', 'method')) {
+ $span->setTag($this->spanTagManager->get('mongo', 'method'), $method);
+ }
+
+ $appendHeaders = [];
+ $this->tracer->inject(
+ $span->getContext(),
+ TEXT_MAP,
+ $appendHeaders
+ );
+
+ try {
+ $result = $proceedingJoinPoint->process();
+ $span->setTag('otel.status_code', 'OK');
+ } catch (Throwable $exception) {
+ if ($this->switchManager->isEnabled('exception')) {
+ $this->appendExceptionToSpan($span, $exception);
+ }
+ throw $exception;
+ } finally {
+ $span->finish();
+ }
+
+ return $result;
+ }
+
+ private function getCollectionName(ProceedingJoinPoint $proceedingJoinPoint): string
+ {
+ /** @var Collection $collection */
+ $collection = $proceedingJoinPoint->getInstance();
+
+ $property = new ReflectionProperty(Collection::class, 'collection');
+ $property->setAccessible(true);
+
+ return $property->getValue($collection);
+ }
+}
diff --git a/src/Aspect/RedisAspect.php b/src/Aspect/RedisAspect.php
index 641a07d..bd5306e 100644
--- a/src/Aspect/RedisAspect.php
+++ b/src/Aspect/RedisAspect.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\Tracer\Aspect;
@@ -37,16 +37,16 @@ public function __construct(private SwitchManager $switchManager, private SpanTa
*/
public function process(ProceedingJoinPoint $proceedingJoinPoint)
{
- if ($this->switchManager->isEnable('redis') === false) {
+ if ($this->switchManager->isEnabled('redis') === false) {
return $proceedingJoinPoint->process();
}
$arguments = $proceedingJoinPoint->arguments['keys'];
$span = $this->startSpan('Redis::' . $arguments['name']);
- $span->setTag($this->spanTagManager->get('redis', 'arguments'), json_encode($arguments['arguments']));
+ $span->setTag($this->spanTagManager->get('redis', 'arguments'), json_encode($arguments['arguments'], JSON_THROW_ON_ERROR));
try {
$result = $proceedingJoinPoint->process();
- $span->setTag($this->spanTagManager->get('redis', 'result'), json_encode($result));
+ $span->setTag($this->spanTagManager->get('redis', 'result'), json_encode($result, JSON_THROW_ON_ERROR));
} catch (Throwable $e) {
if ($this->switchManager->isEnable('exception') && ! $this->switchManager->isIgnoreException($e)) {
$span->setTag('error', true);
diff --git a/src/Aspect/TraceAnnotationAspect.php b/src/Aspect/TraceAnnotationAspect.php
index 3e14c45..410f9af 100644
--- a/src/Aspect/TraceAnnotationAspect.php
+++ b/src/Aspect/TraceAnnotationAspect.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\Tracer\Aspect;
diff --git a/src/ConfigProvider.php b/src/ConfigProvider.php
index e98107c..1de8562 100644
--- a/src/ConfigProvider.php
+++ b/src/ConfigProvider.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\Tracer;
@@ -18,14 +18,18 @@
use Hyperf\Tracer\Aspect\ElasticserachAspect;
use Hyperf\Tracer\Aspect\GrpcAspect;
use Hyperf\Tracer\Aspect\HttpClientAspect;
+use Hyperf\Tracer\Aspect\MongoCollectionAspect;
use Hyperf\Tracer\Aspect\RedisAspect;
use Hyperf\Tracer\Aspect\RpcAspect;
use Hyperf\Tracer\Aspect\TraceAnnotationAspect;
use Hyperf\Tracer\Listener\DbQueryExecutedListener;
+use Hyperf\Tracer\Middleware\TraceMiddleware;
+use Jaeger\SpanContext;
use Jaeger\ThriftUdpTransport;
use OpenTracing\GlobalTracer;
use OpenTracing\Tracer;
use Zipkin\Propagation\Map;
+use Jaeger\Codec\TextCodec;
class ConfigProvider
{
@@ -41,12 +45,17 @@ public function __invoke(): array
'listeners' => [
DbQueryExecutedListener::class,
],
+ 'middlewares' => [
+ TraceMiddleware::class,
+ ],
'annotations' => [
'scan' => [
'class_map' => [
GlobalTracer::class => __DIR__ . '/../class_map/GlobalTracer.php',
Map::class => __DIR__ . '/../class_map/Map.php',
ThriftUdpTransport::class => __DIR__ . '/../class_map/ThriftUdpTransport.php',
+ SpanContext::class => __DIR__ . '/../class_map/SpanContext.php',
+ TextCodec::class => __DIR__ . '/../class_map/TextCodec.php',
],
],
],
@@ -59,6 +68,7 @@ public function __invoke(): array
RedisAspect::class,
RpcAspect::class,
TraceAnnotationAspect::class,
+ MongoCollectionAspect::class,
],
'publish' => [
[
diff --git a/src/Contract/NamedFactoryInterface.php b/src/Contract/NamedFactoryInterface.php
index ec81b3e..9bd6222 100644
--- a/src/Contract/NamedFactoryInterface.php
+++ b/src/Contract/NamedFactoryInterface.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\Tracer\Contract;
diff --git a/src/Exception/InvalidArgumentException.php b/src/Exception/InvalidArgumentException.php
index abcb97c..af0d4fd 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\Tracer\Exception;
diff --git a/src/ExceptionAppender.php b/src/ExceptionAppender.php
new file mode 100644
index 0000000..b73fe37
--- /dev/null
+++ b/src/ExceptionAppender.php
@@ -0,0 +1,31 @@
+setTag('error', true);
+
+ $span->setTag('otel.status_code', 'ERROR');
+ $span->setTag('otel.status_description', $exception->getMessage());
+
+ $span->setTag($this->spanTagManager->get('exception', 'class'), $exception::class);
+ $span->setTag($this->spanTagManager->get('exception', 'code'), $exception->getCode());
+ $span->setTag($this->spanTagManager->get('exception', 'message'), $exception->getMessage());
+ $span->setTag($this->spanTagManager->get('exception', 'stack_trace'), (string) $exception);
+ }
+}
diff --git a/src/Listener/DbQueryExecutedListener.php b/src/Listener/DbQueryExecutedListener.php
index 23b35b7..cd0a453 100644
--- a/src/Listener/DbQueryExecutedListener.php
+++ b/src/Listener/DbQueryExecutedListener.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\Tracer\Listener;
@@ -40,7 +40,7 @@ public function listen(): array
*/
public function process(object $event): void
{
- if ($this->switchManager->isEnable('db') === false) {
+ if ($this->switchManager->isEnabled('db') === false) {
return;
}
$sql = $event->sql;
@@ -51,9 +51,17 @@ public function process(object $event): void
}
$endTime = microtime(true);
- $span = $this->startSpan($this->spanTagManager->get('db', 'db.query'), [
+ $span = $this->startSpan($sql, [
'start_time' => (int) (($endTime - $event->time / 1000) * 1000 * 1000),
]);
+
+ $span->setTag('category', 'datastore');
+ $span->setTag('component', 'MySQL');
+ $span->setTag('kind', 'client');
+ $span->setTag('otel.status_code', 'OK');
+ $span->setTag('db.system', 'mysql');
+ $span->setTag('db.name', $event->connectionName);
+
$span->setTag($this->spanTagManager->get('db', 'db.statement'), $sql);
$span->setTag($this->spanTagManager->get('db', 'db.query_time'), $event->time . ' ms');
$span->finish((int) ($endTime * 1000 * 1000));
diff --git a/src/Middleware/TraceMiddleware.php b/src/Middleware/TraceMiddleware.php
index 65828a6..7727cd8 100644
--- a/src/Middleware/TraceMiddleware.php
+++ b/src/Middleware/TraceMiddleware.php
@@ -2,37 +2,57 @@
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\Tracer\Middleware;
use Hyperf\Coroutine\Coroutine;
use Hyperf\HttpMessage\Exception\HttpException;
+use Hyperf\Tracer\ExceptionAppender;
use Hyperf\Tracer\SpanStarter;
use Hyperf\Tracer\SpanTagManager;
+use Hyperf\Tracer\Support\Uri;
use Hyperf\Tracer\SwitchManager;
use Hyperf\Tracer\TracerContext;
use OpenTracing\Span;
+use OpenTracing\Tracer;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Message\UriInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Throwable;
use function Hyperf\Coroutine\defer;
+use const OpenTracing\Tags\SPAN_KIND_RPC_SERVER;
+
class TraceMiddleware implements MiddlewareInterface
{
use SpanStarter;
+ use ExceptionAppender;
- public function __construct(private SwitchManager $switchManager, private SpanTagManager $spanTagManager)
- {
+ protected SpanTagManager $spanTagManager;
+
+ protected Tracer $tracer;
+
+ protected array $config;
+
+ protected string $sensitive_headers_regex = '/pass|auth|token|secret/i';
+
+ public function __construct(
+ protected SwitchManager $switchManager,
+ SpanTagManager $spanTagManager,
+ ConfigInterface $config,
+ ) {
+ $this->spanTagManager = $spanTagManager;
+ $this->config = $config->get('opentracing');
}
/**
@@ -40,34 +60,38 @@ public function __construct(private SwitchManager $switchManager, private SpanTa
* Processes an incoming server request in order to produce a response.
* If unable to produce the response itself, it may delegate to the provided
* request handler to do so.
+ * @throws Throwable
*/
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);
+ }
$tracer = TracerContext::getTracer();
$span = $this->buildSpan($request);
- defer(function () use ($tracer) {
+ defer(function () {
try {
- $tracer->flush();
- } catch (Throwable) {
+ $this->tracer->flush();
+ } catch (Throwable $exception) {
+ if (ApplicationContext::hasContainer() && ApplicationContext::getContainer()->has(StdoutLoggerInterface::class)) {
+ ApplicationContext::getContainer()
+ ->get(StdoutLoggerInterface::class)
+ ->error($exception->getMessage());
+ }
}
});
try {
$response = $handler->handle($request);
- if ($traceId = TracerContext::getTraceId()) {
- $response = $response->withHeader('Trace-Id', $traceId);
- }
- $span->setTag($this->spanTagManager->get('response', 'status_code'), (string) $response->getStatusCode());
- if ($this->spanTagManager->has('response', 'body')) {
- $span->setTag($this->spanTagManager->get('response', 'body'), (string) $response->getBody());
- }
+ $span->setTag($this->spanTagManager->get('response', 'status_code'), $response->getStatusCode());
+ $span->setTag('otel.status_code', 'OK');
+ $this->appendCustomResponseSpan($span, $request, $response);
} catch (Throwable $exception) {
- if ($this->switchManager->isEnable('exception') && ! $this->switchManager->isIgnoreException($exception)) {
- $this->appendExceptionToSpan($span, $exception);
- }
+ $this->switchManager->isEnabled('exception') && $this->appendExceptionToSpan($span, $exception);
if ($exception instanceof HttpException) {
$span->setTag($this->spanTagManager->get('response', 'status_code'), (string) $exception->getStatusCode());
}
+ $this->appendCustomExceptionSpan($span, $exception);
throw $exception;
} finally {
$span->finish();
@@ -76,29 +100,57 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
return $response;
}
- protected function appendExceptionToSpan(Span $span, Throwable $exception): void
+ protected function appendCustomExceptionSpan(Span $span, Throwable $exception): void
+ {
+ // just for override
+ }
+
+ protected function appendCustomSpan(Span $span, ServerRequestInterface $request): void
+ {
+ // just for override
+ }
+
+ protected function appendCustomResponseSpan(Span $span, ServerRequestInterface $request, ResponseInterface $response): void
{
- $span->setTag('error', true);
- $span->setTag($this->spanTagManager->get('exception', 'class'), get_class($exception));
- $span->setTag($this->spanTagManager->get('exception', 'code'), (string) $exception->getCode());
- $span->setTag($this->spanTagManager->get('exception', 'message'), $exception->getMessage());
- $span->setTag($this->spanTagManager->get('exception', 'stack_trace'), (string) $exception);
+ // just for override
}
protected function buildSpan(ServerRequestInterface $request): Span
{
- $uri = $request->getUri();
- $span = $this->startSpan(sprintf('request: %s %s', $request->getMethod(), $uri->getPath()));
+ $path = $this->getPath($request->getUri());
+ $spanName = sprintf('%s %s', $request->getMethod(), $path);
+
+ $span = $this->startSpan($spanName, [], SPAN_KIND_RPC_SERVER);
+
+ $span->setTag('kind', 'server');
+
$span->setTag($this->spanTagManager->get('coroutine', 'id'), (string) Coroutine::id());
- $span->setTag($this->spanTagManager->get('request', 'path'), (string) $uri->getPath());
+ $span->setTag($this->spanTagManager->get('request', 'path'), $path);
$span->setTag($this->spanTagManager->get('request', 'method'), $request->getMethod());
- $span->setTag($this->spanTagManager->get('request', 'uri'), (string) $uri);
- if ($this->spanTagManager->has('request', 'body')) {
- $span->setTag($this->spanTagManager->get('request', 'body'), (string) $request->getBody());
- }
+
foreach ($request->getHeaders() as $key => $value) {
+ if (preg_match($this->sensitive_headers_regex, $key)) {
+ continue;
+ }
+
$span->setTag($this->spanTagManager->get('request', 'header') . '.' . $key, implode(', ', $value));
}
+
+ foreach ($request->getAttributes() as $key => $value) {
+ if (! is_string($value) || empty($value)) {
+ continue;
+ }
+
+ $span->setTag("attribute.{$key}", $value);
+ }
+
+ $this->appendCustomSpan($span, $request);
+
return $span;
}
+
+ protected function getPath(UriInterface $uri): string
+ {
+ return Uri::sanitize($uri->getPath());
+ }
}
diff --git a/src/SpanStarter.php b/src/SpanStarter.php
index e6ccf8e..e8f74c6 100644
--- a/src/SpanStarter.php
+++ b/src/SpanStarter.php
@@ -2,18 +2,16 @@
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\Tracer;
-use Hyperf\Context\ApplicationContext;
-use Hyperf\Context\Context;
use Hyperf\Context\RequestContext;
use Hyperf\Rpc;
use OpenTracing\Span;
@@ -21,7 +19,7 @@
use const OpenTracing\Formats\TEXT_MAP;
use const OpenTracing\Tags\SPAN_KIND;
-use const OpenTracing\Tags\SPAN_KIND_RPC_SERVER;
+use const OpenTracing\Tags\SPAN_KIND_RPC_CLIENT;
trait SpanStarter
{
@@ -31,12 +29,11 @@ trait SpanStarter
protected function startSpan(
string $name,
array $option = [],
- string $kind = SPAN_KIND_RPC_SERVER
+ string $kind = SPAN_KIND_RPC_CLIENT
): Span {
$root = TracerContext::getRoot();
$tracer = TracerContext::getTracer();
if (! $root instanceof Span) {
- $container = ApplicationContext::getContainer();
$request = RequestContext::getOrNull();
if (! $request instanceof ServerRequestInterface) {
// If the request object is absent, we are probably in a commandLine context.
@@ -46,13 +43,8 @@ protected function startSpan(
TracerContext::setRoot($root);
return $root;
}
- $carrier = array_map(fn ($header) => $header[0], $request->getHeaders());
- if ($container->has(Rpc\Context::class) && $rpcContext = $container->get(Rpc\Context::class)) {
- $rpcCarrier = $rpcContext->get('tracer.carrier');
- if (! empty($rpcCarrier)) {
- $carrier = $rpcCarrier;
- }
- }
+ $carrier = array_map(static fn ($header) => $header[0], $request->getHeaders());
+
// Extracts the context from the HTTP headers.
$spanContext = $tracer->extract(TEXT_MAP, $carrier);
if ($spanContext) {
diff --git a/src/SpanTagManager.php b/src/SpanTagManager.php
index 8d523ce..be740e7 100644
--- a/src/SpanTagManager.php
+++ b/src/SpanTagManager.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\Tracer;
@@ -25,8 +25,8 @@ class SpanTagManager
'response.header' => 'grpc.response.header',
],
'redis' => [
- 'arguments' => 'redis.arguments',
- 'result' => 'redis.result',
+ 'arguments' => 'db.arguments',
+ 'result' => 'db.result',
],
'db' => [
'db.query' => 'db.query',
diff --git a/src/SpanTagManagerFactory.php b/src/SpanTagManagerFactory.php
index 94e722d..e863bf5 100644
--- a/src/SpanTagManagerFactory.php
+++ b/src/SpanTagManagerFactory.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\Tracer;
diff --git a/src/Support/GuzzleHeaderValidate.php b/src/Support/GuzzleHeaderValidate.php
new file mode 100644
index 0000000..a392d73
--- /dev/null
+++ b/src/Support/GuzzleHeaderValidate.php
@@ -0,0 +1,37 @@
+traceIdHeader] = $this->spanContextToString(
+ $spanContext->getTraceId(),
+ $spanContext->getSpanId(),
+ $spanContext->getFlags()
+ );
+
+ $baggage = $spanContext->getBaggage();
+ if (empty($baggage)) {
+ return;
+ }
+
+ $baggageHeader = [];
+
+ foreach ($baggage as $key => $value) {
+ $value = $key . '=' . $value;
+ if (!GuzzleHeaderValidate::isValidHeaderValue($value)) {
+ continue;
+ }
+ $baggageHeader[] = $value;
+ }
+ $carrier[$this->traceStateHeader] = implode(',', $baggageHeader);
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @param mixed $carrier
+ * @return SpanContext|null
+ *
+ * @throws Exception
+ * @see \Jaeger\Tracer::extract
+ *
+ */
+ public function extract($carrier)
+ {
+ $baggage = [];
+ $carrier = (array)$carrier;
+
+ if (!isset($carrier[$this->traceIdHeader])) {
+ return null;
+ }
+
+ [$version, $traceId, $spanId, $flags] = $this->spanContextFromString($carrier[$this->traceIdHeader]);
+ if (!empty($carrier[$this->traceStateHeader])) {
+ $traceStateHeaders = $carrier[$this->traceStateHeader];
+ $state = explode(',', $traceStateHeaders);
+ foreach ($state as $stateItem) {
+ $stateItem = trim($stateItem);
+ $stateItem = explode('=', $stateItem);
+ if (count($stateItem) !== 2) {
+ continue;
+ }
+ $stateKey = $stateItem[0];
+ $stateValue = $stateItem[1];
+ $baggage[$stateKey] = $stateValue;
+ }
+ }
+
+ if ($traceId === null && $baggage !== []) {
+ throw new Exception('baggage without trace ctx');
+ }
+
+ if ($traceId === null) {
+ return null;
+ }
+
+ return new SpanContext($traceId, $spanId, null, $flags, $baggage);
+ }
+
+ /**
+ * Store a span context to a string.
+ *
+ * @param string $traceId
+ * @param string $spanId
+ * @param string $flags
+ * @return string
+ */
+ private function spanContextToString($traceId, $spanId, $flags)
+ {
+ $flags = str_pad($flags, 2, "0", STR_PAD_LEFT);
+ return sprintf('%s-%s-%s-%s',
+ self::VERSION,
+ JaegerDecoder::traceIdDecoder($traceId),
+ JaegerDecoder::spanIdDecoder($spanId),
+ $flags
+ );
+ }
+
+ /**
+ * Create a span context from a string.
+ *
+ * @param string $value
+ * @return array
+ *
+ * @throws Exception
+ */
+ private function spanContextFromString($value): array
+ {
+ $parts = explode('-', $value);
+
+ if (count($parts) != 4) {
+ throw new Exception('Malformed tracer state string.');
+ }
+ /**
+ * TraceId em Otel ja Ă© um hexadecimal de 32 caracteres e precisa permanecer assim.
+ * Span id sofre conversões no caminho porém é reportado em hexa, por isso é necessária a conversão
+ */
+
+ return [
+ $parts[0],
+ $parts[1],//
+ CodecUtility::hexToInt64($parts[2]),//
+ $parts[3],
+ ];
+ }
+}
diff --git a/src/Support/Uri.php b/src/Support/Uri.php
new file mode 100644
index 0000000..f29ce45
--- /dev/null
+++ b/src/Support/Uri.php
@@ -0,0 +1,34 @@
+',
+ '/',
+ '/',
+ '/',
+ ],
+ $uri
+ );
+ }
+}
diff --git a/src/Support/Uuid.php b/src/Support/Uuid.php
new file mode 100644
index 0000000..60b505c
--- /dev/null
+++ b/src/Support/Uuid.php
@@ -0,0 +1,30 @@
+has(StdoutLoggerInterface::class)) {
+ ApplicationContext::getContainer()
+ ->get(StdoutLoggerInterface::class)
+ ->warning($exception->getMessage());
+ }
+ return null;
+ }
+
+ return self::getTracerRoot($parent_id);
+ }
}
diff --git a/src/TracerFactory.php b/src/TracerFactory.php
index d3cc77f..e9562c7 100644
--- a/src/TracerFactory.php
+++ b/src/TracerFactory.php
@@ -2,32 +2,37 @@
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\Tracer;
+use Exception;
use Hyperf\Contract\ConfigInterface;
-use Hyperf\Tracer\Adapter\ZipkinTracerFactory;
+use Hyperf\Tracer\Adapter\JaegerTracerFactory;
use Hyperf\Tracer\Contract\NamedFactoryInterface;
-use Hyperf\Tracer\Exception\InvalidArgumentException;
+use InvalidArgumentException;
+use OpenTracing\Tracer;
use Psr\Container\ContainerInterface;
class TracerFactory
{
- public function __invoke(ContainerInterface $container)
+ /**
+ * @throws Exception
+ */
+ public function __invoke(ContainerInterface $container): Tracer
{
$config = $container->get(ConfigInterface::class);
$name = $config->get('opentracing.default');
// v1.0 has no 'default' config. Fallback to v1.0 mode for backward compatibility.
if (empty($name)) {
- $factory = $container->get(ZipkinTracerFactory::class);
+ $factory = $container->get(JaegerTracerFactory::class);
return $factory->make('');
}
diff --git a/tests/GuzzleHeaderValidateTest.php b/tests/GuzzleHeaderValidateTest.php
new file mode 100644
index 0000000..5cc3cef
--- /dev/null
+++ b/tests/GuzzleHeaderValidateTest.php
@@ -0,0 +1,35 @@
+tracer = Mockery::mock(Tracer::class);
+ $this->switchManager = Mockery::spy(SwitchManager::class);
+ $this->spanTagManager = Mockery::spy(SpanTagManager::class);
+ $this->config = Mockery::mock(ConfigInterface::class);
+
+ $this->config
+ ->expects('get')
+ ->with('opentracing')
+ ->andReturn(['ignore_path' => '/^\/health$/']);
+
+ $this->traceMiddleware = new TraceMiddleware(
+ $this->tracer,
+ $this->switchManager,
+ $this->spanTagManager,
+ $this->config,
+ );
+
+ parent::setUp();
+ }
+
+ public function testProcessIgnorePathIgnores(): void
+ {
+ $uri = Mockery::mock(UriInterface::class);
+ $uri->expects('getPath')->andReturn('/health');
+
+ $request = Mockery::mock(ServerRequestInterface::class);
+ $request->expects('getUri')->andReturn($uri);
+
+ $handler = Mockery::mock(RequestHandlerInterface::class);
+ $handler->expects('handle')->with($request);
+
+ $this->tracer->expects('startSpan')->never();
+ $this->traceMiddleware->process($request, $handler);
+ }
+}
diff --git a/tests/TracerFactoryTest.php b/tests/TracerFactoryTest.php
index 636e930..221c4ca 100644
--- a/tests/TracerFactoryTest.php
+++ b/tests/TracerFactoryTest.php
@@ -2,114 +2,40 @@
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\Tracer;
+use Exception;
use Hyperf\Config\Config;
use Hyperf\Context\ApplicationContext;
use Hyperf\Contract\ConfigInterface;
use Hyperf\Di\Container;
use Hyperf\Tracer\Adapter\JaegerTracerFactory;
-use Hyperf\Tracer\Adapter\NoOpTracerFactory;
-use Hyperf\Tracer\Adapter\Reporter\HttpClientFactory;
-use Hyperf\Tracer\Adapter\Reporter\ReporterFactory;
-use Hyperf\Tracer\Adapter\ZipkinTracerFactory;
use Hyperf\Tracer\TracerFactory;
+use Jaeger\Tracer;
use Mockery;
-use OpenTracing\NoopTracer;
-use PHPUnit\Framework\Attributes\CoversNothing;
+use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;
use PHPUnit\Framework\TestCase;
-use Zipkin\Reporters\Http;
-use Zipkin\Samplers\BinarySampler;
-use ZipkinOpenTracing\Tracer;
-
-use function Hyperf\Support\env;
/**
* @internal
* @coversNothing
*/
-#[CoversNothing]
class TracerFactoryTest extends TestCase
{
- protected function tearDown(): void
- {
- Mockery::close();
- }
+ use MockeryPHPUnitIntegration;
- public function testOldSetting()
- {
- $config = new Config([
- 'opentracing' => [
- 'zipkin' => [
- 'app' => [
- 'name' => env('APP_NAME', 'skeleton'),
- // Hyperf will detect the system info automatically as the value if ipv4, ipv6, port is null
- 'ipv4' => '127.0.0.1',
- 'ipv6' => null,
- 'port' => 9501,
- ],
- 'options' => [
- 'endpoint_url' => env('ZIPKIN_ENDPOINT_URL', 'http://localhost:9411/api/v2/spans'),
- 'timeout' => env('ZIPKIN_TIMEOUT', 1),
- ],
- 'sampler' => BinarySampler::createAsAlwaysSample(),
- ],
- ],
- ]);
- $container = $this->getContainer($config);
- $factory = new TracerFactory();
-
- $this->assertInstanceOf(Tracer::class, $factory($container));
- }
-
- public function testZipkinFactory()
- {
- $config = new Config([
- 'opentracing' => [
- 'default' => 'zipkin',
- 'enable' => [
- ],
- 'tracer' => [
- 'zipkin' => [
- 'driver' => ZipkinTracerFactory::class,
- 'app' => [
- 'name' => 'skeleton',
- // Hyperf will detect the system info automatically as the value if ipv4, ipv6, port is null
- 'ipv4' => '127.0.0.1',
- 'ipv6' => null,
- 'port' => 9501,
- ],
- 'options' => [
- ],
- 'sampler' => BinarySampler::createAsAlwaysSample(),
- ],
- 'jaeger' => [
- 'driver' => JaegerTracerFactory::class,
- 'name' => 'skeleton',
- 'options' => [
- ],
- ],
- 'noop' => [
- 'driver' => NoOpTracerFactory::class,
- ],
- ],
- ],
- ]);
- $container = $this->getContainer($config);
- $factory = new TracerFactory();
-
- $this->assertInstanceOf(Tracer::class, $factory($container));
- }
-
- public function testJaegerFactory()
+ /**
+ * @throws Exception
+ */
+ public function testJaegerFactory(): void
{
$config = new Config([
'opentracing' => [
@@ -117,96 +43,32 @@ public function testJaegerFactory()
'enable' => [
],
'tracer' => [
- 'zipkin' => [
- 'driver' => ZipkinTracerFactory::class,
- 'app' => [
- 'name' => 'skeleton',
- // Hyperf will detect the system info automatically as the value if ipv4, ipv6, port is null
- 'ipv4' => '127.0.0.1',
- 'ipv6' => null,
- 'port' => 9501,
- ],
- 'options' => [
- ],
- 'sampler' => BinarySampler::createAsAlwaysSample(),
- ],
'jaeger' => [
'driver' => JaegerTracerFactory::class,
'name' => 'skeleton',
'options' => [
],
],
- 'noop' => [
- 'driver' => NoOpTracerFactory::class,
- ],
],
],
]);
$container = $this->getContainer($config);
$factory = new TracerFactory();
- $this->assertInstanceOf(\Jaeger\Tracer::class, $factory($container));
- }
-
- public function testNoOpFactory()
- {
- $config = new Config([
- 'opentracing' => [
- 'default' => 'noop',
- 'enable' => [
- ],
- 'tracer' => [
- 'zipkin' => [
- 'driver' => ZipkinTracerFactory::class,
- 'app' => [
- 'name' => 'skeleton',
- // Hyperf will detect the system info automatically as the value if ipv4, ipv6, port is null
- 'ipv4' => '127.0.0.1',
- 'ipv6' => null,
- 'port' => 9501,
- ],
- 'options' => [
- ],
- 'sampler' => BinarySampler::createAsAlwaysSample(),
- ],
- 'jaeger' => [
- 'driver' => JaegerTracerFactory::class,
- 'name' => 'skeleton',
- 'options' => [
- ],
- ],
- 'noop' => [
- 'driver' => NoOpTracerFactory::class,
- ],
- ],
- ],
- ]);
- $container = $this->getContainer($config);
- $factory = new TracerFactory();
-
- $this->assertInstanceOf(NoopTracer::class, $factory($container));
+ $this->assertInstanceOf(Tracer::class, $factory($container));
}
protected function getContainer($config)
{
$container = Mockery::mock(Container::class);
- $client = Mockery::mock(HttpClientFactory::class);
- $reporter = Mockery::mock(ReporterFactory::class);
- $reporter->shouldReceive('make')
- ->andReturn(new Http([], $client));
- $container->shouldReceive('get')
- ->with(ZipkinTracerFactory::class)
- ->andReturn(new ZipkinTracerFactory($config, $reporter));
- $container->shouldReceive('get')
+ $container->allows('get')
->with(JaegerTracerFactory::class)
- ->andReturn(new JaegerTracerFactory($config));
- $container->shouldReceive('get')
- ->with(NoOpTracerFactory::class)
- ->andReturn(new NoOpTracerFactory());
- $container->shouldReceive('get')
+ ->andReturns(new JaegerTracerFactory($config));
+
+ $container->allows('get')
->with(ConfigInterface::class)
- ->andReturn($config);
+ ->andReturns($config);
ApplicationContext::setContainer($container);
diff --git a/tests/UriTest.php b/tests/UriTest.php
new file mode 100644
index 0000000..d984e3b
--- /dev/null
+++ b/tests/UriTest.php
@@ -0,0 +1,85 @@
+', 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 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/'));
+ self::assertSame('/v8/test/PET9349FOOBAR/foo/', Uri::sanitize('/v8/test/PET9349FOOBAR/foo/PET9349'));
+ }
+
+ 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}/"));
+ }
+
+ public function testClearUriOids(): void
+ {
+ $oid = '650229807612bba4984d1fc7';
+ $oidLonger = 'ddb21302b3c66b5111bb99a907f783e2a29947f0';
+
+ 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}/"));
+ self::assertSame('/v2/token//foo/', Uri::sanitize("/v2/token/{$oidLonger}/foo/{$oid}"));
+ self::assertSame('/v3/token//foo//bar', Uri::sanitize("/v3/token/$oidLonger/foo/{$oid}/bar"));
+ }
+}
diff --git a/tests/UuidTest.php b/tests/UuidTest.php
new file mode 100644
index 0000000..eabd4ac
--- /dev/null
+++ b/tests/UuidTest.php
@@ -0,0 +1,31 @@
+