diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml new file mode 100644 index 0000000..9ea6142 --- /dev/null +++ b/.github/workflows/phpunit.yml @@ -0,0 +1,19 @@ +on: + pull_request: null + push: + branches: + - master + - '*.*' + +name: phpunit + +jobs: + phpunit: + uses: spiral/gh-actions/.github/workflows/phpunit.yml@master + with: + os: >- + ['ubuntu-latest'] + php: >- + ['8.2'] + stability: >- + ['prefer-lowest', 'prefer-stable'] diff --git a/.github/workflows/psalm.yml b/.github/workflows/psalm.yml new file mode 100644 index 0000000..b37378b --- /dev/null +++ b/.github/workflows/psalm.yml @@ -0,0 +1,17 @@ +on: + pull_request: null + push: + branches: + - master + - '*.*' + +name: static analysis + +jobs: + psalm: + uses: spiral/gh-actions/.github/workflows/psalm.yml@master + with: + os: >- + ['ubuntu-latest'] + php: >- + ['8.2'] diff --git a/.gitignore b/.gitignore index 1582d61..0c58922 100644 --- a/.gitignore +++ b/.gitignore @@ -3,9 +3,13 @@ victoria-metrics-data vendor runtime rr* +protoc-gen-php-grpc* centrifugo* influxd* spiral* .env .phpunit.result.cache -composer.lock +.phpunit.cache +.deptrac.cache +.phpunit.cache/ + diff --git a/.rr.yaml b/.rr.yaml index 10a18ab..a5df4b2 100644 --- a/.rr.yaml +++ b/.rr.yaml @@ -1,4 +1,4 @@ -version: '2.7' +version: '3' rpc: listen: tcp://127.0.0.1:6001 @@ -38,6 +38,7 @@ service: restart_sec: 1 command: "npm run dev" env: + NODE_OPTIONS: --openssl-legacy-provider API_URL: http://127.0.0.1:8080 WS_URL: ws://127.0.0.1:8080/connection/websocket centrifuge: @@ -56,6 +57,11 @@ service: restart_sec: 1 command: "php app.php take:snapshots --period=15" +kv: + settings: + driver: memory + config: { } + metrics: address: 127.0.0.1:2112 @@ -64,4 +70,4 @@ centrifuge: grpc_api_address: "tcp://127.0.0.1:10000" pool: reset_timeout: 10 - num_workers: 2 + num_workers: 4 diff --git a/app.php b/app.php index c98e5ef..5d34d24 100644 --- a/app.php +++ b/app.php @@ -2,7 +2,7 @@ declare(strict_types=1); -use App\Application\App; +use App\Application\Kernel; // If you forgot to configure some of this in your php.ini file, // then don't worry, we will set the standard environment @@ -17,7 +17,7 @@ // Initialize shared container, bindings, directories and etc. -$app = App::create( +$app = Kernel::create( directories: ['root' => __DIR__] )->run(); diff --git a/app/config/broadcasting.php b/app/config/broadcasting.php index 0892641..7ffe4aa 100644 --- a/app/config/broadcasting.php +++ b/app/config/broadcasting.php @@ -12,6 +12,9 @@ 'connections' => [ 'centrifugo' => [ 'driver' => 'centrifugo', + ], + 'null' => [ + 'driver' => 'null', ] ], ]; diff --git a/app/config/cache.php b/app/config/cache.php index af2bd5e..663b9c8 100644 --- a/app/config/cache.php +++ b/app/config/cache.php @@ -10,7 +10,7 @@ /** * The default cache connection that gets used while using this caching library. */ - 'default' => env('CACHE_STORAGE', 'local'), + 'default' => env('CACHE_STORAGE', 'roadrunner'), /** * Aliases, if you want to use domain specific storages. @@ -24,9 +24,12 @@ * Here you may define all of the cache "storages" for your application as well as their types. */ 'storages' => [ - 'local' => [ + 'roadrunner' => [ 'type' => 'roadrunner', 'driver' => 'settings', ], + 'local' => [ + 'type' => ArrayStorage::class, + ], ], ]; diff --git a/app/src/Application/App.php b/app/src/Application/App.php deleted file mode 100644 index aaa5292..0000000 --- a/app/src/Application/App.php +++ /dev/null @@ -1,77 +0,0 @@ - CacheSettingsRepository::class, - CoreInterface::class => [self::class, 'domainCore'], - ]; + public function defineSingletons(): array + { + return [ + SettingsRepositoryInterface::class => CacheSettingsRepository::class, + CoreInterface::class => [self::class, 'domainCore'], + ]; + } } diff --git a/app/src/Application/Bootloader/ExceptionHandlerBootloader.php b/app/src/Application/Bootloader/ExceptionHandlerBootloader.php index 3bc2752..5ef59b5 100644 --- a/app/src/Application/Bootloader/ExceptionHandlerBootloader.php +++ b/app/src/Application/Bootloader/ExceptionHandlerBootloader.php @@ -5,7 +5,7 @@ namespace App\Application\Bootloader; use Spiral\Boot\Bootloader\Bootloader; -use Spiral\Exceptions\ExceptionHandlerInterface; +use Spiral\Exceptions\ExceptionHandler; use Spiral\Exceptions\Reporter\FileReporter; use Spiral\Exceptions\Reporter\LoggerReporter; use Spiral\Http\ErrorHandler\PlainRenderer; @@ -15,13 +15,16 @@ final class ExceptionHandlerBootloader extends Bootloader { - protected const BINDINGS = [ - SuppressErrorsInterface::class => EnvSuppressErrors::class, - RendererInterface::class => PlainRenderer::class, - ]; + public function defineBindings(): array + { + return [ + SuppressErrorsInterface::class => EnvSuppressErrors::class, + RendererInterface::class => PlainRenderer::class, + ]; + } public function boot( - ExceptionHandlerInterface $handler, + ExceptionHandler $handler, LoggerReporter $logger, FileReporter $files ): void { diff --git a/app/src/Application/Bootloader/HttpClientBootloader.php b/app/src/Application/Bootloader/HttpClientBootloader.php index 56d2477..65253a4 100644 --- a/app/src/Application/Bootloader/HttpClientBootloader.php +++ b/app/src/Application/Bootloader/HttpClientBootloader.php @@ -10,7 +10,10 @@ final class HttpClientBootloader extends Bootloader { - protected const SINGLETONS = [ - HttpClientInterface::class => NativeHttpClient::class, - ]; + public function defineSingletons(): array + { + return [ + HttpClientInterface::class => NativeHttpClient::class, + ]; + } } diff --git a/app/src/Application/Bootloader/LoggingBootloader.php b/app/src/Application/Bootloader/LoggingBootloader.php deleted file mode 100644 index 1584e77..0000000 --- a/app/src/Application/Bootloader/LoggingBootloader.php +++ /dev/null @@ -1,45 +0,0 @@ -addHandler( - channel: ErrorHandlerMiddleware::class, - handler: $monolog->logRotate( - filename: $dirs->getRuntime('logs/http.log') - ) - ); - - // app level errors - $monolog->addHandler( - channel: MonologConfig::DEFAULT_CHANNEL, - handler: $monolog->logRotate( - filename: $dirs->getRuntime('logs/error.log'), - level: Logger::ERROR, - maxFiles: 25, - bubble: false - ) - ); - - // debug and info messages via global LoggerInterface - $monolog->addHandler( - channel: MonologConfig::DEFAULT_CHANNEL, - handler: $monolog->logRotate( - filename: $dirs->getRuntime('logs/debug.log') - ) - ); - } -} diff --git a/app/src/Application/Bootloader/PrometheusParserBootloader.php b/app/src/Application/Bootloader/PrometheusParserBootloader.php index f517d39..6bc3525 100644 --- a/app/src/Application/Bootloader/PrometheusParserBootloader.php +++ b/app/src/Application/Bootloader/PrometheusParserBootloader.php @@ -10,9 +10,12 @@ final class PrometheusParserBootloader extends Bootloader { - protected const SINGLETONS = [ - Parser::class => [self::class, 'initParser'], - ]; + public function defineSingletons(): array + { + return [ + Parser::class => [self::class, 'initParser'], + ]; + } private function initParser(): Parser { diff --git a/app/src/Application/Bootloader/RPCBootloader.php b/app/src/Application/Bootloader/RPCBootloader.php index 086f85c..ab138f3 100644 --- a/app/src/Application/Bootloader/RPCBootloader.php +++ b/app/src/Application/Bootloader/RPCBootloader.php @@ -4,39 +4,22 @@ namespace App\Application\Bootloader; -use App\Infrastructure\RPC\RPCManager; -use App\Infrastructure\RPC\RPCManagerInterface; -use App\Infrastructure\RPC\ServersConfig; -use App\Infrastructure\RPC\ServersRegistry; -use App\Infrastructure\RPC\ServersRegistryInterface; +use App\Application\Config\ServersConfig; +use App\Domain\Server\Infrastructure\Cache\ServersRegistry; +use App\Domain\Server\Service\ServersRegistryInterface; +use App\Domain\Server\Service\ServersRepositoryInterface; +use App\Infrastructure\RoadRunner\RPC\RPCManager; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; use Spiral\Boot\Bootloader\Bootloader; use Spiral\Boot\EnvironmentInterface; use Spiral\Cache\CacheStorageProviderInterface; final class RPCBootloader extends Bootloader { - protected const SINGLETONS = [ - RPCManagerInterface::class => RPCManager::class, - ServersRegistryInterface::class => [self::class, 'initServersRegistry'], - ]; - - private function initServersRegistry( - CacheStorageProviderInterface $provider, - ServersConfig $config, - EnvironmentInterface $env - ): ServersRegistryInterface { - $registry = new ServersRegistry( - $provider->storage('settings'), - $config->getServers() - ); - - foreach ($env->getAll() as $key => $host) { - if (\str_starts_with($key, 'RPC_SERVER_')) { - $name = \strtolower(\str_replace('RPC_SERVER_', '', $key)); - $registry->addServer($name, $host); - } - } - - return $registry; + public function defineSingletons(): array + { + return [ + RPCManagerInterface::class => RPCManager::class, + ]; } } diff --git a/app/src/Application/Bootloader/RoutesBootloader.php b/app/src/Application/Bootloader/RoutesBootloader.php index 731da02..6687ca2 100644 --- a/app/src/Application/Bootloader/RoutesBootloader.php +++ b/app/src/Application/Bootloader/RoutesBootloader.php @@ -4,11 +4,11 @@ namespace App\Application\Bootloader; +use App\Application\HTTP\Middleware\ErrorHandlerMiddleware; use App\Application\HTTP\Middleware\HandleRPCExceptionsMiddleware; use Spiral\Bootloader\Http\RouterBootloader; use Spiral\Bootloader\Http\RoutesBootloader as BaseRoutesBootloader; use Spiral\Filter\ValidationHandlerMiddleware; -use Spiral\Http\Middleware\ErrorHandlerMiddleware; use Spiral\Http\Middleware\JsonPayloadMiddleware; use Spiral\Router\Bootloader\AnnotatedRoutesBootloader; use Spiral\Router\GroupRegistry; @@ -25,7 +25,6 @@ protected function globalMiddleware(): array return [ ErrorHandlerMiddleware::class, JsonPayloadMiddleware::class, - ValidationHandlerMiddleware::class, ]; } @@ -38,14 +37,13 @@ protected function middlewareGroups(): array ]; } - /** - * Override this method to configure route groups - */ protected function configureRouteGroups(GroupRegistry $groups): void { $groups - ->setDefaultGroup('api'); + ->setDefaultGroup('api.v1'); - $groups->getGroup('api')->setPrefix('/api')->setNamePrefix('api.'); + $groups->getGroup('api.v1') + ->setPrefix('/api/v1') + ->setNamePrefix('api.v1.'); } } diff --git a/app/src/Application/Bootloader/ServerBootloader.php b/app/src/Application/Bootloader/ServerBootloader.php new file mode 100644 index 0000000..b418766 --- /dev/null +++ b/app/src/Application/Bootloader/ServerBootloader.php @@ -0,0 +1,61 @@ + DataCollectorTokenizerListener::class, + DataCollectorRepositoryInterface::class => DataCollectorTokenizerListener::class, + + ServersRegistry::class => [self::class, 'initServersRegistry'], + ServersRegistryInterface::class => ServersRegistry::class, + ServersRepositoryInterface::class => ServersRegistry::class, + ]; + } + + public function boot( + TokenizerListenerRegistryInterface $registry, + DataCollectorTokenizerListener $collectorListener, + ): void { + $registry->addListener($collectorListener); + } + + private function initServersRegistry( + CacheStorageProviderInterface $provider, + ServersConfig $config, + EnvironmentInterface $env, + ): ServersRegistryInterface { + $registry = new ServersRegistry( + $provider->storage('settings'), + $config->getDefaultServer(), + $config->getServers(), + ); + + foreach ($env->getAll() as $key => $host) { + if (\str_starts_with($key, 'RPC_SERVER_')) { + /** @var non-empty-string $name */ + $name = \strtolower(\str_replace('RPC_SERVER_', '', $key)); + $registry->addServer($name, $host); + } + } + + return $registry; + } +} diff --git a/app/src/Application/Bootloader/ValidatorBootloader.php b/app/src/Application/Bootloader/ValidatorBootloader.php index 9806eeb..7b9983d 100644 --- a/app/src/Application/Bootloader/ValidatorBootloader.php +++ b/app/src/Application/Bootloader/ValidatorBootloader.php @@ -10,7 +10,7 @@ final class ValidatorBootloader extends Bootloader { - public function boot(BaseValidatorBootloader $bootloader) + public function boot(BaseValidatorBootloader $bootloader): void { $bootloader->addChecker('custom', ValidationRules::class); } diff --git a/app/src/Application/Bootloader/VictoriaMetricsBootloader.php b/app/src/Application/Bootloader/VictoriaMetricsBootloader.php index aeea391..d8c3ac6 100644 --- a/app/src/Application/Bootloader/VictoriaMetricsBootloader.php +++ b/app/src/Application/Bootloader/VictoriaMetricsBootloader.php @@ -12,13 +12,16 @@ final class VictoriaMetricsBootloader extends Bootloader { - protected const SINGLETONS = [ - ClientInterface::class => [self::class, 'initClient'], - ]; + public function defineSingletons(): array + { + return [ + ClientInterface::class => [self::class, 'initClient'], + ]; + } private function initClient( HttpClientInterface $client, - EnvironmentInterface $env + EnvironmentInterface $env, ): ClientInterface { $headers = [ 'content-type' => 'application/json', diff --git a/app/src/Application/Centrifuge/Channel/Channel.php b/app/src/Application/Centrifuge/Channel/Channel.php index 44f85b5..958f276 100644 --- a/app/src/Application/Centrifuge/Channel/Channel.php +++ b/app/src/Application/Centrifuge/Channel/Channel.php @@ -4,10 +4,10 @@ namespace App\Application\Centrifuge\Channel; -class Channel implements \Stringable +readonly class Channel implements \Stringable { public function __construct( - public readonly string $name + public string $name, ) { } diff --git a/app/src/Application/Centrifuge/Channel/PublicChannel.php b/app/src/Application/Centrifuge/Channel/PublicChannel.php index d3d15c6..a983785 100644 --- a/app/src/Application/Centrifuge/Channel/PublicChannel.php +++ b/app/src/Application/Centrifuge/Channel/PublicChannel.php @@ -4,7 +4,7 @@ namespace App\Application\Centrifuge\Channel; -final class PublicChannel extends Channel +final readonly class PublicChannel extends Channel { public function __construct() { diff --git a/app/src/Application/Centrifuge/Channel/ServerChannel.php b/app/src/Application/Centrifuge/Channel/ServerChannel.php index ce1ef02..bf9f82d 100644 --- a/app/src/Application/Centrifuge/Channel/ServerChannel.php +++ b/app/src/Application/Centrifuge/Channel/ServerChannel.php @@ -4,8 +4,11 @@ namespace App\Application\Centrifuge\Channel; -final class ServerChannel extends Channel +final readonly class ServerChannel extends Channel { + /** + * @param non-empty-string $server + */ public function __construct(string $server) { parent::__construct(\sprintf('server.%s', $server)); diff --git a/app/src/Application/Centrifuge/Interceptor/LoggingInterceptor.php b/app/src/Application/Centrifuge/Interceptor/LoggingInterceptor.php index ab4aaf8..d864130 100644 --- a/app/src/Application/Centrifuge/Interceptor/LoggingInterceptor.php +++ b/app/src/Application/Centrifuge/Interceptor/LoggingInterceptor.php @@ -8,10 +8,10 @@ use Spiral\Core\CoreInterceptorInterface; use Spiral\Core\CoreInterface; -final class LoggingInterceptor implements CoreInterceptorInterface +final readonly class LoggingInterceptor implements CoreInterceptorInterface { public function __construct( - private readonly LoggerInterface $logger, + private LoggerInterface $logger, ) { } diff --git a/app/src/Application/Collectors/PipelinesListCollector.php b/app/src/Application/Collectors/PipelinesListCollector.php new file mode 100644 index 0000000..174a5d2 --- /dev/null +++ b/app/src/Application/Collectors/PipelinesListCollector.php @@ -0,0 +1,48 @@ +name === 'jobs'; + } + + public function collect(Server $server, Plugin $plugin): void + { + $schema = $this->container->get(PipelinesSchema::class); + + $this->broadcast->publish( + new ServerChannel($server->name), + \json_encode([ + 'event' => 'pipelines.list', + 'data' => new PipelineCollection( + $schema->create( + $this->bus->ask(new PipelineListQuery($server->name)), + ), + ), + ]), + ); + } +} diff --git a/app/src/Application/Collectors/PluginCollector.php b/app/src/Application/Collectors/PluginCollector.php new file mode 100644 index 0000000..322dbeb --- /dev/null +++ b/app/src/Application/Collectors/PluginCollector.php @@ -0,0 +1,44 @@ +container->get(WorkersSchema::class); + $plugin = $plugin->jsonSerialize(); + $plugin['workers'] = $schema->create($plugin['workers']); + + $this->broadcast->publish( + new ServerChannel($server->name), + \json_encode([ + 'event' => 'plugin.list', + 'data' => new PluginResource($plugin), + ]) + ); + } +} diff --git a/app/src/Application/Collectors/ServicesListCollector.php b/app/src/Application/Collectors/ServicesListCollector.php new file mode 100644 index 0000000..6b859c5 --- /dev/null +++ b/app/src/Application/Collectors/ServicesListCollector.php @@ -0,0 +1,46 @@ +name === 'services'; + } + + public function collect(Server $server, Plugin $plugin): void + { +// $services = \array_map( +// static fn(string $service): array => ['name' => $service], +// $this->bus->ask(new ListQuery($server->name)), +// ); +// +// foreach ($services as &$service) { +// $service['statuses'] = $this->bus->ask(new StatusQuery($server->name, $service['name'])); +// } +// +// $this->broadcast->publish( +// new ServerChannel($server->name), +// (string)new ServicesListEvent(new ServicesCollection($services)), +// ); + } +} diff --git a/app/src/Application/Command/Informer/AddWorkerCommand.php b/app/src/Application/Command/Informer/AddWorkerCommand.php new file mode 100644 index 0000000..eab5362 --- /dev/null +++ b/app/src/Application/Command/Informer/AddWorkerCommand.php @@ -0,0 +1,21 @@ + + */ +final readonly class AddWorkerCommand implements CommandInterface +{ + public function __construct( + public string $server, + public string $plugin, + ) { + } +} diff --git a/app/src/Application/Command/Informer/DTO/AddWorkerResult.php b/app/src/Application/Command/Informer/DTO/AddWorkerResult.php new file mode 100644 index 0000000..d0c1269 --- /dev/null +++ b/app/src/Application/Command/Informer/DTO/AddWorkerResult.php @@ -0,0 +1,15 @@ + */ -final class ListQuery implements QueryInterface +final readonly class PluginListQuery implements QueryInterface { public function __construct( - public readonly string $server, + public string $server, ) { } } diff --git a/app/src/Application/Command/Informer/RemoveWorkerCommand.php b/app/src/Application/Command/Informer/RemoveWorkerCommand.php new file mode 100644 index 0000000..d03c329 --- /dev/null +++ b/app/src/Application/Command/Informer/RemoveWorkerCommand.php @@ -0,0 +1,21 @@ + + */ +final readonly class RemoveWorkerCommand implements CommandInterface +{ + public function __construct( + public string $server, + public string $plugin, + ) { + } +} diff --git a/app/src/Application/Command/Informer/WorkersQuery.php b/app/src/Application/Command/Informer/WorkersQuery.php index 2e3519f..dfbf205 100644 --- a/app/src/Application/Command/Informer/WorkersQuery.php +++ b/app/src/Application/Command/Informer/WorkersQuery.php @@ -4,16 +4,18 @@ namespace App\Application\Command\Informer; +use App\Application\Command\Informer\DTO\WorkersResult; use Spiral\Cqrs\QueryInterface; /** * Get all workers for plugin. + * @implements QueryInterface */ -final class WorkersQuery implements QueryInterface +final readonly class WorkersQuery implements QueryInterface { public function __construct( - public readonly string $server, - public readonly string $plugin, + public string $server, + public string $plugin, ) { } } diff --git a/app/src/Application/Command/Jobs/DTO/PauseResult.php b/app/src/Application/Command/Jobs/DTO/PauseResult.php new file mode 100644 index 0000000..0e51ab2 --- /dev/null +++ b/app/src/Application/Command/Jobs/DTO/PauseResult.php @@ -0,0 +1,15 @@ + + */ +final readonly class PauseCommand implements CommandInterface { public function __construct( - public readonly string $server, - public readonly string $pipeline, + public string $server, + public string $pipeline, ) { } } diff --git a/app/src/Application/Command/Jobs/PipelineListQuery.php b/app/src/Application/Command/Jobs/PipelineListQuery.php index d48437c..c099054 100644 --- a/app/src/Application/Command/Jobs/PipelineListQuery.php +++ b/app/src/Application/Command/Jobs/PipelineListQuery.php @@ -4,15 +4,17 @@ namespace App\Application\Command\Jobs; +use App\Application\Command\Jobs\DTO\PipelineListResult; use Spiral\Cqrs\QueryInterface; /** * Get all created jobs plugin pipelines. + * @implements QueryInterface */ -final class PipelineListQuery implements QueryInterface +final readonly class PipelineListQuery implements QueryInterface { public function __construct( - public readonly string $server + public string $server ) { } } diff --git a/app/src/Application/Command/Jobs/ResumeCommand.php b/app/src/Application/Command/Jobs/ResumeCommand.php index ae32751..46b1c2f 100644 --- a/app/src/Application/Command/Jobs/ResumeCommand.php +++ b/app/src/Application/Command/Jobs/ResumeCommand.php @@ -4,13 +4,18 @@ namespace App\Application\Command\Jobs; +use App\Application\Command\Jobs\DTO\ResumeResult; use Spiral\Cqrs\CommandInterface; -final class ResumeCommand implements CommandInterface +/** + * Resume a paused pipeline. + * @implements CommandInterface + */ +final readonly class ResumeCommand implements CommandInterface { public function __construct( - public readonly string $server, - public readonly string $pipeline, + public string $server, + public string $pipeline, ) { } } diff --git a/app/src/Application/Command/Metrics/GetAvailableMetricsQuery.php b/app/src/Application/Command/Metrics/GetAvailableMetricsQuery.php index 38f8dc4..233eb27 100644 --- a/app/src/Application/Command/Metrics/GetAvailableMetricsQuery.php +++ b/app/src/Application/Command/Metrics/GetAvailableMetricsQuery.php @@ -4,13 +4,12 @@ namespace App\Application\Command\Metrics; -use Carbon\Carbon; use Spiral\Cqrs\QueryInterface; -final class GetAvailableMetricsQuery implements QueryInterface +final readonly class GetAvailableMetricsQuery implements QueryInterface { public function __construct( - public readonly string $server + public string $server ) { } } diff --git a/app/src/Application/Command/Metrics/GetByKeyQuery.php b/app/src/Application/Command/Metrics/GetByKeyQuery.php index 15f8dbf..7aed118 100644 --- a/app/src/Application/Command/Metrics/GetByKeyQuery.php +++ b/app/src/Application/Command/Metrics/GetByKeyQuery.php @@ -6,13 +6,13 @@ use Spiral\Cqrs\QueryInterface; -final class GetByKeyQuery implements QueryInterface +final readonly class GetByKeyQuery implements QueryInterface { public function __construct( - public readonly string $server, - public readonly string $key, - public readonly array $tags = [], - public readonly ?string $step = '1m' + public string $server, + public string $key, + public array $tags = [], + public ?string $step = '1m' ) { } } diff --git a/app/src/Application/Command/Metrics/GetMetricsQuery.php b/app/src/Application/Command/Metrics/GetMetricsQuery.php index a5d7033..bc1728a 100644 --- a/app/src/Application/Command/Metrics/GetMetricsQuery.php +++ b/app/src/Application/Command/Metrics/GetMetricsQuery.php @@ -6,10 +6,10 @@ use Spiral\Cqrs\QueryInterface; -final class GetMetricsQuery implements QueryInterface +final readonly class GetMetricsQuery implements QueryInterface { public function __construct( - public readonly string $server + public string $server ) { } } diff --git a/app/src/Application/Command/Metrics/GetRangeByKeyQuery.php b/app/src/Application/Command/Metrics/GetRangeByKeyQuery.php index b356d3c..1690b4b 100644 --- a/app/src/Application/Command/Metrics/GetRangeByKeyQuery.php +++ b/app/src/Application/Command/Metrics/GetRangeByKeyQuery.php @@ -7,14 +7,14 @@ use Carbon\Carbon; use Spiral\Cqrs\QueryInterface; -final class GetRangeByKeyQuery implements QueryInterface +final readonly class GetRangeByKeyQuery implements QueryInterface { public function __construct( - public readonly string $server, - public readonly string $key, - public readonly array $tags = [], - public readonly \DateTimeInterface $start = new Carbon('-30 minutes'), - public readonly \DateTimeInterface $end = new Carbon(), + public string $server, + public string $key, + public array $tags = [], + public \DateTimeInterface $start = new Carbon('-30 minutes'), + public \DateTimeInterface $end = new Carbon(), ) { } } diff --git a/app/src/Application/Command/Resetter/DTO/ResetResult.php b/app/src/Application/Command/Resetter/DTO/ResetResult.php new file mode 100644 index 0000000..ba16aea --- /dev/null +++ b/app/src/Application/Command/Resetter/DTO/ResetResult.php @@ -0,0 +1,15 @@ + + */ +final readonly class ResetCommand implements CommandInterface { public function __construct( - public readonly string $server, - public readonly string $plugin, + public string $server, + public string $plugin, ) { } } diff --git a/app/src/Application/Command/RoadRunner/DTO/GetConfigResult.php b/app/src/Application/Command/RoadRunner/DTO/GetConfigResult.php new file mode 100644 index 0000000..cfff783 --- /dev/null +++ b/app/src/Application/Command/RoadRunner/DTO/GetConfigResult.php @@ -0,0 +1,14 @@ + */ -final class GetConfigQuery implements QueryInterface +final readonly class GetConfigQuery implements QueryInterface { public function __construct( - public readonly string $server, + public string $server, ) { } } diff --git a/app/src/Application/Command/RoadRunner/GetVersionQuery.php b/app/src/Application/Command/RoadRunner/GetVersionQuery.php index ef9b6f9..1431567 100644 --- a/app/src/Application/Command/RoadRunner/GetVersionQuery.php +++ b/app/src/Application/Command/RoadRunner/GetVersionQuery.php @@ -4,15 +4,17 @@ namespace App\Application\Command\RoadRunner; +use App\Application\Command\RoadRunner\DTO\GetVersionResult; use Spiral\Cqrs\QueryInterface; /** * Get version of the RoadRunner server. + * @implements QueryInterface */ -final class GetVersionQuery implements QueryInterface +final readonly class GetVersionQuery implements QueryInterface { public function __construct( - public readonly string $server, + public string $server, ) { } } diff --git a/app/src/Application/Command/Server/DTO/DefaultServerResult.php b/app/src/Application/Command/Server/DTO/DefaultServerResult.php new file mode 100644 index 0000000..cd804ed --- /dev/null +++ b/app/src/Application/Command/Server/DTO/DefaultServerResult.php @@ -0,0 +1,13 @@ + + */ +final class DefaultServerQuery implements QueryInterface +{ +} diff --git a/app/src/Application/Command/Server/ListQuery.php b/app/src/Application/Command/Server/ListQuery.php index 4679d3a..3a4dcbf 100644 --- a/app/src/Application/Command/Server/ListQuery.php +++ b/app/src/Application/Command/Server/ListQuery.php @@ -4,10 +4,13 @@ namespace App\Application\Command\Server; +use App\Application\Command\Server\DTO\ListResult; use Spiral\Cqrs\QueryInterface; /** * Get all available servers. + * + * @implements QueryInterface */ final class ListQuery implements QueryInterface { diff --git a/app/src/Application/Command/Server/RegisterCommand.php b/app/src/Application/Command/Server/RegisterCommand.php index 5108f50..9abefdc 100644 --- a/app/src/Application/Command/Server/RegisterCommand.php +++ b/app/src/Application/Command/Server/RegisterCommand.php @@ -4,13 +4,17 @@ namespace App\Application\Command\Server; +use App\Application\Command\Server\DTO\RegisterResult; use Spiral\Cqrs\CommandInterface; -final class RegisterCommand implements CommandInterface +/** + * @implements CommandInterface + */ +final readonly class RegisterCommand implements CommandInterface { public function __construct( - public readonly string $name, - public readonly string $address, + public string $name, + public string $address, ) { } } diff --git a/app/src/Application/Command/Service/CreateCommand.php b/app/src/Application/Command/Service/CreateCommand.php index 6854c59..7bd18e7 100644 --- a/app/src/Application/Command/Service/CreateCommand.php +++ b/app/src/Application/Command/Service/CreateCommand.php @@ -4,19 +4,23 @@ namespace App\Application\Command\Service; +use App\Application\Command\Service\DTO\CreateResult; use Spiral\Cqrs\CommandInterface; -final class CreateCommand implements CommandInterface +/** + * @implements CommandInterface + */ +final readonly class CreateCommand implements CommandInterface { public function __construct( - public readonly string $server, - public readonly string $name, - public readonly string $command, - public readonly int $processNum = 1, - public readonly int $execTimeout = 0, - public readonly bool $remainAfterExit = false, - public readonly array $env = [], - public readonly int $restartSec = 30 + public string $server, + public string $name, + public string $command, + public int $processNum = 1, + public int $execTimeout = 0, + public bool $remainAfterExit = false, + public array $env = [], + public int $restartSec = 30 ) { } } diff --git a/app/src/Application/Command/Service/DTO/CreateResult.php b/app/src/Application/Command/Service/DTO/CreateResult.php new file mode 100644 index 0000000..13a3355 --- /dev/null +++ b/app/src/Application/Command/Service/DTO/CreateResult.php @@ -0,0 +1,14 @@ + + */ +final readonly class ListQuery implements QueryInterface { public function __construct( - public readonly string $server, + public string $server, ) { } } diff --git a/app/src/Application/Command/Service/RestartCommand.php b/app/src/Application/Command/Service/RestartCommand.php index f767992..2733392 100644 --- a/app/src/Application/Command/Service/RestartCommand.php +++ b/app/src/Application/Command/Service/RestartCommand.php @@ -4,13 +4,17 @@ namespace App\Application\Command\Service; +use App\Application\Command\Service\DTO\RestartResult; use Spiral\Cqrs\CommandInterface; -final class RestartCommand implements CommandInterface +/** + * @implements CommandInterface + */ +final readonly class RestartCommand implements CommandInterface { public function __construct( - public readonly string $server, - public readonly string $service, + public string $server, + public string $service, ) { } } diff --git a/app/src/Application/Command/Service/StatusQuery.php b/app/src/Application/Command/Service/StatusQuery.php index 5ccfbb2..d009914 100644 --- a/app/src/Application/Command/Service/StatusQuery.php +++ b/app/src/Application/Command/Service/StatusQuery.php @@ -4,13 +4,17 @@ namespace App\Application\Command\Service; +use App\Application\Command\Service\DTO\StatusResult; use Spiral\Cqrs\QueryInterface; -final class StatusQuery implements QueryInterface +/** + * @implements QueryInterface + */ +final readonly class StatusQuery implements QueryInterface { public function __construct( - public readonly string $server, - public readonly string $service, + public string $server, + public string $service, ) { } } diff --git a/app/src/Application/Command/Service/TerminateCommand.php b/app/src/Application/Command/Service/TerminateCommand.php index 77286c6..d06fa07 100644 --- a/app/src/Application/Command/Service/TerminateCommand.php +++ b/app/src/Application/Command/Service/TerminateCommand.php @@ -4,13 +4,17 @@ namespace App\Application\Command\Service; +use App\Application\Command\Service\DTO\TerminateResult; use Spiral\Cqrs\CommandInterface; -final class TerminateCommand implements CommandInterface +/** + * @implements CommandInterface + */ +final readonly class TerminateCommand implements CommandInterface { public function __construct( - public readonly string $server, - public readonly string $service, + public string $server, + public string $service, ) { } } diff --git a/app/src/Application/Command/Settings/DTO/StoreResult.php b/app/src/Application/Command/Settings/DTO/StoreResult.php new file mode 100644 index 0000000..d2e1367 --- /dev/null +++ b/app/src/Application/Command/Settings/DTO/StoreResult.php @@ -0,0 +1,13 @@ + + */ +final readonly class StoreCommand implements CommandInterface { public function __construct( - public readonly array $settings, + public array $settings, ) { } } diff --git a/app/src/Application/Command/TCP/CloseCommand.php b/app/src/Application/Command/TCP/CloseCommand.php index e769427..06c2f4c 100644 --- a/app/src/Application/Command/TCP/CloseCommand.php +++ b/app/src/Application/Command/TCP/CloseCommand.php @@ -4,13 +4,17 @@ namespace App\Application\Command\TCP; +use App\Application\Command\TCP\DTO\CloseResult; use Spiral\Cqrs\CommandInterface; -final class CloseCommand implements CommandInterface +/** + * @implements CommandInterface + */ +final readonly class CloseCommand implements CommandInterface { public function __construct( - public readonly string $server, - public readonly string $connectionUuid, + public string $server, + public string $connectionUuid, ) { } } diff --git a/app/src/Application/Command/TCP/DTO/CloseResult.php b/app/src/Application/Command/TCP/DTO/CloseResult.php new file mode 100644 index 0000000..02a6e1f --- /dev/null +++ b/app/src/Application/Command/TCP/DTO/CloseResult.php @@ -0,0 +1,15 @@ +container->get(BroadcastInterface::class); + $event = $parameters['event']; $result = $core->callAction($controller, $action, $parameters); if ($event instanceof ShouldBroadcast) { // TODO Add exception handling - $this->broadcast->publish( + $broadcast->publish( $event->getBroadcastTopics(), $this->registry->get('json')->serialize( ['event' => $event->getEventName(), 'data' => $event->getPayload()] diff --git a/app/src/Application/HTTP/Response/JsonResourceInterceptor.php b/app/src/Application/HTTP/Interceptor/JsonResourceInterceptor.php similarity index 60% rename from app/src/Application/HTTP/Response/JsonResourceInterceptor.php rename to app/src/Application/HTTP/Interceptor/JsonResourceInterceptor.php index 35b2163..e0587b7 100644 --- a/app/src/Application/HTTP/Response/JsonResourceInterceptor.php +++ b/app/src/Application/HTTP/Interceptor/JsonResourceInterceptor.php @@ -2,18 +2,17 @@ declare(strict_types=1); -namespace App\Application\HTTP\Response; +namespace App\Application\HTTP\Interceptor; +use App\Application\HTTP\Response\ResourceInterface; use Psr\Http\Message\ResponseFactoryInterface; use Spiral\Core\CoreInterceptorInterface; use Spiral\Core\CoreInterface; -use Spiral\Http\Request\InputManager; -final class JsonResourceInterceptor implements CoreInterceptorInterface +final readonly class JsonResourceInterceptor implements CoreInterceptorInterface { public function __construct( - private readonly InputManager $manager, - private readonly ResponseFactoryInterface $responseFactory + private ResponseFactoryInterface $responseFactory, ) { } @@ -23,8 +22,7 @@ public function process(string $controller, string $action, array $parameters, C if ($response instanceof ResourceInterface) { $response = $response->toResponse( - $this->manager->request(), - $this->responseFactory->createResponse() + $this->responseFactory->createResponse(), ); } diff --git a/app/src/Application/HTTP/Middleware/ErrorHandlerMiddleware.php b/app/src/Application/HTTP/Middleware/ErrorHandlerMiddleware.php new file mode 100644 index 0000000..5847abf --- /dev/null +++ b/app/src/Application/HTTP/Middleware/ErrorHandlerMiddleware.php @@ -0,0 +1,91 @@ +handle($request); + } catch (\Throwable $exception) { + $code = 500; + + if ($exception instanceof ValidationException) { + $response = new ValidationResource($exception); + $code = $exception->getCode(); + } elseif ($exception instanceof ControllerException || $exception instanceof ClientException) { + $response = new ErrorResource( + match ($exception->getCode()) { + ClientException::BAD_DATA, + ClientException::NOT_FOUND, + ControllerException::BAD_ACTION, + ControllerException::NOT_FOUND => new NotFoundException('Not found', $exception), + ClientException::FORBIDDEN, + ControllerException::FORBIDDEN => new ForbiddenException('Forbidden', $exception), + ClientException::UNAUTHORIZED, + ControllerException::UNAUTHORIZED => new UnauthorizedException('Unauthorized', $exception), + default => new ErrorResource($exception), + }, + ); + $code = $exception->getCode(); + + if ($code === 500) { + $this->errorHandler->report($exception); + } + } elseif ($exception instanceof JobsException) { + if ($exception->getPrevious() instanceof ServiceException) { + $response = new ErrorResource($exception); + } else { + throw $exception; + } + } else { + $this->errorHandler->report($exception); + $response = new ErrorResource($exception); + } + + return $response->toResponse( + $this->responseFactory->createResponse(), + )->withStatus($code); + } + } +} diff --git a/app/src/Application/HTTP/Middleware/HandleRPCExceptionsMiddleware.php b/app/src/Application/HTTP/Middleware/HandleRPCExceptionsMiddleware.php index 1769cc1..225d9f7 100644 --- a/app/src/Application/HTTP/Middleware/HandleRPCExceptionsMiddleware.php +++ b/app/src/Application/HTTP/Middleware/HandleRPCExceptionsMiddleware.php @@ -12,10 +12,10 @@ use Spiral\Http\ResponseWrapper; use Spiral\RoadRunner\Jobs\Exception\JobsException; -final class HandleRPCExceptionsMiddleware implements MiddlewareInterface +final readonly class HandleRPCExceptionsMiddleware implements MiddlewareInterface { public function __construct( - private readonly ResponseWrapper $wrapper + private ResponseWrapper $wrapper ) { } diff --git a/app/src/Application/HTTP/Response/ErrorResource.php b/app/src/Application/HTTP/Response/ErrorResource.php new file mode 100644 index 0000000..cf8fb05 --- /dev/null +++ b/app/src/Application/HTTP/Response/ErrorResource.php @@ -0,0 +1,39 @@ + $this->data->getMessage(), + 'code' => $this->getCode(), + ]; + } + + protected function getCode(): int + { + return match (true) { + $this->data instanceof ControllerException => $this->data->getCode(), + $this->data instanceof ClientException => $this->data->getCode(), + default => 500, + }; + } +} diff --git a/app/src/Application/HTTP/Response/JsonResource.php b/app/src/Application/HTTP/Response/JsonResource.php index 8b0633c..14b11d9 100644 --- a/app/src/Application/HTTP/Response/JsonResource.php +++ b/app/src/Application/HTTP/Response/JsonResource.php @@ -6,37 +6,32 @@ use JsonSerializable; use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\ServerRequestInterface; use Spiral\Http\Traits\JsonTrait; -class JsonResource implements ResourceInterface, \ArrayAccess +class JsonResource implements ResourceInterface { use JsonTrait; - public function __construct( - protected readonly array|JsonSerializable $data - ) { + protected readonly mixed $data; + + public function __construct(mixed $data = []) + { + $this->data = $data; } - protected function mapData(ServerRequestInterface $request): array|JsonSerializable + protected function mapData(): array|JsonSerializable { return $this->data; } - public function resolve(ServerRequestInterface $request): array + protected function getCode(): int { - $data = $this->mapData($request); - - if ($data instanceof JsonSerializable) { - $data = $data->jsonSerialize(); - } - - return $this->wrapData($data); + return 200; } - public function toResponse(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface + public function toResponse(ResponseInterface $response): ResponseInterface { - return $this->writeJson($response, $this->resolve($request)); + return $this->writeJson($response, $this, $this->getCode()); } protected function wrapData(array $data): array @@ -44,33 +39,25 @@ protected function wrapData(array $data): array return $data; } - public function offsetExists(mixed $offset): bool - { - return isset($this->data[$offset]); - } - - public function offsetGet(mixed $offset): mixed + public function jsonSerialize(): array { - return $this->data[$offset]; - } + $data = $this->mapData(); - public function offsetSet(mixed $offset, mixed $value): void - { - throw new \RuntimeException('Resource is read-only'); - } + if ($data instanceof JsonSerializable) { + $data = $data->jsonSerialize(); + } - public function offsetUnset(mixed $offset): void - { - throw new \RuntimeException('Resource is read-only'); - } + foreach ($data as $key => $value) { + if ($value instanceof ResourceInterface) { + $data[$key] = $value->jsonSerialize(); + } + } - public function __isset($key) - { - return $this->offsetExists($key); + return $this->wrapData($data); } - public function __get($key) + public function __toString(): string { - return $this->offsetGet($key); + return \json_encode($this->jsonSerialize(), \JSON_THROW_ON_ERROR); } } diff --git a/app/src/Application/HTTP/Response/ResourceCollection.php b/app/src/Application/HTTP/Response/ResourceCollection.php index c99d531..186a488 100644 --- a/app/src/Application/HTTP/Response/ResourceCollection.php +++ b/app/src/Application/HTTP/Response/ResourceCollection.php @@ -5,7 +5,6 @@ namespace App\Application\HTTP\Response; use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\ServerRequestInterface; use Spiral\DataGrid\GridInterface; use Spiral\Http\Traits\JsonTrait; @@ -13,21 +12,25 @@ class ResourceCollection implements ResourceInterface { use JsonTrait; + private readonly array $args; + /** - * @param class-string $resourceClass + * @param class-string|\Closure $resource */ public function __construct( protected readonly iterable $data, - protected string $resourceClass = JsonResource::class + protected string|\Closure $resource = JsonResource::class, + mixed ...$args ) { + $this->args = $args; } /** - * @return class-string + * @return class-string|\Closure */ - protected function getResourceClass(): string + protected function getResource(): string|\Closure { - return $this->resourceClass; + return $this->resource; } protected function getData(): iterable @@ -35,21 +38,28 @@ protected function getData(): iterable return $this->data; } - public function resolve(ServerRequestInterface $request): array + public function jsonSerialize(): array { $data = []; - $resourceClass = $this->getResourceClass(); + $resource = $this->getResource(); foreach ($this->getData() as $key => $row) { - $data[$key] = (new $resourceClass($row))->resolve($request); + if (\is_string($resource)) { + $resource = static fn(mixed $row, mixed ...$args): ResourceInterface => new $resource($row, ...$args); + } elseif (!\is_callable($resource) && $row instanceof \JsonSerializable) { + $data[$key] = $row; + continue; + } + + $data[$key] = $resource($row, ...$this->args); } return $this->wrapData($data); } - public function toResponse(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface + public function toResponse(ResponseInterface $response): ResponseInterface { - return $this->writeJson($response, $this->resolve($request)); + return $this->writeJson($response, $this); } protected function wrapData(array $data): array @@ -69,4 +79,9 @@ protected function wrapData(array $data): array ], ]; } + + public function __toString(): string + { + return \json_encode($this->jsonSerialize(), \JSON_THROW_ON_ERROR); + } } diff --git a/app/src/Application/HTTP/Response/ResourceInterface.php b/app/src/Application/HTTP/Response/ResourceInterface.php index a4dfa83..20618cb 100644 --- a/app/src/Application/HTTP/Response/ResourceInterface.php +++ b/app/src/Application/HTTP/Response/ResourceInterface.php @@ -5,11 +5,8 @@ namespace App\Application\HTTP\Response; use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\ServerRequestInterface; -interface ResourceInterface +interface ResourceInterface extends \JsonSerializable, \Stringable { - public function resolve(ServerRequestInterface $request): array; - - public function toResponse(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface; + public function toResponse(ResponseInterface $response): ResponseInterface; } diff --git a/app/src/Application/HTTP/Response/StatusResource.php b/app/src/Application/HTTP/Response/StatusResource.php new file mode 100644 index 0000000..69e6aa0 --- /dev/null +++ b/app/src/Application/HTTP/Response/StatusResource.php @@ -0,0 +1,20 @@ + $this->status, + ]; + } +} diff --git a/app/src/Application/HTTP/Response/ValidationResource.php b/app/src/Application/HTTP/Response/ValidationResource.php new file mode 100644 index 0000000..49684e8 --- /dev/null +++ b/app/src/Application/HTTP/Response/ValidationResource.php @@ -0,0 +1,36 @@ + $this->data->getMessage(), + 'code' => $this->getCode(), + 'errors' => $this->data->errors, + 'context' => $this->data->context, + ]; + } + + protected function getCode(): int + { + return $this->data->getCode(); + } +} diff --git a/app/src/Application/Kernel.php b/app/src/Application/Kernel.php new file mode 100644 index 0000000..34d6185 --- /dev/null +++ b/app/src/Application/Kernel.php @@ -0,0 +1,79 @@ + + */ + private array $collectors = []; + + public function __construct( + private readonly FactoryInterface $factory, + ) { + } + + public function register(CollectorInterface $collector): void + { + $this->collectors[] = $collector; + } + + public function get(): array + { + return $this->collectors; + } + + public function listen(\ReflectionClass $class): void + { + $this->register( + $this->factory->make($class->getName()), + ); + } + + public function finalize(): void + { + // do nothing + } +} diff --git a/app/src/Domain/Server/Collector/CollectorInterface.php b/app/src/Domain/Server/Collector/CollectorInterface.php new file mode 100644 index 0000000..9473c9d --- /dev/null +++ b/app/src/Domain/Server/Collector/CollectorInterface.php @@ -0,0 +1,15 @@ +collectors->get() as $collector) { + foreach ($this->servers->getServers() as $server) { + $plugins = $this->bus->ask(new PluginListQuery($server->name))->plugins; + + foreach ($plugins as $plugin) { + if ($collector->canCollect($plugin)) { + $collector->collect($server, $plugin); + } + } + } + } + } +} diff --git a/app/src/Domain/Server/Collector/DataCollectorRegistryInterface.php b/app/src/Domain/Server/Collector/DataCollectorRegistryInterface.php new file mode 100644 index 0000000..bfb1404 --- /dev/null +++ b/app/src/Domain/Server/Collector/DataCollectorRegistryInterface.php @@ -0,0 +1,13 @@ + + */ + public function get(): array; +} diff --git a/app/src/Domain/Server/Infrastructure/Cache/ServersRegistry.php b/app/src/Domain/Server/Infrastructure/Cache/ServersRegistry.php new file mode 100644 index 0000000..ae95de0 --- /dev/null +++ b/app/src/Domain/Server/Infrastructure/Cache/ServersRegistry.php @@ -0,0 +1,91 @@ + $servers + * @throws InvalidArgumentException + */ + public function __construct( + private CacheInterface $cache, + private ?string $default, + array $servers = [], + ) { + foreach ($servers as $name => $address) { + $this->addServer($name, $address); + } + } + + public function getDefault(): ?string + { + return $this->default; + } + + /** + * @throws InvalidArgumentException + */ + public function getServers(): array + { + return \array_values($this->getServersFromCache()); + } + + /** + * @throws InvalidArgumentException + */ + public function getServer(string $name): ?Server + { + $servers = $this->getServersFromCache(); + + return $servers[$name] ?? null; + } + + /** + * @throws InvalidArgumentException + */ + public function addServer(string $name, string $host): void + { + $servers = $this->getServersFromCache(); + $servers[$name] = new Server($name, $host); + $this->storeServers($servers); + } + + /** + * @return array + * @throws InvalidArgumentException + */ + private function getServersFromCache(): array + { + return \array_map( + static fn(array $server): Server => Server::fromArray($server), + $this->cache->get('servers', []), + ); + } + + /** + * @param Server[] $servers + * @throws InvalidArgumentException + */ + private function storeServers(array $servers): void + { + $this->cache->set( + 'servers', + \array_map(fn(Server $server): array => $server->jsonSerialize(), $servers), + ); + } +} diff --git a/app/src/Domain/Server/Service/ServersRegistryInterface.php b/app/src/Domain/Server/Service/ServersRegistryInterface.php new file mode 100644 index 0000000..826cf87 --- /dev/null +++ b/app/src/Domain/Server/Service/ServersRegistryInterface.php @@ -0,0 +1,20 @@ +input[$option]); + } + + public function getValue(string $option, mixed $default = null): mixed + { + return $this->input[$option] ?? $default; + } +} diff --git a/app/src/Infrastructure/RPC/RPCManager.php b/app/src/Infrastructure/RPC/RPCManager.php deleted file mode 100644 index b2f4c14..0000000 --- a/app/src/Infrastructure/RPC/RPCManager.php +++ /dev/null @@ -1,29 +0,0 @@ -registry->getServer($server) ?? new Server($server, $server); - - return new RPC( - $server->getRelay(), - $codec ?? new ProtobufCodec() - ); - } -} diff --git a/app/src/Infrastructure/RPC/RPCManagerInterface.php b/app/src/Infrastructure/RPC/RPCManagerInterface.php deleted file mode 100644 index e6381b7..0000000 --- a/app/src/Infrastructure/RPC/RPCManagerInterface.php +++ /dev/null @@ -1,13 +0,0 @@ - $address) { - $this->addServer($name, $address); - } - } - - public function getServers(): array - { - return \array_values($this->getServersFromCache()); - } - - public function getServer(string $name): ?Server - { - $servers = $this->getServersFromCache(); - - return $servers[$name] ?? null; - } - - public function addServer(string $name, string $host): void - { - $servers = $this->getServersFromCache(); - $servers[$name] = new Server($name, $host); - $this->storeServers($servers); - } - - /** - * @return array - */ - private function getServersFromCache(): array - { - return \array_map( - fn(array $server): Server => Server::fromArray($server), - $this->cache->get('servers', []), - ); - } - - private function storeServers(array $servers): void - { - $this->cache->set( - 'servers', - \array_map(fn(Server $server): array => $server->jsonSerialize(), $servers) - ); - } -} diff --git a/app/src/Infrastructure/RPC/ServersRegistryInterface.php b/app/src/Infrastructure/RPC/ServersRegistryInterface.php deleted file mode 100644 index 7067de1..0000000 --- a/app/src/Infrastructure/RPC/ServersRegistryInterface.php +++ /dev/null @@ -1,23 +0,0 @@ -withJsonCodec() + ->call('rpc.Config', true); + + return \json_decode(\base64_decode($config), true); + } + + /** + * Get RoadRunner server version. + * + * @return non-empty-string + */ + public function getVersion(): string + { + return (string)$this + ->withJsonCodec() + ->call('rpc.Version', true); + } + + /** + * Send add worker signal to given plugin. + * + * @param TPluginName $plugin + */ + public function addWorker(string $plugin): void + { + $this->withJsonCodec() + ->call('informer.AddWorker', $plugin); + } + + /** + * Send remove worker signal to given plugin. + * + * @param TPluginName $plugin + */ + public function removeWorker(string $plugin): void + { + $this->withJsonCodec() + ->call('informer.RemoveWorker', $plugin); + } + + /** + * Get list of plugins available for given server. + * + * @return array + */ + public function pluginList(): array + { + return (array)$this + ->withJsonCodec() + ->call('informer.List', null); + } + + /** + * Get list of plugins that can be reset (Workers can be reset) for given server. + * + * @return array + */ + public function resettablePluginList(): array + { + return (array)$this + ->withJsonCodec() + ->call('resetter.List', null); + } + + /** + * Send reset signal to all workers for given plugin. + * + * @param TPluginName $plugin + */ + public function resetPlugin(string $plugin): bool + { + return (bool)$this + ->withJsonCodec() + ->call('resetter.Reset', $plugin); + } + + /** + * Get list of worker pool for given plugin. + * + * @param TPluginName $plugin + * + * @return TPluginWorker[] + */ + public function pluginWorkers(string $plugin): array + { + $result = (array)$this + ->withJsonCodec() + ->call('informer.Workers', $plugin); + + return $result['workers'] ?? []; + } + + /** + * Send close signal to given TCP connection. + * + * @param non-empty-string $connectionUuid + */ + public function closeTcpConnection(string $connectionUuid): bool + { + return (bool)$this + ->withJsonCodec() + ->call('tcp.Close', $connectionUuid); + } + + /** + * Send pause signal to given Queue pipeline. + * + * @param non-empty-string $pipeline + */ + public function pauseQueuePipeline(string $pipeline): void + { + $this->withProtobufCodec()->call( + 'jobs.Pause', + new Pipelines([ + 'pipelines' => [$pipeline], + ]), + ); + } + + /** + * Send resume signal to given Queue pipeline. + * + * @param non-empty-string $pipeline + */ + public function resumeQueuePipeline(string $pipeline): void + { + $this->withProtobufCodec()->call( + 'jobs.Resume', + new Pipelines([ + 'pipelines' => [$pipeline], + ]), + ); + } + + /** + * Get list of declared Queue pipelines. + * + * @return TQueuePipeline[] + */ + public function queuePipelineList(): array + { + $stats = $this + ->withProtobufCodec() + ->call('jobs.Stat', '', Stats::class); + + $pipelines = []; + + foreach ($stats->getStats() as $stat) { + $pipelines[] = [ + 'pipeline' => $stat->getPipeline(), + 'driver' => $stat->getDriver(), + 'queue' => $stat->getQueue(), + 'priority' => $stat->getPriority(), + 'active' => $stat->getActive(), + 'delayed' => $stat->getDelayed(), + 'reserved' => $stat->getReserved(), + 'ready' => $stat->getReady(), + ]; + } + + return $pipelines; + } + + /** + * Invoke remove RoadRunner service method using given payload (free form). + * + * @param non-empty-string $method + */ + public function call(string $method, mixed $payload, mixed $options = null): mixed + { + return $this->rpc->call($method, $payload, $options); + } + + public function withJsonCodec(): self + { + $self = clone $this; + $self->rpc = $self->rpc->withCodec(new JsonCodec()); + + return $self; + } + + public function withProtobufCodec(): self + { + $self = clone $this; + $self->rpc = $self->rpc->withCodec(new ProtobufCodec()); + + return $self; + } + + public function getRpc(): RPCInterface + { + return $this->rpc; + } +} diff --git a/app/src/Infrastructure/RoadRunner/RPC/RPCManager.php b/app/src/Infrastructure/RoadRunner/RPC/RPCManager.php new file mode 100644 index 0000000..9ca452f --- /dev/null +++ b/app/src/Infrastructure/RoadRunner/RPC/RPCManager.php @@ -0,0 +1,30 @@ +servers->getServer($server) ?? new Server($server, $server); + + return new RPCClient( + rpc: new RPC($server->getRelay()), + server: $server, + ); + } +} diff --git a/app/src/Infrastructure/RoadRunner/RPC/RPCManagerInterface.php b/app/src/Infrastructure/RoadRunner/RPC/RPCManagerInterface.php new file mode 100644 index 0000000..70bbc0e --- /dev/null +++ b/app/src/Infrastructure/RoadRunner/RPC/RPCManagerInterface.php @@ -0,0 +1,22 @@ +[^:\/]+):\/\/(?P[^:]+)(:(?P[^:]+))?/'; private bool $hasError = false; - private readonly UriInterface $address; + public readonly UriInterface $address; + /** + * @param TName $name + * @param THost $address + */ public function __construct( - private readonly string $name, + public readonly string $name, string $address, ) { $this->address = new Uri($address); } - public function getName(): string - { - return $this->name; - } - - public function getAddress(): UriInterface - { - return $this->address; - } - public function hasError(): bool { return $this->hasError; @@ -51,8 +52,8 @@ public function getRelay(): RelayInterface : null; $socketType = $protocol === 'tcp' - ? SocketRelay::SOCK_TCP - : SocketRelay::SOCK_UNIX; + ? SocketType::TCP + : SocketType::UNIX; return new SocketRelay($match['arg1'], $port, $socketType); } @@ -63,6 +64,9 @@ public function notRespond(): self return $this; } + /** + * @return TServerArray + */ public function jsonSerialize(): array { return [ @@ -72,6 +76,9 @@ public function jsonSerialize(): array ]; } + /** + * @param TServerArray $data + */ public static function fromArray(array $data): self { $self = new self( diff --git a/app/src/Infrastructure/VictoriaMetrics/Client.php b/app/src/Infrastructure/VictoriaMetrics/Client.php index 61c9d37..b62d583 100644 --- a/app/src/Infrastructure/VictoriaMetrics/Client.php +++ b/app/src/Infrastructure/VictoriaMetrics/Client.php @@ -18,11 +18,11 @@ use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; -final class Client implements ClientInterface +final readonly class Client implements ClientInterface { public function __construct( - private readonly HttpClientInterface $writeClient, - private readonly HttpClientInterface $queryClient, + private HttpClientInterface $writeClient, + private HttpClientInterface $queryClient, ) { } @@ -108,7 +108,7 @@ public function query(string $metric, ?string $step = null, array $tags = [],): $response = $this->send('GET', 'api/v1/query', $query); if (!isset($response['result'][0])) { - return null; + return []; } $points = []; diff --git a/app/src/Infrastructure/VictoriaMetrics/ClientInterface.php b/app/src/Infrastructure/VictoriaMetrics/ClientInterface.php index 5643aa3..bb23f59 100644 --- a/app/src/Infrastructure/VictoriaMetrics/ClientInterface.php +++ b/app/src/Infrastructure/VictoriaMetrics/ClientInterface.php @@ -8,6 +8,7 @@ use App\Infrastructure\VictoriaMetrics\Payload\Range; use App\Infrastructure\VictoriaMetrics\Payload\Series; use App\Infrastructure\VictoriaMetrics\Payload\Tag; +use Carbon\Carbon; interface ClientInterface { @@ -35,9 +36,9 @@ public function query( */ public function queryRange( string $metric, - float $step, - \DateTimeInterface $start, - \DateTimeInterface $end, + float $step = 5, + \DateTimeInterface $start = new Carbon('-30 minutes'), + \DateTimeInterface $end = new Carbon(), array $tags = [], ): Range; @@ -48,7 +49,7 @@ public function queryRange( */ public function series( array $tags, - \DateTimeInterface $start, - \DateTimeInterface $end, + \DateTimeInterface $start = new Carbon('-5 minutes'), + \DateTimeInterface $end = new Carbon(), ): Series; } diff --git a/app/src/Interfaces/Centrifuge/ConnectService.php b/app/src/Interfaces/Centrifuge/ConnectService.php index dea5884..54b7c9b 100644 --- a/app/src/Interfaces/Centrifuge/ConnectService.php +++ b/app/src/Interfaces/Centrifuge/ConnectService.php @@ -4,23 +4,45 @@ namespace App\Interfaces\Centrifuge; +use App\Application\Centrifuge\Channel\Channel; +use App\Application\Centrifuge\Channel\PublicChannel; +use App\Application\Centrifuge\Channel\ServerChannel; +use App\Domain\Server\Service\ServersRepositoryInterface; +use Psr\Container\ContainerInterface; use RoadRunner\Centrifugo\Payload\ConnectResponse; use RoadRunner\Centrifugo\Request; use RoadRunner\Centrifugo\Request\RequestInterface; use Spiral\RoadRunnerBridge\Centrifugo\ServiceInterface; -class ConnectService implements ServiceInterface +final readonly class ConnectService implements ServiceInterface { + public function __construct( + private ContainerInterface $container, + ) { + } + /** * @param Request\Connect $request */ public function handle(RequestInterface $request): void { + $servers = $this->container->get(ServersRepositoryInterface::class); + + $channels = [new PublicChannel()]; + + foreach ($servers->getServers() as $server) { + $channels[] = new ServerChannel($server->name); + } + try { $request->respond( new ConnectResponse( - user: (string) $request->getAttribute('user_id') - ) + user: (string)$request->getAttribute('user_id'), + channels: \array_map( + static fn (Channel $channel) => (string) $channel, + $channels, + ) + ), ); } catch (\Throwable $e) { $request->error($e->getCode(), $e->getMessage()); diff --git a/app/src/Interfaces/Centrifuge/RPCService.php b/app/src/Interfaces/Centrifuge/RPCService.php index d232c5f..42606cb 100644 --- a/app/src/Interfaces/Centrifuge/RPCService.php +++ b/app/src/Interfaces/Centrifuge/RPCService.php @@ -12,11 +12,11 @@ use Spiral\Http\Http; use Spiral\RoadRunnerBridge\Centrifugo\ServiceInterface; -final class RPCService implements ServiceInterface +final readonly class RPCService implements ServiceInterface { public function __construct( - private readonly Http $http, - private readonly ServerRequestFactoryInterface $requestFactory, + private Http $http, + private ServerRequestFactoryInterface $requestFactory, ) { } @@ -65,7 +65,7 @@ public function createHttpRequest(Request\RPC $request): ServerRequestInterface // } return match ($method) { - 'GET', 'HEAD' => $httpRequest->withQueryParams($request->getData()), + 'GET', 'HEAD', 'POST', 'PUT', 'DELETE' => $httpRequest->withParsedBody($request->getData()), default => throw new \InvalidArgumentException('Unsupported method'), }; diff --git a/app/src/Interfaces/Centrifuge/SubscribeService.php b/app/src/Interfaces/Centrifuge/SubscribeService.php index fdca0c7..a1cdaa7 100644 --- a/app/src/Interfaces/Centrifuge/SubscribeService.php +++ b/app/src/Interfaces/Centrifuge/SubscribeService.php @@ -9,7 +9,7 @@ use RoadRunner\Centrifugo\Request\RequestInterface; use Spiral\RoadRunnerBridge\Centrifugo\ServiceInterface; -final class SubscribeService implements ServiceInterface +final readonly class SubscribeService implements ServiceInterface { /** * @param Request\Subscribe $request diff --git a/app/src/Interfaces/Console/CollectInformationCommand.php b/app/src/Interfaces/Console/CollectInformationCommand.php new file mode 100644 index 0000000..eb41dbd --- /dev/null +++ b/app/src/Interfaces/Console/CollectInformationCommand.php @@ -0,0 +1,55 @@ +runScope([ + InputInterface::class => new ConsoleInput($this->defineArguments()), + ], static fn() => $collector->collect()); + + $tries = 20; + } catch (\Throwable $e) { + $reporter->report($e); + $tries--; + } + + if ($tries === 0) { + return self::FAILURE; + } + + \usleep($this->period * 1000000); + } + + return self::SUCCESS; + } +} diff --git a/app/src/Interfaces/Console/TakeSnapshotsCommand.php b/app/src/Interfaces/Console/TakeSnapshotsCommand.php index 43bcaf6..0512105 100644 --- a/app/src/Interfaces/Console/TakeSnapshotsCommand.php +++ b/app/src/Interfaces/Console/TakeSnapshotsCommand.php @@ -12,14 +12,20 @@ use Butschster\Prometheus\Ast\MetricDataNode; use Psr\Log\LoggerInterface; use RoadRunner\Logger\Logger as RoadRunnerLogger; +use Spiral\Console\Attribute\AsCommand; +use Spiral\Console\Attribute\Option; use Spiral\Console\Command; use Spiral\Cqrs\CommandBusInterface; use Spiral\Cqrs\QueryBusInterface; +#[AsCommand( + name: 'take:snapshots', + description: 'Take snapshots of prometheus metrics for all RoadRunner instances' +)] final class TakeSnapshotsCommand extends Command { - protected const SIGNATURE = 'take:snapshots {--period=5}'; - protected const DESCRIPTION = 'Take snapshots of prometheus metrics for all RoadRunner instances'; + #[Option(description: 'Period of taking snapshots in seconds')] + public int $period = 5; public function __invoke( QueryBusInterface $queryBus, @@ -29,7 +35,7 @@ public function __invoke( ): int { while (true) { $servers = $queryBus->ask(new ListQuery()); - $period = (int)$this->option('period') ?? 5; + $period = $this->period; \assert($period >= 5); @@ -37,7 +43,7 @@ public function __invoke( $points = []; /** @var array $metrics */ - $metrics = $queryBus->ask(new GetMetricsQuery($server->getName())); + $metrics = $queryBus->ask(new GetMetricsQuery($server->name)); foreach ($metrics as $key => $metricNode) { foreach ($metricNode->metrics as $metric) { @@ -46,7 +52,7 @@ public function __invoke( $metric->value, ); - $point->addTag(new Tag('server', $server->getName())); + $point->addTag(new Tag('server', $server->name)); $point->addTag(new Tag('type', $metricNode->type)); foreach ($metric->labels as $label) { diff --git a/app/src/Interfaces/HTTP/Controller/Jobs/ListRequest.php b/app/src/Interfaces/HTTP/Controller/Jobs/ListRequest.php deleted file mode 100644 index d1d10c7..0000000 --- a/app/src/Interfaces/HTTP/Controller/Jobs/ListRequest.php +++ /dev/null @@ -1,11 +0,0 @@ -dispatch(new PauseCommand($request->server, $request->pipeline)); - - return [ - 'status' => true, - ]; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Jobs/PipelinesListAction.php b/app/src/Interfaces/HTTP/Controller/Jobs/PipelinesListAction.php deleted file mode 100644 index f13755c..0000000 --- a/app/src/Interfaces/HTTP/Controller/Jobs/PipelinesListAction.php +++ /dev/null @@ -1,21 +0,0 @@ -ask(new PipelineListQuery($request->server)) - ); - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Jobs/ResumeAction.php b/app/src/Interfaces/HTTP/Controller/Jobs/ResumeAction.php deleted file mode 100644 index 20c49f1..0000000 --- a/app/src/Interfaces/HTTP/Controller/Jobs/ResumeAction.php +++ /dev/null @@ -1,22 +0,0 @@ -dispatch(new ResumeCommand($request->server, $request->pipeline)); - - return [ - 'status' => true, - ]; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Metrics/MetricsRequest.php b/app/src/Interfaces/HTTP/Controller/Metrics/MetricsRequest.php deleted file mode 100644 index b7fe7ab..0000000 --- a/app/src/Interfaces/HTTP/Controller/Metrics/MetricsRequest.php +++ /dev/null @@ -1,11 +0,0 @@ - $bus->ask(new JobsQuery( - $request->server, - $request->plugin, - )), - ]; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Plugin/ListAction.php b/app/src/Interfaces/HTTP/Controller/Plugin/ListAction.php deleted file mode 100644 index 2bbcf6b..0000000 --- a/app/src/Interfaces/HTTP/Controller/Plugin/ListAction.php +++ /dev/null @@ -1,23 +0,0 @@ -ask(new ListQuery($request->server)) - ); - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Plugin/ListRequest.php b/app/src/Interfaces/HTTP/Controller/Plugin/ListRequest.php deleted file mode 100644 index 4116024..0000000 --- a/app/src/Interfaces/HTTP/Controller/Plugin/ListRequest.php +++ /dev/null @@ -1,12 +0,0 @@ - $this->data['name'], - 'is_ressetable' => $this->data['is_ressetable'], - 'workers' => (new WorkerCollection($this->data['workers']))->resolve($request), - ]; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Plugin/WorkerCollection.php b/app/src/Interfaces/HTTP/Controller/Plugin/WorkerCollection.php deleted file mode 100644 index 4a05cc0..0000000 --- a/app/src/Interfaces/HTTP/Controller/Plugin/WorkerCollection.php +++ /dev/null @@ -1,15 +0,0 @@ -data; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Plugin/WorkersAction.php b/app/src/Interfaces/HTTP/Controller/Plugin/WorkersAction.php deleted file mode 100644 index 8e01af4..0000000 --- a/app/src/Interfaces/HTTP/Controller/Plugin/WorkersAction.php +++ /dev/null @@ -1,28 +0,0 @@ -ask( - new WorkersQuery( - $request->server, - $request->plugin, - ) - ) - ); - } -} diff --git a/app/src/Interfaces/HTTP/Controller/RoadRunner/GetConfigAction.php b/app/src/Interfaces/HTTP/Controller/RoadRunner/GetConfigAction.php deleted file mode 100644 index 4d38f75..0000000 --- a/app/src/Interfaces/HTTP/Controller/RoadRunner/GetConfigAction.php +++ /dev/null @@ -1,20 +0,0 @@ - $bus->ask(new GetConfigQuery($request->server)) - ]; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/RoadRunner/GetRequest.php b/app/src/Interfaces/HTTP/Controller/RoadRunner/GetRequest.php deleted file mode 100644 index afbf344..0000000 --- a/app/src/Interfaces/HTTP/Controller/RoadRunner/GetRequest.php +++ /dev/null @@ -1,12 +0,0 @@ -ask(new GetVersionQuery($request->server)) - ); - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Server/ListAction.php b/app/src/Interfaces/HTTP/Controller/Server/ListAction.php deleted file mode 100644 index fc25f46..0000000 --- a/app/src/Interfaces/HTTP/Controller/Server/ListAction.php +++ /dev/null @@ -1,22 +0,0 @@ - $config->getDefaultServer(), - 'data' => $bus->ask(new ListQuery()), - ]; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Server/RegisterAction.php b/app/src/Interfaces/HTTP/Controller/Server/RegisterAction.php deleted file mode 100644 index 6c390c9..0000000 --- a/app/src/Interfaces/HTTP/Controller/Server/RegisterAction.php +++ /dev/null @@ -1,27 +0,0 @@ -dispatch( - new RegisterCommand( - name: $request->name, - address: $request->address - ) - ); - - return [ - 'status' => true, - ]; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Service/CreateAction.php b/app/src/Interfaces/HTTP/Controller/Service/CreateAction.php deleted file mode 100644 index 52a6eb4..0000000 --- a/app/src/Interfaces/HTTP/Controller/Service/CreateAction.php +++ /dev/null @@ -1,31 +0,0 @@ - $bus->dispatch( - new CreateCommand( - server: $request->server, - name: $request->name, - command: $request->command, - processNum: $request->processNum, - execTimeout: $request->execTimeout, - remainAfterExit: $request->remainAfterExit, - env: $request->env, - restartSec: $request->restartSec - ) - ), - ]; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Service/ListRequest.php b/app/src/Interfaces/HTTP/Controller/Service/ListRequest.php deleted file mode 100644 index 5eb8693..0000000 --- a/app/src/Interfaces/HTTP/Controller/Service/ListRequest.php +++ /dev/null @@ -1,11 +0,0 @@ - $bus->dispatch(new RestartCommand($request->server, $request->service)), - ]; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Service/StatusAction.php b/app/src/Interfaces/HTTP/Controller/Service/StatusAction.php deleted file mode 100644 index 18ab7cd..0000000 --- a/app/src/Interfaces/HTTP/Controller/Service/StatusAction.php +++ /dev/null @@ -1,20 +0,0 @@ - $bus->ask(new StatusQuery($request->server, $request->service)), - ]; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Service/TerminateAction.php b/app/src/Interfaces/HTTP/Controller/Service/TerminateAction.php deleted file mode 100644 index 30966fe..0000000 --- a/app/src/Interfaces/HTTP/Controller/Service/TerminateAction.php +++ /dev/null @@ -1,20 +0,0 @@ - $bus->dispatch(new TerminateCommand($request->server, $request->service)), - ]; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Settings/GetAction.php b/app/src/Interfaces/HTTP/Controller/Settings/GetAction.php deleted file mode 100644 index f06909a..0000000 --- a/app/src/Interfaces/HTTP/Controller/Settings/GetAction.php +++ /dev/null @@ -1,20 +0,0 @@ - $bus->ask(new GetQuery()), - ]; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/Settings/StoreAction.php b/app/src/Interfaces/HTTP/Controller/Settings/StoreAction.php deleted file mode 100644 index 1b44e49..0000000 --- a/app/src/Interfaces/HTTP/Controller/Settings/StoreAction.php +++ /dev/null @@ -1,22 +0,0 @@ -dispatch(new StoreCommand($request->settings)); - - return [ - 'status' => true, - ]; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/TCP/CloseConnectionAction.php b/app/src/Interfaces/HTTP/Controller/TCP/CloseConnectionAction.php deleted file mode 100644 index 138739e..0000000 --- a/app/src/Interfaces/HTTP/Controller/TCP/CloseConnectionAction.php +++ /dev/null @@ -1,23 +0,0 @@ - $bus->dispatch(new CloseCommand( - $request->server, - $request->uuid - )) - ]; - } -} diff --git a/app/src/Interfaces/HTTP/Controller/v1/Jobs/Pipeline/ListAction.php b/app/src/Interfaces/HTTP/Controller/v1/Jobs/Pipeline/ListAction.php new file mode 100644 index 0000000..d2409c8 --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Jobs/Pipeline/ListAction.php @@ -0,0 +1,31 @@ +ask(new PipelineListQuery($request->server)); + + return new PipelineCollection( + $this->schema->create($result->pipelines), + ); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/v1/Jobs/Pipeline/PauseAction.php b/app/src/Interfaces/HTTP/Controller/v1/Jobs/Pipeline/PauseAction.php new file mode 100644 index 0000000..11bc992 --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Jobs/Pipeline/PauseAction.php @@ -0,0 +1,23 @@ +dispatch(new PauseCommand($request->server, $request->pipeline)); + + return new StatusResource(status: $result->status); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/v1/Jobs/Pipeline/ResumeAction.php b/app/src/Interfaces/HTTP/Controller/v1/Jobs/Pipeline/ResumeAction.php new file mode 100644 index 0000000..0235c58 --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Jobs/Pipeline/ResumeAction.php @@ -0,0 +1,23 @@ +dispatch(new ResumeCommand($request->server, $request->pipeline)); + + return new StatusResource(status: $result->status); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/Metrics/GetByKeyAction.php b/app/src/Interfaces/HTTP/Controller/v1/Metrics/GetByKeyAction.php similarity index 86% rename from app/src/Interfaces/HTTP/Controller/Metrics/GetByKeyAction.php rename to app/src/Interfaces/HTTP/Controller/v1/Metrics/GetByKeyAction.php index 28a9acb..6a2dac1 100644 --- a/app/src/Interfaces/HTTP/Controller/Metrics/GetByKeyAction.php +++ b/app/src/Interfaces/HTTP/Controller/v1/Metrics/GetByKeyAction.php @@ -2,10 +2,11 @@ declare(strict_types=1); -namespace App\Interfaces\HTTP\Controller\Metrics; +namespace App\Interfaces\HTTP\Controller\v1\Metrics; use App\Application\Command\Metrics\GetByKeyQuery; use App\Infrastructure\VictoriaMetrics\Payload\Tag; +use App\Interfaces\HTTP\Filter\v1\Metrics\MetricsByKeyRequest; use Spiral\Cqrs\QueryBusInterface; use Spiral\Router\Annotation\Route; diff --git a/app/src/Interfaces/HTTP/Controller/Metrics/GetMetricsAction.php b/app/src/Interfaces/HTTP/Controller/v1/Metrics/GetMetricsAction.php similarity index 73% rename from app/src/Interfaces/HTTP/Controller/Metrics/GetMetricsAction.php rename to app/src/Interfaces/HTTP/Controller/v1/Metrics/GetMetricsAction.php index b980d4b..283a8be 100644 --- a/app/src/Interfaces/HTTP/Controller/Metrics/GetMetricsAction.php +++ b/app/src/Interfaces/HTTP/Controller/v1/Metrics/GetMetricsAction.php @@ -2,10 +2,13 @@ declare(strict_types=1); -namespace App\Interfaces\HTTP\Controller\Metrics; +namespace App\Interfaces\HTTP\Controller\v1\Metrics; use App\Application\Command\Metrics\GetAvailableMetricsQuery; use App\Application\HTTP\Response\ResourceInterface; +use App\Interfaces\HTTP\Filter\v1\Metrics\MetricsRequest; +use App\Interfaces\HTTP\Resource\v1\Metrics\MetricResource; +use App\Interfaces\HTTP\Resource\v1\Metrics\MetricsCollection; use Spiral\Cqrs\QueryBusInterface; use Spiral\Router\Annotation\Route; diff --git a/app/src/Interfaces/HTTP/Controller/Metrics/GetRangeByKeyAction.php b/app/src/Interfaces/HTTP/Controller/v1/Metrics/GetRangeByKeyAction.php similarity index 87% rename from app/src/Interfaces/HTTP/Controller/Metrics/GetRangeByKeyAction.php rename to app/src/Interfaces/HTTP/Controller/v1/Metrics/GetRangeByKeyAction.php index a7de723..b31579b 100644 --- a/app/src/Interfaces/HTTP/Controller/Metrics/GetRangeByKeyAction.php +++ b/app/src/Interfaces/HTTP/Controller/v1/Metrics/GetRangeByKeyAction.php @@ -2,10 +2,11 @@ declare(strict_types=1); -namespace App\Interfaces\HTTP\Controller\Metrics; +namespace App\Interfaces\HTTP\Controller\v1\Metrics; use App\Application\Command\Metrics\GetRangeByKeyQuery; use App\Infrastructure\VictoriaMetrics\Payload\Tag; +use App\Interfaces\HTTP\Filter\v1\Metrics\MetricsByKeyRequest; use Spiral\Cqrs\QueryBusInterface; use Spiral\Router\Annotation\Route; diff --git a/app/src/Interfaces/HTTP/Controller/v1/Plugin/ListAction.php b/app/src/Interfaces/HTTP/Controller/v1/Plugin/ListAction.php new file mode 100644 index 0000000..154a91c --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Plugin/ListAction.php @@ -0,0 +1,38 @@ +jsonSerialize(); + $plugin['workers'] = $this->workersSchema->create($plugin['workers']); + return $plugin; + }, $bus->ask(new PluginListQuery($request->server))->plugins); + + return new PluginCollection( + $this->plugins->create($plugins), + ); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/Plugin/ResetAction.php b/app/src/Interfaces/HTTP/Controller/v1/Plugin/ResetAction.php similarity index 82% rename from app/src/Interfaces/HTTP/Controller/Plugin/ResetAction.php rename to app/src/Interfaces/HTTP/Controller/v1/Plugin/ResetAction.php index 256255c..6c91079 100644 --- a/app/src/Interfaces/HTTP/Controller/Plugin/ResetAction.php +++ b/app/src/Interfaces/HTTP/Controller/v1/Plugin/ResetAction.php @@ -2,9 +2,10 @@ declare(strict_types=1); -namespace App\Interfaces\HTTP\Controller\Plugin; +namespace App\Interfaces\HTTP\Controller\v1\Plugin; use App\Application\Command\Resetter\ResetCommand; +use App\Interfaces\HTTP\Filter\v1\Plugin\ResetRequest; use Spiral\Cqrs\CommandBusInterface; use Spiral\Router\Annotation\Route; diff --git a/app/src/Interfaces/HTTP/Controller/v1/Plugin/Worker/AddAction.php b/app/src/Interfaces/HTTP/Controller/v1/Plugin/Worker/AddAction.php new file mode 100644 index 0000000..260ed29 --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Plugin/Worker/AddAction.php @@ -0,0 +1,23 @@ +dispatch(new AddWorkerCommand($request->server, $request->plugin)); + + return new StatusResource(status: $result->status); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/v1/Plugin/Worker/ListAction.php b/app/src/Interfaces/HTTP/Controller/v1/Plugin/Worker/ListAction.php new file mode 100644 index 0000000..53ff497 --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Plugin/Worker/ListAction.php @@ -0,0 +1,37 @@ +ask( + new WorkersQuery( + $request->server, + $request->plugin, + ), + ); + + return new WorkerCollection( + data: $this->schema->create($workers->workers), + plugin: $request->plugin + ); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/v1/Plugin/Worker/RemoveAction.php b/app/src/Interfaces/HTTP/Controller/v1/Plugin/Worker/RemoveAction.php new file mode 100644 index 0000000..5cb9152 --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Plugin/Worker/RemoveAction.php @@ -0,0 +1,23 @@ +dispatch(new RemoveWorkerCommand($request->server, $request->plugin)); + + return new StatusResource(status: $result->status); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/v1/Server/GetConfigAction.php b/app/src/Interfaces/HTTP/Controller/v1/Server/GetConfigAction.php new file mode 100644 index 0000000..2ce423c --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Server/GetConfigAction.php @@ -0,0 +1,23 @@ + $bus->ask(new GetConfigQuery($request->server))->config, + ]); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/v1/Server/GetVersionAction.php b/app/src/Interfaces/HTTP/Controller/v1/Server/GetVersionAction.php new file mode 100644 index 0000000..3b18674 --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Server/GetVersionAction.php @@ -0,0 +1,25 @@ + [ + 'version' => $bus->ask(new GetVersionQuery($request->server))->version, + ], + ]); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/v1/Server/ListAction.php b/app/src/Interfaces/HTTP/Controller/v1/Server/ListAction.php new file mode 100644 index 0000000..3b702a9 --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Server/ListAction.php @@ -0,0 +1,27 @@ +ask(new ListQuery()); + $default = $bus->ask(new DefaultServerQuery()); + + return new ServerCollection( + servers: $result->servers, + default: $default->server, + ); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/v1/Server/RegisterAction.php b/app/src/Interfaces/HTTP/Controller/v1/Server/RegisterAction.php new file mode 100644 index 0000000..21abb72 --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Server/RegisterAction.php @@ -0,0 +1,28 @@ +dispatch( + new RegisterCommand( + name: $request->name, + address: $request->address, + ), + ); + + return new StatusResource(status: $result->status); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/Service/ListAction.php b/app/src/Interfaces/HTTP/Controller/v1/Service/ListAction.php similarity index 56% rename from app/src/Interfaces/HTTP/Controller/Service/ListAction.php rename to app/src/Interfaces/HTTP/Controller/v1/Service/ListAction.php index d5fdbac..f10b234 100644 --- a/app/src/Interfaces/HTTP/Controller/Service/ListAction.php +++ b/app/src/Interfaces/HTTP/Controller/v1/Service/ListAction.php @@ -2,19 +2,22 @@ declare(strict_types=1); -namespace App\Interfaces\HTTP\Controller\Service; +namespace App\Interfaces\HTTP\Controller\v1\Service; use App\Application\Command\Service\ListQuery; +use App\Application\HTTP\Response\JsonResource; +use App\Application\HTTP\Response\ResourceInterface; +use App\Interfaces\HTTP\Filter\v1\Service\ListRequest; use Spiral\Cqrs\QueryBusInterface; use Spiral\Router\Annotation\Route; final class ListAction { #[Route('services', name: 'service.list', methods: 'GET')] - public function __invoke(QueryBusInterface $bus, ListRequest $request): array + public function __invoke(QueryBusInterface $bus, ListRequest $request): ResourceInterface { - return [ - 'data' => $bus->ask(new ListQuery($request->server)), - ]; + return new JsonResource([ + 'data' => $bus->ask(new ListQuery($request->server))->services, + ]); } } diff --git a/app/src/Interfaces/HTTP/Controller/v1/Service/RestartAction.php b/app/src/Interfaces/HTTP/Controller/v1/Service/RestartAction.php new file mode 100644 index 0000000..39bf59e --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Service/RestartAction.php @@ -0,0 +1,23 @@ +dispatch(new RestartCommand($request->server, $request->service)); + + return new StatusResource(status: $result->status); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/v1/Service/StatusAction.php b/app/src/Interfaces/HTTP/Controller/v1/Service/StatusAction.php new file mode 100644 index 0000000..e203e0c --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Service/StatusAction.php @@ -0,0 +1,23 @@ +ask(new StatusQuery($request->server, $request->service)); + + return new StatusCollection($result->statuses); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/v1/Service/TerminateAction.php b/app/src/Interfaces/HTTP/Controller/v1/Service/TerminateAction.php new file mode 100644 index 0000000..0d44fba --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Service/TerminateAction.php @@ -0,0 +1,23 @@ +dispatch(new TerminateCommand($request->server, $request->service)); + + return new StatusResource(status: $result->status); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/v1/Settings/GetAction.php b/app/src/Interfaces/HTTP/Controller/v1/Settings/GetAction.php new file mode 100644 index 0000000..100a86f --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Settings/GetAction.php @@ -0,0 +1,22 @@ + $bus->ask(new GetQuery()), + ]); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/v1/Settings/StoreAction.php b/app/src/Interfaces/HTTP/Controller/v1/Settings/StoreAction.php new file mode 100644 index 0000000..37a2864 --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/Settings/StoreAction.php @@ -0,0 +1,23 @@ +dispatch(new StoreCommand($request->settings)); + + return new StatusResource(status: $result->status); + } +} diff --git a/app/src/Interfaces/HTTP/Controller/v1/TCP/CloseConnectionAction.php b/app/src/Interfaces/HTTP/Controller/v1/TCP/CloseConnectionAction.php new file mode 100644 index 0000000..62f659c --- /dev/null +++ b/app/src/Interfaces/HTTP/Controller/v1/TCP/CloseConnectionAction.php @@ -0,0 +1,28 @@ +dispatch( + new CloseCommand( + $request->server, + $request->uuid, + ), + )->status + ); + } +} diff --git a/app/src/Module/Jobs/Schema/PipelinesSchema.php b/app/src/Interfaces/HTTP/DataGrid/v1/Jobs/PipelinesSchema.php similarity index 79% rename from app/src/Module/Jobs/Schema/PipelinesSchema.php rename to app/src/Interfaces/HTTP/DataGrid/v1/Jobs/PipelinesSchema.php index 0383c95..b30c858 100644 --- a/app/src/Module/Jobs/Schema/PipelinesSchema.php +++ b/app/src/Interfaces/HTTP/DataGrid/v1/Jobs/PipelinesSchema.php @@ -2,11 +2,10 @@ declare(strict_types=1); -namespace App\Module\Jobs\Schema; +namespace App\Interfaces\HTTP\DataGrid\v1\Jobs; use Doctrine\Common\Collections\ArrayCollection; use Spiral\DataGrid\GridFactory; -use Spiral\DataGrid\GridFactoryInterface; use Spiral\DataGrid\GridInterface; use Spiral\DataGrid\GridSchema; use Spiral\DataGrid\Specification\Filter\Equals; @@ -18,10 +17,10 @@ final class PipelinesSchema extends GridSchema { public function __construct( - private readonly GridFactoryInterface $factory, + private readonly GridFactory $factory, private readonly GridSchema $schema ) { - $this->schema->addSorter('name', new Sorter('name')); + $this->schema->addSorter('pipeline', new Sorter('pipeline')); $this->schema->addSorter('priority', new Sorter('priority')); $this->schema->addFilter('driver', new Equals('driver', new StringValue())); $this->schema->addFilter('active', new Equals('active', new BoolValue())); @@ -30,7 +29,7 @@ public function __construct( public function create(array $data): GridInterface { return $this->factory->withDefaults([ - GridFactory::KEY_SORT => ['name' => SorterInterface::ASC], + GridFactory::KEY_SORT => ['pipeline' => SorterInterface::ASC], ])->create( new ArrayCollection($data), $this->schema diff --git a/app/src/Module/Informer/Schema/PluginsSchema.php b/app/src/Interfaces/HTTP/DataGrid/v1/Plugin/PluginsSchema.php similarity index 79% rename from app/src/Module/Informer/Schema/PluginsSchema.php rename to app/src/Interfaces/HTTP/DataGrid/v1/Plugin/PluginsSchema.php index a188659..4c2cb90 100644 --- a/app/src/Module/Informer/Schema/PluginsSchema.php +++ b/app/src/Interfaces/HTTP/DataGrid/v1/Plugin/PluginsSchema.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace App\Module\Informer\Schema; +namespace App\Interfaces\HTTP\DataGrid\v1\Plugin; +use App\Module\Informer\DTO\Plugin; use Doctrine\Common\Collections\ArrayCollection; use Spiral\DataGrid\GridFactory; -use Spiral\DataGrid\GridFactoryInterface; use Spiral\DataGrid\GridInterface; use Spiral\DataGrid\GridSchema; use Spiral\DataGrid\Specification\Filter\Equals; @@ -17,11 +17,11 @@ final class PluginsSchema extends GridSchema { public function __construct( - private readonly GridFactoryInterface $factory, + private readonly GridFactory $factory, private readonly GridSchema $schema ) { $this->schema->addSorter('name', new Sorter('name')); - $this->schema->addFilter('ressetable', new Equals('is_ressetable', new BoolValue())); + $this->schema->addFilter('resettable', new Equals('is_resettable', new BoolValue())); } public function create(array $data): GridInterface diff --git a/app/src/Module/Informer/Schema/WorkersSchema.php b/app/src/Interfaces/HTTP/DataGrid/v1/Plugin/WorkersSchema.php similarity index 88% rename from app/src/Module/Informer/Schema/WorkersSchema.php rename to app/src/Interfaces/HTTP/DataGrid/v1/Plugin/WorkersSchema.php index 48f728e..54a7c56 100644 --- a/app/src/Module/Informer/Schema/WorkersSchema.php +++ b/app/src/Interfaces/HTTP/DataGrid/v1/Plugin/WorkersSchema.php @@ -2,11 +2,10 @@ declare(strict_types=1); -namespace App\Module\Informer\Schema; +namespace App\Interfaces\HTTP\DataGrid\v1\Plugin; use Doctrine\Common\Collections\ArrayCollection; use Spiral\DataGrid\GridFactory; -use Spiral\DataGrid\GridFactoryInterface; use Spiral\DataGrid\GridInterface; use Spiral\DataGrid\GridSchema; use Spiral\DataGrid\Specification\Filter\Equals; @@ -17,7 +16,7 @@ final class WorkersSchema extends GridSchema { public function __construct( - private readonly GridFactoryInterface $factory, + private readonly GridFactory $factory, private readonly GridSchema $schema ) { $this->schema->addSorter('pid', new Sorter('pid')); diff --git a/app/src/Interfaces/HTTP/Controller/AbstractServerFilter.php b/app/src/Interfaces/HTTP/Filter/v1/AbstractServerFilter.php similarity index 67% rename from app/src/Interfaces/HTTP/Controller/AbstractServerFilter.php rename to app/src/Interfaces/HTTP/Filter/v1/AbstractServerFilter.php index c9d6df3..12617f7 100644 --- a/app/src/Interfaces/HTTP/Controller/AbstractServerFilter.php +++ b/app/src/Interfaces/HTTP/Filter/v1/AbstractServerFilter.php @@ -2,10 +2,11 @@ declare(strict_types=1); -namespace App\Interfaces\HTTP\Controller; +namespace App\Interfaces\HTTP\Filter\v1; -use App\Infrastructure\RPC\ServersRegistryInterface; -use App\Infrastructure\RPC\ValueObject\Server; +use App\Domain\Server\Service\ServersRepositoryInterface; +use App\Infrastructure\RoadRunner\RPC\ValueObject\Server; +use Spiral\Filters\Attribute\Input\Data; use Spiral\Filters\Attribute\Input\Query; use Spiral\Filters\Model\Filter; use Spiral\Filters\Model\FilterDefinitionInterface; @@ -14,21 +15,21 @@ abstract class AbstractServerFilter extends Filter implements HasFilterDefinition { + #[Data] + public string $server; + public function __construct( - private readonly ServersRegistryInterface $registry + private readonly ServersRepositoryInterface $servers, ) { } - #[Query] - public string $server; - protected function getValidationRules(): array { return [ 'server' => $this->serverRules( \array_map( - fn(Server $server): string => $server->getName(), - $this->registry->getServers(), + fn(Server $server): string => $server->name, + $this->servers->getServers(), ), ), ]; @@ -41,6 +42,6 @@ public function filterDefinition(): FilterDefinitionInterface protected function serverRules(array $serversNames): array { - return ['required', 'string', ['in_array', $serversNames, true, 'error' => 'Invalid service.'],]; + return ['required', 'string', ['in_array', $serversNames, true, 'error' => 'Server is not registered.'],]; } } diff --git a/app/src/Interfaces/HTTP/Filter/v1/Informer/WorkerManagerRequest.php b/app/src/Interfaces/HTTP/Filter/v1/Informer/WorkerManagerRequest.php new file mode 100644 index 0000000..f903985 --- /dev/null +++ b/app/src/Interfaces/HTTP/Filter/v1/Informer/WorkerManagerRequest.php @@ -0,0 +1,25 @@ + $this->data['name'], + 'is_resettable' => $this->data['is_resettable'], + 'workers' => new WorkerCollection( + $this->data['workers'], + $this->data['name'] + ), + ]; + } +} diff --git a/app/src/Interfaces/HTTP/Resource/v1/Plugin/WorkerCollection.php b/app/src/Interfaces/HTTP/Resource/v1/Plugin/WorkerCollection.php new file mode 100644 index 0000000..1c552ce --- /dev/null +++ b/app/src/Interfaces/HTTP/Resource/v1/Plugin/WorkerCollection.php @@ -0,0 +1,15 @@ + $this->plugin, + ...$this->data->jsonSerialize(), + ]; + } +} diff --git a/app/src/Interfaces/HTTP/Resource/v1/Server/ServerCollection.php b/app/src/Interfaces/HTTP/Resource/v1/Server/ServerCollection.php new file mode 100644 index 0000000..3bc9d4a --- /dev/null +++ b/app/src/Interfaces/HTTP/Resource/v1/Server/ServerCollection.php @@ -0,0 +1,24 @@ +default; + + return $data; + } +} diff --git a/app/src/Interfaces/HTTP/Resource/v1/Server/ServerResource.php b/app/src/Interfaces/HTTP/Resource/v1/Server/ServerResource.php new file mode 100644 index 0000000..ead825b --- /dev/null +++ b/app/src/Interfaces/HTTP/Resource/v1/Server/ServerResource.php @@ -0,0 +1,17 @@ + $this->data['name'], + 'statuses' => new StatusCollection($this->data['statuses']), + ]; + } +} diff --git a/app/src/Interfaces/HTTP/Resource/v1/Service/ServicesCollection.php b/app/src/Interfaces/HTTP/Resource/v1/Service/ServicesCollection.php new file mode 100644 index 0000000..0fc34d0 --- /dev/null +++ b/app/src/Interfaces/HTTP/Resource/v1/Service/ServicesCollection.php @@ -0,0 +1,17 @@ +data; + } +} diff --git a/app/src/Module/Informer/Command/AddWorkerHandler.php b/app/src/Module/Informer/Command/AddWorkerHandler.php new file mode 100644 index 0000000..057a4d4 --- /dev/null +++ b/app/src/Module/Informer/Command/AddWorkerHandler.php @@ -0,0 +1,38 @@ +rpc->connect($command->server)->addWorker($command->plugin); + $status = true; + } catch (\Throwable $e) { + $this->reporter->report($e); + $status = false; + } + + return new AddWorkerResult( + server: $command->server, + plugin: $command->plugin, + status: $status, + ); + } +} diff --git a/app/src/Module/Informer/Command/JobsHandler.php b/app/src/Module/Informer/Command/JobsHandler.php deleted file mode 100644 index e13a0df..0000000 --- a/app/src/Module/Informer/Command/JobsHandler.php +++ /dev/null @@ -1,29 +0,0 @@ -rpc->getServer($query->server, new JsonCodec()); - - return (array) $rpc->call('informer.Jobs', $query->plugin); - } -} diff --git a/app/src/Module/Informer/Command/ListHandler.php b/app/src/Module/Informer/Command/ListHandler.php index a280ef4..8b26b8f 100644 --- a/app/src/Module/Informer/Command/ListHandler.php +++ b/app/src/Module/Informer/Command/ListHandler.php @@ -4,38 +4,37 @@ namespace App\Module\Informer\Command; -use App\Application\Command\Informer\ListQuery; +use App\Application\Command\Informer\DTO\PluginListResult; +use App\Application\Command\Informer\PluginListQuery; use App\Application\Command\Informer\WorkersQuery; -use App\Infrastructure\RPC\RPCManagerInterface; -use App\Module\Informer\Schema\PluginsSchema; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; +use App\Module\Informer\DTO\Plugin; use Spiral\Cqrs\Attribute\QueryHandler; use Spiral\Cqrs\QueryBusInterface; -use Spiral\DataGrid\GridInterface; -use Spiral\Goridge\RPC\Codec\JsonCodec; -final class ListHandler +final readonly class ListHandler { public function __construct( - private readonly RPCManagerInterface $rpc, - private readonly QueryBusInterface $queryBus, - private readonly PluginsSchema $schema + private RPCManagerInterface $rpc, + private QueryBusInterface $queryBus, ) { } #[QueryHandler] - public function __invoke(ListQuery $query): GridInterface + public function __invoke(PluginListQuery $query): PluginListResult { - $rpc = $this->rpc->getServer($query->server, new JsonCodec()); + $rpc = $this->rpc->connect($query->server); - $plugins = $rpc->call('informer.List', null); - $resettablePlugins = $rpc->call('resetter.List', null); + $plugins = $rpc->pluginList(); + $resettablePlugins = $rpc->resettablePluginList(); - return $this->schema->create( - \array_map(fn(string $plugin): array => [ - 'name' => $plugin, - 'is_ressetable' => \in_array($plugin, $resettablePlugins, true), - 'workers' => $this->queryBus->ask(new WorkersQuery($query->server, $plugin)), - ], $plugins) + return new PluginListResult( + server: $query->server, + plugins: \array_map(fn(string $plugin): Plugin => new Plugin( + name: $plugin, + isResettable: \in_array($plugin, $resettablePlugins, true), + workers: $this->queryBus->ask(new WorkersQuery($query->server, $plugin))->workers, + ), $plugins), ); } } diff --git a/app/src/Module/Informer/Command/RemoveWorkerHandler.php b/app/src/Module/Informer/Command/RemoveWorkerHandler.php new file mode 100644 index 0000000..23877eb --- /dev/null +++ b/app/src/Module/Informer/Command/RemoveWorkerHandler.php @@ -0,0 +1,38 @@ +rpc->connect($command->server)->removeWorker($command->plugin); + $status = true; + } catch (\Throwable $e) { + $this->reporter->report($e); + $status = false; + } + + return new RemoveWorkerResult( + server: $command->server, + plugin: $command->plugin, + status: $status, + ); + } +} diff --git a/app/src/Module/Informer/Command/WorkersHandler.php b/app/src/Module/Informer/Command/WorkersHandler.php index 0390662..f1f8e03 100644 --- a/app/src/Module/Informer/Command/WorkersHandler.php +++ b/app/src/Module/Informer/Command/WorkersHandler.php @@ -4,28 +4,39 @@ namespace App\Module\Informer\Command; +use App\Application\Command\Informer\DTO\WorkersResult; use App\Application\Command\Informer\WorkersQuery; -use App\Infrastructure\RPC\RPCManagerInterface; -use App\Module\Informer\Schema\WorkersSchema; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; +use App\Module\Informer\DTO\Worker; +use Carbon\Carbon; use Spiral\Cqrs\Attribute\QueryHandler; -use Spiral\DataGrid\GridInterface; -use Spiral\Goridge\RPC\Codec\JsonCodec; -final class WorkersHandler +final readonly class WorkersHandler { public function __construct( - private readonly RPCManagerInterface $rpc, - private readonly WorkersSchema $schema, + private RPCManagerInterface $rpc, ) { } #[QueryHandler] - public function __invoke(WorkersQuery $query): GridInterface + public function __invoke(WorkersQuery $query): WorkersResult { - $rpc = $this->rpc->getServer($query->server, new JsonCodec()); - - return $this->schema->create( - $rpc->call('informer.Workers', $query->plugin)['workers'] ?? [] + return new WorkersResult( + server: $query->server, + plugin: $query->plugin, + workers: \array_map( + fn(array $worker): Worker => new Worker( + cpuPercent: (float)$worker['CPUPercent'], + command: $worker['command'], + createdAt: Carbon::createFromTimestampMs((int)($worker['created'] / 1_000_000)), + memoryUsage: $worker['memoryUsage'], + pid: (int)$worker['pid'], + numExecs: (int)$worker['numExecs'], + status: (int)$worker['status'], + statusString: $worker['statusStr'], + ), + $this->rpc->connect($query->server)->pluginWorkers($query->plugin), + ), ); } } diff --git a/app/src/Module/Informer/DTO/Plugin.php b/app/src/Module/Informer/DTO/Plugin.php new file mode 100644 index 0000000..66cc389 --- /dev/null +++ b/app/src/Module/Informer/DTO/Plugin.php @@ -0,0 +1,33 @@ +jsonSerialize()); + } + + public function jsonSerialize(): array + { + return [ + 'name' => $this->name, + 'is_resettable' => $this->isResettable, + 'workers' => $this->workers, + ]; + } +} diff --git a/app/src/Module/Informer/DTO/Worker.php b/app/src/Module/Informer/DTO/Worker.php new file mode 100644 index 0000000..cf4c5cb --- /dev/null +++ b/app/src/Module/Informer/DTO/Worker.php @@ -0,0 +1,39 @@ +jsonSerialize()); + } + + public function jsonSerialize(): array + { + return [ + 'pid' => $this->pid, + 'cpu_percent' => $this->cpuPercent, + 'memory_usage' => $this->memoryUsage, + 'command' => $this->command, + 'num_execs' => $this->numExecs, + 'status' => $this->status, + 'status_string' => $this->statusString, + 'created_at' => $this->createdAt->format(\DateTimeInterface::ATOM), + ]; + } +} diff --git a/app/src/Module/Jobs/Command/DTO/Pipeline.php b/app/src/Module/Jobs/Command/DTO/Pipeline.php new file mode 100644 index 0000000..79ca7c4 --- /dev/null +++ b/app/src/Module/Jobs/Command/DTO/Pipeline.php @@ -0,0 +1,39 @@ + $this->pipeline, + 'driver' => $this->driver, + 'queue' => $this->queue, + 'priority' => $this->priority, + 'active' => $this->active, + 'delayed' => $this->delayed, + 'reserved' => $this->reserved, + 'ready' => $this->ready, + ]; + } +} diff --git a/app/src/Module/Jobs/Command/PauseHandler.php b/app/src/Module/Jobs/Command/PauseHandler.php index 488253e..ece76e5 100644 --- a/app/src/Module/Jobs/Command/PauseHandler.php +++ b/app/src/Module/Jobs/Command/PauseHandler.php @@ -4,24 +4,35 @@ namespace App\Module\Jobs\Command; +use App\Application\Command\Jobs\DTO\PauseResult; use App\Application\Command\Jobs\PauseCommand; -use App\Infrastructure\RPC\RPCManagerInterface; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; use Spiral\Cqrs\Attribute\CommandHandler; -use Spiral\RoadRunner\Jobs\Jobs; +use Spiral\Exceptions\ExceptionReporterInterface; -final class PauseHandler +final readonly class PauseHandler { public function __construct( - private readonly RPCManagerInterface $rpc, + private RPCManagerInterface $rpc, + private ExceptionReporterInterface $reporter, ) { } #[CommandHandler] - public function __invoke(PauseCommand $command): void + public function __invoke(PauseCommand $command): PauseResult { - $rpc = $this->rpc->getServer($command->server); - $jobs = new Jobs($rpc); + try { + $this->rpc->connect($command->server)->pauseQueuePipeline($command->pipeline); + $status = true; + } catch (\Throwable $e) { + $this->reporter->report($e); + $status = false; + } - $jobs->pause($command->pipeline); + return new PauseResult( + server: $command->server, + pipeline: $command->pipeline, + status: $status, + ); } } diff --git a/app/src/Module/Jobs/Command/PipelineListHandler.php b/app/src/Module/Jobs/Command/PipelineListHandler.php index bc2cc28..a7d11d1 100644 --- a/app/src/Module/Jobs/Command/PipelineListHandler.php +++ b/app/src/Module/Jobs/Command/PipelineListHandler.php @@ -4,46 +4,39 @@ namespace App\Module\Jobs\Command; +use App\Application\Command\Jobs\DTO\PipelineListResult; use App\Application\Command\Jobs\PipelineListQuery; -use App\Infrastructure\RPC\RPCManagerInterface; -use App\Module\Jobs\Schema\PipelinesSchema; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; +use App\Module\Jobs\Command\DTO\Pipeline; use Spiral\Cqrs\Attribute\QueryHandler; -use Spiral\DataGrid\GridInterface; -use Spiral\RoadRunner\Jobs\Jobs; -use Spiral\RoadRunner\Jobs\Queue; -final class PipelineListHandler +final readonly class PipelineListHandler { public function __construct( - private readonly RPCManagerInterface $rpc, - private readonly PipelinesSchema $schema, + private RPCManagerInterface $rpc, ) { } #[QueryHandler] - public function __invoke(PipelineListQuery $query): GridInterface + public function __invoke(PipelineListQuery $query): PipelineListResult { - $rpc = $this->rpc->getServer($query->server); - $jobs = new Jobs($rpc); - - $pipelines = []; - - $queues = \iterator_to_array($jobs->getIterator()); - foreach ($queues as $queue) { - /** @var Queue $queue */ - $stat = $queue->getPipelineStat(); - - $pipelines[] = [ - 'name' => $stat->getPipeline(), - 'driver' => $stat->getDriver(), - 'priority' => $stat->getPriority(), - 'active' => $stat->getActive(), - 'delayed' => $stat->getDelayed(), - 'reserved' => $stat->getReserved(), - 'ready' => $stat->getReady(), - ]; - } - - return $this->schema->create($pipelines); + $pipelines = \array_map( + static fn(array $pipeline): Pipeline => new Pipeline( + pipeline: $pipeline['pipeline'], + driver: $pipeline['driver'], + queue: $pipeline['queue'], + priority: $pipeline['priority'], + active: $pipeline['active'], + delayed: $pipeline['delayed'], + reserved: $pipeline['reserved'], + ready: $pipeline['ready'], + ), + $this->rpc->connect($query->server)->queuePipelineList(), + ); + + return new PipelineListResult( + server: $query->server, + pipelines: $pipelines, + ); } } diff --git a/app/src/Module/Jobs/Command/ResumeHandler.php b/app/src/Module/Jobs/Command/ResumeHandler.php index 911c96d..4d2b452 100644 --- a/app/src/Module/Jobs/Command/ResumeHandler.php +++ b/app/src/Module/Jobs/Command/ResumeHandler.php @@ -4,24 +4,35 @@ namespace App\Module\Jobs\Command; +use App\Application\Command\Jobs\DTO\ResumeResult; use App\Application\Command\Jobs\ResumeCommand; -use App\Infrastructure\RPC\RPCManagerInterface; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; use Spiral\Cqrs\Attribute\CommandHandler; -use Spiral\RoadRunner\Jobs\Jobs; +use Spiral\Exceptions\ExceptionReporterInterface; -final class ResumeHandler +final readonly class ResumeHandler { public function __construct( - private readonly RPCManagerInterface $rpc, + private RPCManagerInterface $rpc, + private ExceptionReporterInterface $reporter, ) { } #[CommandHandler] - public function __invoke(ResumeCommand $command): void + public function __invoke(ResumeCommand $command): ResumeResult { - $rpc = $this->rpc->getServer($command->server); - $jobs = new Jobs($rpc); + try { + $this->rpc->connect($command->server)->resumeQueuePipeline($command->pipeline); + $status = true; + } catch (\Throwable $e) { + $this->reporter->report($e); + $status = false; + } - $jobs->resume($command->pipeline); + return new ResumeResult( + server: $command->server, + pipeline: $command->pipeline, + status: $status, + ); } } diff --git a/app/src/Module/Metrics/Command/GetAvailableMetricsHandler.php b/app/src/Module/Metrics/Command/GetAvailableMetricsHandler.php index b8181af..4a66319 100644 --- a/app/src/Module/Metrics/Command/GetAvailableMetricsHandler.php +++ b/app/src/Module/Metrics/Command/GetAvailableMetricsHandler.php @@ -9,10 +9,10 @@ use App\Infrastructure\VictoriaMetrics\Payload\Tag; use Spiral\Cqrs\Attribute\QueryHandler; -final class GetAvailableMetricsHandler +final readonly class GetAvailableMetricsHandler { public function __construct( - private readonly ClientInterface $client, + private ClientInterface $client, ) { } diff --git a/app/src/Module/Metrics/Command/GetByKeyHandler.php b/app/src/Module/Metrics/Command/GetByKeyHandler.php index 04568ed..1972399 100644 --- a/app/src/Module/Metrics/Command/GetByKeyHandler.php +++ b/app/src/Module/Metrics/Command/GetByKeyHandler.php @@ -9,10 +9,10 @@ use App\Infrastructure\VictoriaMetrics\Payload\Tag; use Spiral\Cqrs\Attribute\QueryHandler; -final class GetByKeyHandler +final readonly class GetByKeyHandler { public function __construct( - private readonly ClientInterface $client + private ClientInterface $client ) { } diff --git a/app/src/Module/Metrics/Command/GetMetricsHandler.php b/app/src/Module/Metrics/Command/GetMetricsHandler.php index 9e8cc6e..bb3ae9e 100644 --- a/app/src/Module/Metrics/Command/GetMetricsHandler.php +++ b/app/src/Module/Metrics/Command/GetMetricsHandler.php @@ -6,7 +6,7 @@ use App\Application\Command\Metrics\GetMetricsQuery; use App\Application\Command\RoadRunner\GetConfigQuery; -use App\Infrastructure\RPC\ServersRegistryInterface; +use App\Domain\Server\Service\ServersRepositoryInterface; use Butschster\Prometheus\Parser; use Nyholm\Psr7\Uri; use Spiral\Cqrs\Attribute\QueryHandler; @@ -14,21 +14,21 @@ use Spiral\Exceptions\ExceptionReporterInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; -final class GetMetricsHandler +final readonly class GetMetricsHandler { public function __construct( - private readonly QueryBusInterface $queryBus, - private readonly HttpClientInterface $client, - private readonly ServersRegistryInterface $registry, - private readonly Parser $parser, - private readonly ExceptionReporterInterface $reporter + private QueryBusInterface $queryBus, + private HttpClientInterface $client, + private ServersRepositoryInterface $servers, + private Parser $parser, + private ExceptionReporterInterface $reporter ) { } #[QueryHandler] public function handle(GetMetricsQuery $query): array { - $server = $this->registry->getServer($query->server); + $server = $this->servers->getServer($query->server); try { $config = $this->queryBus->ask(new GetConfigQuery($query->server)); @@ -39,8 +39,8 @@ public function handle(GetMetricsQuery $query): array $scheme = isset($config['http']['ssl']) ? 'https' : 'http'; - $host = (new Uri($config['metrics']['address'])) - ->withHost($server->getAddress()->getHost()) + $host = (new Uri($config['metrics']['address'])) + ->withHost($server->address->getHost()) ->withScheme($scheme); $response = $this->client->request('GET', (string)$host); diff --git a/app/src/Module/Metrics/Command/GetRangeByKeyHandler.php b/app/src/Module/Metrics/Command/GetRangeByKeyHandler.php index c6ddf9f..1ae3f35 100644 --- a/app/src/Module/Metrics/Command/GetRangeByKeyHandler.php +++ b/app/src/Module/Metrics/Command/GetRangeByKeyHandler.php @@ -9,10 +9,10 @@ use App\Infrastructure\VictoriaMetrics\Payload\Tag; use Spiral\Cqrs\Attribute\QueryHandler; -final class GetRangeByKeyHandler +final readonly class GetRangeByKeyHandler { public function __construct( - private readonly ClientInterface $client + private ClientInterface $client ) { } diff --git a/app/src/Module/Resetter/Command/ResetHandler.php b/app/src/Module/Resetter/Command/ResetHandler.php index 81e0cf2..8d94f42 100644 --- a/app/src/Module/Resetter/Command/ResetHandler.php +++ b/app/src/Module/Resetter/Command/ResetHandler.php @@ -4,23 +4,34 @@ namespace App\Module\Resetter\Command; +use App\Application\Command\Resetter\DTO\ResetResult; use App\Application\Command\Resetter\ResetCommand; -use App\Infrastructure\RPC\RPCManagerInterface; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; use Spiral\Cqrs\Attribute\CommandHandler; -use Spiral\Goridge\RPC\Codec\JsonCodec; +use Spiral\Exceptions\ExceptionReporterInterface; -final class ResetHandler +final readonly class ResetHandler { public function __construct( - private readonly RPCManagerInterface $rpc, + private RPCManagerInterface $rpc, + private ExceptionReporterInterface $reporter, ) { } #[CommandHandler] - public function __invoke(ResetCommand $command): bool + public function __invoke(ResetCommand $command): ResetResult { - $rpc = $this->rpc->getServer($command->server, new JsonCodec()); + try { + $status = $this->rpc->connect($command->server)->resetPlugin($command->plugin); + } catch (\Throwable $e) { + $this->reporter->report($e); + $status = false; + } - return (bool)$rpc->call('resetter.Reset', $command->plugin); + return new ResetResult( + server: $command->server, + plugin: $command->plugin, + status: $status, + ); } } diff --git a/app/src/Module/RoadRunner/Command/GetConfigHandler.php b/app/src/Module/RoadRunner/Command/GetConfigHandler.php index e80655b..5dd8a59 100644 --- a/app/src/Module/RoadRunner/Command/GetConfigHandler.php +++ b/app/src/Module/RoadRunner/Command/GetConfigHandler.php @@ -4,29 +4,33 @@ namespace App\Module\RoadRunner\Command; +use App\Application\Command\RoadRunner\DTO\GetConfigResult; use App\Application\Command\RoadRunner\GetConfigQuery; -use App\Infrastructure\RPC\RPCManagerInterface; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; use Spiral\Cqrs\Attribute\QueryHandler; -use Spiral\Goridge\RPC\Codec\JsonCodec; +use Spiral\Exceptions\ExceptionReporterInterface; -final class GetConfigHandler +final readonly class GetConfigHandler { public function __construct( - private readonly RPCManagerInterface $rpc, + private RPCManagerInterface $rpc, + private ExceptionReporterInterface $reporter, ) { } #[QueryHandler] - public function __invoke(GetConfigQuery $query): array + public function __invoke(GetConfigQuery $query): GetConfigResult { - $rpc = $this->rpc->getServer($query->server, new JsonCodec()); - try { - $config = $rpc->call('rpc.Config', true); - - return \json_decode(\base64_decode($config), true); + $config = $this->rpc->connect($query->server)->getConfig(); } catch (\Throwable $e) { - return []; + $this->reporter->report($e); + $config = []; } + + return new GetConfigResult( + server: $query->server, + config: $config, + ); } } diff --git a/app/src/Module/RoadRunner/Command/GetVersionHandler.php b/app/src/Module/RoadRunner/Command/GetVersionHandler.php index 5efcd89..5441bdf 100644 --- a/app/src/Module/RoadRunner/Command/GetVersionHandler.php +++ b/app/src/Module/RoadRunner/Command/GetVersionHandler.php @@ -4,29 +4,32 @@ namespace App\Module\RoadRunner\Command; +use App\Application\Command\RoadRunner\DTO\GetVersionResult; use App\Application\Command\RoadRunner\GetVersionQuery; -use App\Infrastructure\RPC\RPCManagerInterface; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; use Spiral\Cqrs\Attribute\QueryHandler; -use Spiral\Goridge\RPC\Codec\JsonCodec; -final class GetVersionHandler +final readonly class GetVersionHandler { public function __construct( - private readonly RPCManagerInterface $rpc, + private RPCManagerInterface $rpc, ) { } #[QueryHandler] - public function __invoke(GetVersionQuery $query): array + public function __invoke(GetVersionQuery $query): GetVersionResult { - $rpc = $this->rpc->getServer($query->server, new JsonCodec()); + $rpc = $this->rpc->connect($query->server); try { - $version = $rpc->call('rpc.Version', true); - } catch (\Throwable $e) { - $version = null; + $version = $rpc->getVersion(); + } catch (\Throwable) { + $version = '0.0.0'; } - return compact('version'); + return new GetVersionResult( + server: $query->server, + version: $version, + ); } } diff --git a/app/src/Module/Server/Command/DefaultServerHandler.php b/app/src/Module/Server/Command/DefaultServerHandler.php new file mode 100644 index 0000000..ea3771c --- /dev/null +++ b/app/src/Module/Server/Command/DefaultServerHandler.php @@ -0,0 +1,26 @@ +servers->getDefault(), + ); + } +} diff --git a/app/src/Module/Server/Command/ListServersHandler.php b/app/src/Module/Server/Command/ListServersHandler.php index 56100de..88b410d 100644 --- a/app/src/Module/Server/Command/ListServersHandler.php +++ b/app/src/Module/Server/Command/ListServersHandler.php @@ -4,22 +4,23 @@ namespace App\Module\Server\Command; +use App\Application\Command\Server\DTO\ListResult; use App\Application\Command\Server\ListQuery; -use App\Infrastructure\RPC\ServersRegistryInterface; +use App\Domain\Server\Service\ServersRepositoryInterface; use Spiral\Cqrs\Attribute\QueryHandler; -final class ListServersHandler +final readonly class ListServersHandler { public function __construct( - private readonly ServersRegistryInterface $registry + private ServersRepositoryInterface $servers, ) { } #[QueryHandler] - public function __invoke(ListQuery $query): array + public function __invoke(ListQuery $query): ListResult { - return [ - 'servers' => $this->registry->getServers(), - ]; + return new ListResult( + servers: $this->servers->getServers(), + ); } } diff --git a/app/src/Module/Server/Command/RegisterHandler.php b/app/src/Module/Server/Command/RegisterHandler.php index b34aa65..d244c28 100644 --- a/app/src/Module/Server/Command/RegisterHandler.php +++ b/app/src/Module/Server/Command/RegisterHandler.php @@ -4,27 +4,32 @@ namespace App\Module\Server\Command; +use App\Application\Command\Server\DTO\RegisterResult; use App\Application\Command\Server\RegisterCommand; -use App\Infrastructure\RPC\ServersRegistryInterface; +use App\Domain\Server\Service\ServersRegistryInterface; use App\Module\Server\Event\Registered; use Psr\EventDispatcher\EventDispatcherInterface; use Spiral\Cqrs\Attribute\CommandHandler; -final class RegisterHandler +final readonly class RegisterHandler { public function __construct( - private readonly ServersRegistryInterface $registry, - private readonly EventDispatcherInterface $dispatcher, + private ServersRegistryInterface $servers, + private EventDispatcherInterface $dispatcher, ) { } #[CommandHandler] - public function __invoke(RegisterCommand $command): void + public function __invoke(RegisterCommand $command): RegisterResult { - $this->registry->addServer($command->name, $command->address); + $this->servers->addServer($command->name, $command->address); $this->dispatcher->dispatch( new Registered($command->name, $command->address) ); + + return new RegisterResult( + status: true + ); } } diff --git a/app/src/Module/Server/Event/Registered.php b/app/src/Module/Server/Event/Registered.php index 3f84324..6b12a1f 100644 --- a/app/src/Module/Server/Event/Registered.php +++ b/app/src/Module/Server/Event/Registered.php @@ -7,11 +7,11 @@ use App\Application\Centrifuge\Channel\PublicChannel; use App\Application\Event\ShouldBroadcast; -final class Registered implements ShouldBroadcast +final readonly class Registered implements ShouldBroadcast { public function __construct( - public readonly string $name, - public readonly string $address + public string $name, + public string $address ) { } diff --git a/app/src/Module/Service/Command/CreateHandler.php b/app/src/Module/Service/Command/CreateHandler.php index b8efb8d..4031488 100644 --- a/app/src/Module/Service/Command/CreateHandler.php +++ b/app/src/Module/Service/Command/CreateHandler.php @@ -5,30 +5,45 @@ namespace App\Module\Service\Command; use App\Application\Command\Service\CreateCommand; -use App\Infrastructure\RPC\RPCManagerInterface; +use App\Application\Command\Service\DTO\CreateResult; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; use Spiral\Cqrs\Attribute\CommandHandler; +use Spiral\Exceptions\ExceptionReporterInterface; use Spiral\RoadRunner\Services\Manager; -final class CreateHandler +final readonly class CreateHandler { public function __construct( - private readonly RPCManagerInterface $rpc, + private RPCManagerInterface $rpc, + private ExceptionReporterInterface $reporter, ) { } #[CommandHandler] - public function __invoke(CreateCommand $command): bool + public function __invoke(CreateCommand $command): CreateResult { - $manager = new Manager($this->rpc->getServer($command->server)); - - return $manager->create( - name: $command->name, - command: $command->command, - processNum: $command->processNum, - execTimeout: $command->execTimeout, - remainAfterExit: $command->remainAfterExit, - env: $command->env, - restartSec: $command->restartSec + $manager = new Manager($this->rpc->connect($command->server)->getRpc()); + + try { + $result = $manager->create( + name: $command->name, + command: $command->command, + processNum: $command->processNum, + execTimeout: $command->execTimeout, + remainAfterExit: $command->remainAfterExit, + env: $command->env, + restartSec: $command->restartSec, + ); + } catch (\Throwable $e) { + $this->reporter->report($e); + $result = false; + } + + // TODO: fire event + + return new CreateResult( + server: $command->server, + status: $result, ); } } diff --git a/app/src/Module/Service/Command/DTO/Status.php b/app/src/Module/Service/Command/DTO/Status.php new file mode 100644 index 0000000..2678b40 --- /dev/null +++ b/app/src/Module/Service/Command/DTO/Status.php @@ -0,0 +1,33 @@ +jsonSerialize(), \JSON_THROW_ON_ERROR); + } + + public function jsonSerialize(): array + { + return [ + 'command' => $this->command, + 'cpu_percent' => $this->cpuPercent, + 'memory_usage' => $this->memoryUsage, + 'pid' => $this->pid, + 'error' => $this->error, + ]; + } +} diff --git a/app/src/Module/Service/Command/ListHandler.php b/app/src/Module/Service/Command/ListHandler.php index de33443..8501e11 100644 --- a/app/src/Module/Service/Command/ListHandler.php +++ b/app/src/Module/Service/Command/ListHandler.php @@ -4,25 +4,36 @@ namespace App\Module\Service\Command; +use App\Application\Command\Service\DTO\ListResult; use App\Application\Command\Service\ListQuery; -use App\Infrastructure\RPC\RPCManagerInterface; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; use Spiral\Cqrs\Attribute\QueryHandler; +use Spiral\Exceptions\ExceptionReporterInterface; use Spiral\RoadRunner\Services\Manager; -final class ListHandler +final readonly class ListHandler { public function __construct( - private readonly RPCManagerInterface $rpc, + private RPCManagerInterface $rpc, + private ExceptionReporterInterface $reporter, ) { } #[QueryHandler] - public function __invoke(ListQuery $query): array + public function __invoke(ListQuery $query): ListResult { - $manager = new Manager($this->rpc->getServer($query->server)); + $manager = new Manager($this->rpc->connect($query->server)->getRpc()); - return [ - 'services' => $manager->list(), - ]; + try { + $services = $manager->list(); + } catch (\Throwable $e) { + $this->reporter->report($e); + $services = []; + } + + return new ListResult( + server: $query->server, + services: $services, + ); } } diff --git a/app/src/Module/Service/Command/RestartHandler.php b/app/src/Module/Service/Command/RestartHandler.php index 5bf9d9e..2f2442b 100644 --- a/app/src/Module/Service/Command/RestartHandler.php +++ b/app/src/Module/Service/Command/RestartHandler.php @@ -4,32 +4,44 @@ namespace App\Module\Service\Command; +use App\Application\Command\Service\DTO\RestartResult; use App\Application\Command\Service\RestartCommand; -use App\Infrastructure\RPC\RPCManagerInterface; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; use App\Module\Service\Event\Service\Restarted; use Psr\EventDispatcher\EventDispatcherInterface; use Spiral\Cqrs\Attribute\CommandHandler; +use Spiral\Exceptions\ExceptionReporterInterface; use Spiral\RoadRunner\Services\Manager; -final class RestartHandler +final readonly class RestartHandler { public function __construct( - private readonly RPCManagerInterface $rpc, - private readonly EventDispatcherInterface $dispatcher, + private RPCManagerInterface $rpc, + private EventDispatcherInterface $dispatcher, + private ExceptionReporterInterface $reporter ) { } #[CommandHandler] - public function __invoke(RestartCommand $command): bool + public function __invoke(RestartCommand $command): RestartResult { - $manager = new Manager($this->rpc->getServer($command->server)); - - $status = $manager->restart($command->service); - - $this->dispatcher->dispatch( - new Restarted($command->server, $command->service, $status) + try { + $manager = new Manager($this->rpc->connect($command->server)->getRpc()); + + $status = $manager->restart($command->service); + + $this->dispatcher->dispatch( + new Restarted($command->server, $command->service), + ); + } catch (\Throwable $e) { + $this->reporter->report($e); + $status = false; + } + + return new RestartResult( + server: $command->server, + service: $command->service, + status: $status, ); - - return $status; } } diff --git a/app/src/Module/Service/Command/StatusHandler.php b/app/src/Module/Service/Command/StatusHandler.php index de64b9a..7848d18 100644 --- a/app/src/Module/Service/Command/StatusHandler.php +++ b/app/src/Module/Service/Command/StatusHandler.php @@ -4,37 +4,40 @@ namespace App\Module\Service\Command; -use App\Application\Command\RoadRunner\GetVersionQuery; +use App\Application\Command\Service\DTO\StatusResult; use App\Application\Command\Service\StatusQuery; -use App\Infrastructure\RPC\RPCManagerInterface; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; +use App\Module\Service\Command\DTO\Status; use Spiral\Cqrs\Attribute\QueryHandler; -use Spiral\Cqrs\QueryBusInterface; use Spiral\RoadRunner\Services\Manager; -final class StatusHandler +final readonly class StatusHandler { public function __construct( - private readonly RPCManagerInterface $rpc, - private readonly QueryBusInterface $queryBus + private RPCManagerInterface $rpc, ) { } #[QueryHandler] - public function __invoke(StatusQuery $query): array + public function __invoke(StatusQuery $query): StatusResult { - $version = $this->queryBus->ask(new GetVersionQuery($query->server))['version']; - $manager = new Manager($this->rpc->getServer($query->server)); + $manager = new Manager($this->rpc->connect($query->server)->getRpc()); - if ($version === null) { - $status = $manager->status($query->service); - $status['error'] = null; - $statuses = [$status]; - } else { - $statuses = $manager->statuses($query->service); - } + $statuses = \array_map( + static fn(array $status): Status => new Status( + command: $status['command'], + cpuPercent: $status['cpu_percent'], + memoryUsage: $status['memory_usage'], + pid: $status['pid'], + error: $status['error']['message'] ?? null, + ), + $manager->statuses($query->service), + ); - return [ - 'statuses' => $statuses, - ]; + return new StatusResult( + server: $query->server, + service: $query->service, + statuses: $statuses, + ); } } diff --git a/app/src/Module/Service/Command/TerminateHandler.php b/app/src/Module/Service/Command/TerminateHandler.php index 81c2328..8e078f0 100644 --- a/app/src/Module/Service/Command/TerminateHandler.php +++ b/app/src/Module/Service/Command/TerminateHandler.php @@ -4,23 +4,45 @@ namespace App\Module\Service\Command; +use App\Application\Command\Service\DTO\TerminateResult; use App\Application\Command\Service\TerminateCommand; -use App\Infrastructure\RPC\RPCManagerInterface; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; +use App\Module\Service\Event\Service\Restarted; +use App\Module\Service\Event\Service\Terminated; +use Psr\EventDispatcher\EventDispatcherInterface; use Spiral\Cqrs\Attribute\CommandHandler; +use Spiral\Exceptions\ExceptionReporterInterface; use Spiral\RoadRunner\Services\Manager; -final class TerminateHandler +final readonly class TerminateHandler { public function __construct( - private readonly RPCManagerInterface $rpc, + private RPCManagerInterface $rpc, + private EventDispatcherInterface $dispatcher, + private ExceptionReporterInterface $reporter ) { } #[CommandHandler] - public function __invoke(TerminateCommand $command): bool + public function __invoke(TerminateCommand $command): TerminateResult { - $manager = new Manager($this->rpc->getServer($command->server)); + $manager = new Manager($this->rpc->connect($command->server)->getRpc()); - return $manager->terminate($command->service); + try { + $status = $manager->terminate($command->service); + + $this->dispatcher->dispatch( + new Terminated($command->server, $command->service), + ); + } catch (\Throwable $e) { + $this->reporter->report($e); + $status = false; + } + + return new TerminateResult( + server: $command->server, + service: $command->service, + status: $status, + ); } } diff --git a/app/src/Module/Service/Event/Service/Restarted.php b/app/src/Module/Service/Event/Service/Restarted.php index b75747f..db53c27 100644 --- a/app/src/Module/Service/Event/Service/Restarted.php +++ b/app/src/Module/Service/Event/Service/Restarted.php @@ -7,12 +7,11 @@ use App\Application\Centrifuge\Channel\ServerChannel; use App\Application\Event\ShouldBroadcast; -class Restarted implements ShouldBroadcast +final readonly class Restarted implements ShouldBroadcast { public function __construct( - public readonly string $server, - public readonly string $service, - public readonly bool $status + public string $server, + public string $service ) { } @@ -31,7 +30,6 @@ public function getPayload(): array|\JsonSerializable return [ 'server' => $this->server, 'service' => $this->service, - 'status' => $this->status, ]; } } diff --git a/app/src/Module/Service/Event/Service/Terminated.php b/app/src/Module/Service/Event/Service/Terminated.php new file mode 100644 index 0000000..eeb6b3f --- /dev/null +++ b/app/src/Module/Service/Event/Service/Terminated.php @@ -0,0 +1,35 @@ +server); + } + + public function getPayload(): array|\JsonSerializable + { + return [ + 'server' => $this->server, + 'service' => $this->service, + ]; + } +} diff --git a/app/src/Module/Settings/Command/GetSettingsHandler.php b/app/src/Module/Settings/Command/GetSettingsHandler.php index 2d34d95..54dcdfc 100644 --- a/app/src/Module/Settings/Command/GetSettingsHandler.php +++ b/app/src/Module/Settings/Command/GetSettingsHandler.php @@ -8,10 +8,10 @@ use App\Module\Settings\SettingsRepositoryInterface; use Spiral\Cqrs\Attribute\QueryHandler; -final class GetSettingsHandler +final readonly class GetSettingsHandler { public function __construct( - private readonly SettingsRepositoryInterface $repository, + private SettingsRepositoryInterface $repository, ) { } diff --git a/app/src/Module/Settings/Command/StoreSettingsHandler.php b/app/src/Module/Settings/Command/StoreSettingsHandler.php index aa6c2ea..b4c3e06 100644 --- a/app/src/Module/Settings/Command/StoreSettingsHandler.php +++ b/app/src/Module/Settings/Command/StoreSettingsHandler.php @@ -4,20 +4,23 @@ namespace App\Module\Settings\Command; +use App\Application\Command\Settings\DTO\StoreResult; use App\Application\Command\Settings\StoreCommand; use App\Module\Settings\SettingsRepositoryInterface; use Spiral\Cqrs\Attribute\CommandHandler; -final class StoreSettingsHandler +final readonly class StoreSettingsHandler { public function __construct( - private readonly SettingsRepositoryInterface $repository, + private SettingsRepositoryInterface $repository, ) { } #[CommandHandler] - public function __invoke(StoreCommand $command): void + public function __invoke(StoreCommand $command): StoreResult { $this->repository->store($command->settings); + + return new StoreResult(status: true); } } diff --git a/app/src/Module/TCP/Command/CloseHandler.php b/app/src/Module/TCP/Command/CloseHandler.php index 24c3525..1ebc08f 100644 --- a/app/src/Module/TCP/Command/CloseHandler.php +++ b/app/src/Module/TCP/Command/CloseHandler.php @@ -5,22 +5,37 @@ namespace App\Module\TCP\Command; use App\Application\Command\TCP\CloseCommand; -use App\Infrastructure\RPC\RPCManagerInterface; +use App\Application\Command\TCP\DTO\CloseResult; +use App\Infrastructure\RoadRunner\RPC\RPCManagerInterface; use Spiral\Cqrs\Attribute\CommandHandler; -use Spiral\Goridge\RPC\Codec\JsonCodec; +use Spiral\Exceptions\ExceptionReporterInterface; -final class CloseHandler +final readonly class CloseHandler { public function __construct( - private readonly RPCManagerInterface $rpc, + private RPCManagerInterface $rpc, + private ExceptionReporterInterface $reporter, ) { } #[CommandHandler] - public function __invoke(CloseCommand $command): bool + public function __invoke(CloseCommand $command): CloseResult { - $rpc = $this->rpc->getServer($command->server, new JsonCodec()); + try { + $status = $this->rpc->connect($command->server) + ->closeTcpConnection($command->connectionUuid); - return (bool)$rpc->call('tcp.Close', $command->connectionUuid); + // TODO: fire event + + } catch (\Throwable $e) { + $this->reporter->report($e); + $status = false; + } + + return new CloseResult( + server: $command->server, + connectionUuid: $command->connectionUuid, + status: $status, + ); } } diff --git a/bin/get-binaries.sh b/bin/get-binaries.sh index ac76e88..006d69b 100755 --- a/bin/get-binaries.sh +++ b/bin/get-binaries.sh @@ -1,11 +1,11 @@ echo "Download centrifugo" -wget --timeout=10 https://github.com/centrifugal/centrifugo/releases/download/v4.0.3/centrifugo_4.0.3_linux_amd64.tar.gz -tar xvfz centrifugo_4.0.3_linux_amd64.tar.gz centrifugo -rm -rf centrifugo_4.0.3_linux_amd64.tar.gz +wget --timeout=10 https://github.com/centrifugal/centrifugo/releases/download/v5.0.4/centrifugo_5.0.4_linux_amd64.tar.gz +tar xvfz centrifugo_5.0.4_linux_amd64.tar.gz centrifugo +rm -rf centrifugo_5.0.4_linux_amd64.tar.gz chmod +x centrifugo echo "Download VictoriaMetrics" -wget --timeout=10 https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.83.0/victoria-metrics-linux-amd64-v1.83.0.tar.gz -tar xvfz victoria-metrics-linux-amd64-v1.83.0.tar.gz victoria-metrics-prod -rm -rf victoria-metrics-linux-amd64-v1.83.0.tar.gz +wget --timeout=10 https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.93.5/victoria-metrics-linux-amd64-v1.93.5.tar.gz +tar xvfz victoria-metrics-linux-amd64-v1.93.5.tar.gz victoria-metrics-prod +rm -rf victoria-metrics-linux-amd64-v1.93.5.tar.gz chmod +x victoria-metrics-prod diff --git a/composer.json b/composer.json index 032994b..a440a0d 100644 --- a/composer.json +++ b/composer.json @@ -15,40 +15,41 @@ } ], "require": { - "php": ">=8.1", + "php": ">=8.2", "ext-mbstring": "*", "butschster/prometheus-parser": "^1.0", "doctrine/collections": "^2.0", "nesbot/carbon": "^2.62", - "spiral-packages/cqrs": "^2.0", + "spiral-packages/cqrs": "dev-feature/coomand-query-suggestions", "spiral-packages/league-event": "^1.0", "spiral/data-grid-bridge": "^3.0", - "spiral/framework": "^3.3", + "spiral/framework": "^3.8", "spiral/nyholm-bridge": "^1.2", - "spiral/roadrunner-bridge": "^2.0", - "spiral/roadrunner-jobs": "^2.6", - "spiral/roadrunner-services": "^1.0", - "spiral/roadrunner-tcp": "^v2.0", + "spiral/roadrunner-bridge": "^3.0", + "spiral/roadrunner-jobs": "^4.0", + "spiral/roadrunner-services": "^2.1", + "spiral/roadrunner-tcp": "^v3.0", "spiral/validator": "^1.0", - "symfony/process": "^6.1" + "symfony/http-client": "^6.1", + "symfony/process": "^6.1", + "webmozart/assert": "^1.11" }, "require-dev": { - "phpunit/phpunit": "^9.5", - "symfony/var-dumper": "^6.0" - }, - "scripts": { - "post-create-project-cmd": [ - "php -r \"copy('.env.sample', '.env');\"", - "php app.php encrypt:key -m .env", - "php app.php configure -vv", - "rr get-binary" - ] + "fakerphp/faker": "^1.23", + "spiral/testing": "^2.5", + "symfony/var-dumper": "^6.0", + "vimeo/psalm": "^5.9" }, "autoload": { "psr-4": { "App\\": "app/src" } }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests" + } + }, "extra": { "publish-cmd": "php app.php publish" }, diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..fada4cc --- /dev/null +++ b/composer.lock @@ -0,0 +1,10174 @@ +{ + "_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": "57e5dc47c7575434ba7ee9700e57b7dd", + "packages": [ + { + "name": "brick/math", + "version": "0.11.0", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "5.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.11.0" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-01-15T23:15:59+00:00" + }, + { + "name": "butschster/prometheus-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/butschster/prometheus-parser.git", + "reference": "bba7119010cfe619575a72a4162246dcd9a88342" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/butschster/prometheus-parser/zipball/bba7119010cfe619575a72a4162246dcd9a88342", + "reference": "bba7119010cfe619575a72a4162246dcd9a88342", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "phplrt/runtime": "^3.2" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phplrt/phplrt": "^3.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.9" + }, + "type": "library", + "autoload": { + "psr-4": { + "Butschster\\Prometheus\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pavel Buchnev", + "email": "butschster@gmail.com" + } + ], + "description": "Prometheus parser written on PHP 8", + "keywords": [ + "ddl", + "php", + "php8", + "prometheus", + "prometheus-parser" + ], + "support": { + "issues": "https://github.com/butschster/prometheus-parser/issues", + "source": "https://github.com/butschster/prometheus-parser/tree/1.0.1" + }, + "time": "2022-11-02T21:19:02+00:00" + }, + { + "name": "cocur/slugify", + "version": "v3.2", + "source": { + "type": "git", + "url": "https://github.com/cocur/slugify.git", + "reference": "d41701efe58ba2df9cae029c3d21e1518cc6780e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cocur/slugify/zipball/d41701efe58ba2df9cae029c3d21e1518cc6780e", + "reference": "d41701efe58ba2df9cae029c3d21e1518cc6780e", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.5.9" + }, + "require-dev": { + "laravel/framework": "~5.1", + "latte/latte": "~2.2", + "league/container": "^2.2.0", + "mikey179/vfsstream": "~1.6", + "mockery/mockery": "~0.9", + "nette/di": "~2.2", + "phpunit/phpunit": "~4.8.36|~5.2", + "pimple/pimple": "~1.1", + "plumphp/plum": "~0.1", + "silex/silex": "~1.3", + "symfony/config": "~2.4|~3.0|~4.0", + "symfony/dependency-injection": "~2.4|~3.0|~4.0", + "symfony/http-kernel": "~2.4|~3.0|~4.0", + "twig/twig": "~1.26|~2.0", + "zendframework/zend-modulemanager": "~2.2", + "zendframework/zend-servicemanager": "~2.2", + "zendframework/zend-view": "~2.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cocur\\Slugify\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ivo Bathke", + "email": "ivo.bathke@gmail.com" + }, + { + "name": "Florian Eckerstorfer", + "email": "florian@eckerstorfer.co", + "homepage": "https://florian.ec" + } + ], + "description": "Converts a string into a slug.", + "keywords": [ + "slug", + "slugify" + ], + "support": { + "issues": "https://github.com/cocur/slugify/issues", + "source": "https://github.com/cocur/slugify/tree/master" + }, + "time": "2019-01-31T20:38:55+00:00" + }, + { + "name": "codedungeon/php-cli-colors", + "version": "1.12.2", + "source": { + "type": "git", + "url": "https://github.com/mikeerickson/php-cli-colors.git", + "reference": "e346156f75717140a3dd622124d2ec686aa7ff8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mikeerickson/php-cli-colors/zipball/e346156f75717140a3dd622124d2ec686aa7ff8e", + "reference": "e346156f75717140a3dd622124d2ec686aa7ff8e", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": ">=5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codedungeon\\PHPCliColors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike Erickson", + "email": "codedungeon@gmail.com" + } + ], + "description": "Liven up you PHP Console Apps with standard colors", + "homepage": "https://github.com/mikeerickson/php-cli-colors", + "keywords": [ + "color", + "colors", + "composer", + "package", + "php" + ], + "support": { + "issues": "https://github.com/mikeerickson/php-cli-colors/issues", + "source": "https://github.com/mikeerickson/php-cli-colors/tree/1.12.2" + }, + "time": "2021-01-05T04:48:27+00:00" + }, + { + "name": "defuse/php-encryption", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/defuse/php-encryption.git", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "paragonie/random_compat": ">= 2", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "^5|^6|^7|^8|^9|^10", + "yoast/phpunit-polyfills": "^2.0.0" + }, + "bin": [ + "bin/generate-defuse-key" + ], + "type": "library", + "autoload": { + "psr-4": { + "Defuse\\Crypto\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Hornby", + "email": "taylor@defuse.ca", + "homepage": "https://defuse.ca/" + }, + { + "name": "Scott Arciszewski", + "email": "info@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "Secure PHP Encryption Library", + "keywords": [ + "aes", + "authenticated encryption", + "cipher", + "crypto", + "cryptography", + "encrypt", + "encryption", + "openssl", + "security", + "symmetric key cryptography" + ], + "support": { + "issues": "https://github.com/defuse/php-encryption/issues", + "source": "https://github.com/defuse/php-encryption/tree/v2.4.0" + }, + "time": "2023-06-19T06:10:36+00:00" + }, + { + "name": "doctrine/annotations", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2 || ^3", + "ext-tokenizer": "*", + "php": "^7.2 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^5.4 || ^6", + "vimeo/psalm": "^4.10" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/2.0.1" + }, + "time": "2023-02-02T22:02:53+00:00" + }, + { + "name": "doctrine/collections", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "3023e150f90a38843856147b58190aa8b46cc155" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/3023e150f90a38843856147b58190aa8b46cc155", + "reference": "3023e150f90a38843856147b58190aa8b46cc155", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1", + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^10.0", + "ext-json": "*", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/2.1.3" + }, + "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%2Fcollections", + "type": "tidelift" + } + ], + "time": "2023-07-06T15:15:36+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.2" + }, + "time": "2023-09-27T20:04:15+00:00" + }, + { + "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/lexer", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "84a527db05647743d50373e0ec53a152f2cde568" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-12-15T16:57:16+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/3a85486b709bc384dae8eb78fb2eec649bdb64ff", + "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^4.30" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-01-14T14:17:03+00:00" + }, + { + "name": "google/common-protos", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/common-protos-php.git", + "reference": "57d4ad36cc48cc0369123042908013ef2a86bb98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/common-protos-php/zipball/57d4ad36cc48cc0369123042908013ef2a86bb98", + "reference": "57d4ad36cc48cc0369123042908013ef2a86bb98", + "shasum": "" + }, + "require": { + "google/protobuf": "^3.6.1" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36||^8.5", + "sami/sami": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Api\\": "src/Api", + "Google\\Iam\\": "src/Iam", + "Google\\Rpc\\": "src/Rpc", + "Google\\Type\\": "src/Type", + "Google\\Cloud\\": "src/Cloud", + "GPBMetadata\\Google\\Api\\": "metadata/Api", + "GPBMetadata\\Google\\Iam\\": "metadata/Iam", + "GPBMetadata\\Google\\Rpc\\": "metadata/Rpc", + "GPBMetadata\\Google\\Type\\": "metadata/Type", + "GPBMetadata\\Google\\Cloud\\": "metadata/Cloud", + "GPBMetadata\\Google\\Logging\\": "metadata/Logging" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google API Common Protos for PHP", + "homepage": "https://github.com/googleapis/common-protos-php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/common-protos-php/issues", + "source": "https://github.com/googleapis/common-protos-php/tree/v3.2.0" + }, + "time": "2023-01-12T16:51:46+00:00" + }, + { + "name": "google/protobuf", + "version": "v3.24.3", + "source": { + "type": "git", + "url": "https://github.com/protocolbuffers/protobuf-php.git", + "reference": "2fc191fc5e137829081b8700086ac6ed7003b925" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/2fc191fc5e137829081b8700086ac6ed7003b925", + "reference": "2fc191fc5e137829081b8700086ac6ed7003b925", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": ">=5.0.0" + }, + "suggest": { + "ext-bcmath": "Need to support JSON deserialization" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Protobuf\\": "src/Google/Protobuf", + "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "proto library for PHP", + "homepage": "https://developers.google.com/protocol-buffers/", + "keywords": [ + "proto" + ], + "support": { + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v3.24.3" + }, + "time": "2023-09-07T15:39:13+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-02-25T20:23:15+00:00" + }, + { + "name": "grpc/grpc", + "version": "1.57.0", + "source": { + "type": "git", + "url": "https://github.com/grpc/grpc-php.git", + "reference": "b610c42022ed3a22f831439cb93802f2a4502fdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/grpc/grpc-php/zipball/b610c42022ed3a22f831439cb93802f2a4502fdf", + "reference": "b610c42022ed3a22f831439cb93802f2a4502fdf", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "google/auth": "^v1.3.0" + }, + "suggest": { + "ext-protobuf": "For better performance, install the protobuf C extension.", + "google/protobuf": "To get started using grpc quickly, install the native protobuf library." + }, + "type": "library", + "autoload": { + "psr-4": { + "Grpc\\": "src/lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "gRPC library for PHP", + "homepage": "https://grpc.io", + "keywords": [ + "rpc" + ], + "support": { + "source": "https://github.com/grpc/grpc-php/tree/v1.57.0" + }, + "time": "2023-08-14T23:57:54+00:00" + }, + { + "name": "league/event", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/event.git", + "reference": "221867a61087ee265ca07bd39aa757879afca820" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/event/zipball/221867a61087ee265ca07bd39aa757879afca820", + "reference": "221867a61087ee265ca07bd39aa757879afca820", + "shasum": "" + }, + "require": { + "php": ">=7.2.0", + "psr/event-dispatcher": "^1.0" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.16", + "phpstan/phpstan": "^0.12.45", + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Event package", + "keywords": [ + "emitter", + "event", + "listener" + ], + "support": { + "issues": "https://github.com/thephpleague/event/issues", + "source": "https://github.com/thephpleague/event/tree/3.0.2" + }, + "time": "2022-10-29T09:31:25+00:00" + }, + { + "name": "league/flysystem", + "version": "2.5.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/8aaffb653c5777781b0f7f69a5d937baf7ab6cdb", + "reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb", + "shasum": "" + }, + "require": { + "ext-json": "*", + "league/mime-type-detection": "^1.0.0", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "guzzlehttp/ringphp": "<1.1.1" + }, + "require-dev": { + "async-aws/s3": "^1.5", + "async-aws/simple-s3": "^1.0", + "aws/aws-sdk-php": "^3.132.4", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "friendsofphp/php-cs-fixer": "^3.2", + "google/cloud-storage": "^1.23", + "phpseclib/phpseclib": "^2.0", + "phpstan/phpstan": "^0.12.26", + "phpunit/phpunit": "^8.5 || ^9.4", + "sabre/dav": "^4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/2.5.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2022-09-17T21:02:32+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.13.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/a6dfb1194a2946fcdc1f38219445234f65b35c96", + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.13.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2023-08-05T12:09:49+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.9.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f259e2b15fb95494c83f52d3caad003bbf5ffaa1", + "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.9.1" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2023-02-06T13:44:46+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.71.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "98276233188583f2ff845a0f992a235472d9466a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/98276233188583f2ff845a0f992a235472d9466a", + "reference": "98276233188583f2ff845a0f992a235472d9466a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2023-09-25T11:31:05+00:00" + }, + { + "name": "nette/php-generator", + "version": "v4.1.0", + "source": { + "type": "git", + "url": "https://github.com/nette/php-generator.git", + "reference": "8b728c622c49b196513c0f95508f2f66342d1e8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/php-generator/zipball/8b728c622c49b196513c0f95508f2f66342d1e8f", + "reference": "8b728c622c49b196513c0f95508f2f66342d1e8f", + "shasum": "" + }, + "require": { + "nette/utils": "^3.2.9 || ^4.0", + "php": "8.0 - 8.3" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.4", + "nikic/php-parser": "^4.15", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.8" + }, + "suggest": { + "nikic/php-parser": "to use ClassType::from(withBodies: true) & ClassType::fromCode()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.3 features.", + "homepage": "https://nette.org", + "keywords": [ + "code", + "nette", + "php", + "scaffolding" + ], + "support": { + "issues": "https://github.com/nette/php-generator/issues", + "source": "https://github.com/nette/php-generator/tree/v4.1.0" + }, + "time": "2023-09-26T12:28:52+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "cead6637226456b35e1175cc53797dd585d85545" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/cead6637226456b35e1175cc53797dd585d85545", + "reference": "cead6637226456b35e1175cc53797dd585d85545", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.2" + }, + "time": "2023-09-19T11:58:07+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": "nyholm/psr7", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/3cb4d163b58589e47b35103e8e5e6a6a475b47be", + "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", + "keywords": [ + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.0" + }, + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2023-05-02T11:26:24+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "php-http/message-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "support": { + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/1.1.0" + }, + "abandoned": "psr/http-factory", + "time": "2023-04-14T14:16:17+00:00" + }, + { + "name": "phplrt/ast-contracts", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/phplrt/ast-contracts.git", + "reference": "c570190219817df866e28fa20ee5aff49c219545" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phplrt/ast-contracts/zipball/c570190219817df866e28fa20ee5aff49c219545", + "reference": "c570190219817df866e28fa20ee5aff49c219545", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Phplrt\\Contracts\\Ast\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov", + "email": "nesk@xakep.ru" + } + ], + "description": "A set of phplrt ast abstractions", + "homepage": "https://github.com/phplrt", + "keywords": [ + "abstractions", + "ast", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards", + "tree" + ], + "support": { + "issues": "https://github.com/phplrt/ast-contracts/issues", + "source": "https://github.com/phplrt/ast-contracts" + }, + "time": "2023-06-03T15:58:42+00:00" + }, + { + "name": "phplrt/buffer", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/phplrt/buffer.git", + "reference": "c974d6962e2401e846df8d2236cc7a5f6c57ea09" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phplrt/buffer/zipball/c974d6962e2401e846df8d2236cc7a5f6c57ea09", + "reference": "c974d6962e2401e846df8d2236cc7a5f6c57ea09", + "shasum": "" + }, + "require": { + "ext-spl": "*", + "php": "^7.4|^8.0", + "phplrt/lexer": "^3.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.20", + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Phplrt\\Buffer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov", + "email": "nesk@xakep.ru" + } + ], + "description": "The phplrt buffer library", + "homepage": "https://github.com/phplrt", + "keywords": [ + "Buffer", + "stream", + "token" + ], + "support": { + "issues": "https://github.com/phplrt/phplrt/issues", + "source": "https://github.com/phplrt/buffer" + }, + "time": "2023-06-03T15:58:36+00:00" + }, + { + "name": "phplrt/exception", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/phplrt/exception.git", + "reference": "b6670fd2c7816b72e75da3d63a3f93ccffb4b753" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phplrt/exception/zipball/b6670fd2c7816b72e75da3d63a3f93ccffb4b753", + "reference": "b6670fd2c7816b72e75da3d63a3f93ccffb4b753", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-pcre": "*", + "ext-spl": "*", + "php": "^7.4|^8.0", + "phplrt/exception-contracts": "^3.2", + "phplrt/position": "^3.2", + "phplrt/source": "^3.2" + }, + "provide": { + "phplrt/exception-contracts-implementation": "^3.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.20", + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Phplrt\\Exception\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov", + "email": "nesk@xakep.ru" + } + ], + "description": "The phplrt exception package", + "homepage": "https://github.com/phplrt", + "keywords": [ + "errors", + "exception", + "helpers", + "parsing" + ], + "support": { + "issues": "https://github.com/phplrt/phplrt/issues", + "source": "https://github.com/phplrt/exception" + }, + "time": "2023-06-03T15:59:02+00:00" + }, + { + "name": "phplrt/exception-contracts", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/phplrt/exception-contracts.git", + "reference": "c12dcb7ada99bbf7e431fbea536dfd30f07f70a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phplrt/exception-contracts/zipball/c12dcb7ada99bbf7e431fbea536dfd30f07f70a9", + "reference": "c12dcb7ada99bbf7e431fbea536dfd30f07f70a9", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "phplrt/lexer-contracts": "^3.2", + "phplrt/source-contracts": "^3.2" + }, + "require-dev": { + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Phplrt\\Contracts\\Exception\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov", + "email": "nesk@xakep.ru" + } + ], + "description": "A set of phplrt exception abstractions", + "homepage": "https://github.com/phplrt", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "exception", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "issues": "https://github.com/phplrt/exception-contracts/issues", + "source": "https://github.com/phplrt/exception-contracts" + }, + "time": "2023-06-03T15:58:43+00:00" + }, + { + "name": "phplrt/lexer", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/phplrt/lexer.git", + "reference": "e11f398673ac34145bc1d65d209bb04f1b3f42a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phplrt/lexer/zipball/e11f398673ac34145bc1d65d209bb04f1b3f42a7", + "reference": "e11f398673ac34145bc1d65d209bb04f1b3f42a7", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-pcre": "*", + "ext-spl": "*", + "php": "^7.4|^8.0", + "phplrt/exception": "^3.2", + "phplrt/lexer-contracts": "^3.2", + "phplrt/source": "^3.2" + }, + "provide": { + "phplrt/lexer-contracts-implementation": "^3.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.20", + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-main": "3.x-dev" + } + }, + "autoload": { + "files": [ + "src/polyfill.php" + ], + "psr-4": { + "Phplrt\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov", + "email": "nesk@xakep.ru" + } + ], + "description": "The phplrt lexer library that can be used for scanners implementation using PCRE", + "homepage": "https://github.com/phplrt", + "keywords": [ + "lexer", + "parsing", + "regex", + "scanner", + "stream", + "token", + "tokenizer" + ], + "support": { + "issues": "https://github.com/phplrt/phplrt/issues", + "source": "https://github.com/phplrt/lexer" + }, + "time": "2023-06-03T15:59:03+00:00" + }, + { + "name": "phplrt/lexer-contracts", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/phplrt/lexer-contracts.git", + "reference": "6d4cbf0c594398ecf6fad4ed99654c31fa1a1542" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phplrt/lexer-contracts/zipball/6d4cbf0c594398ecf6fad4ed99654c31fa1a1542", + "reference": "6d4cbf0c594398ecf6fad4ed99654c31fa1a1542", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-main": "3.x-dev" + } + }, + "autoload": { + "files": [ + "src/polyfill.php" + ], + "psr-4": { + "Phplrt\\Contracts\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov", + "email": "nesk@xakep.ru" + } + ], + "description": "A set of phplrt lexer abstractions", + "homepage": "https://github.com/phplrt", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "lexer", + "parsing", + "regex", + "standards", + "stream", + "token", + "tokenizer" + ], + "support": { + "issues": "https://github.com/phplrt/lexer-contracts/issues", + "source": "https://github.com/phplrt/lexer-contracts" + }, + "time": "2023-06-03T15:58:59+00:00" + }, + { + "name": "phplrt/parser", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/phplrt/parser.git", + "reference": "2bba8de0b6da87ca88e0130d0462f13dd4e15e57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phplrt/parser/zipball/2bba8de0b6da87ca88e0130d0462f13dd4e15e57", + "reference": "2bba8de0b6da87ca88e0130d0462f13dd4e15e57", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "phplrt/ast-contracts": "^3.2", + "phplrt/buffer": "^3.2", + "phplrt/exception": "^3.2", + "phplrt/lexer-contracts": "^3.2", + "phplrt/parser-contracts": "^3.2", + "phplrt/source": "^3.2" + }, + "provide": { + "phplrt/parser-contracts-implementation": "^3.2" + }, + "replace": { + "phplrt/grammar": "<=3.1", + "phplrt/grammar-contracts": "<=3.1" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.0", + "phplrt/lexer": "^3.2", + "phplrt/visitor": "^3.2", + "phpunit/phpunit": "^9.5.20", + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-main": "3.x-dev" + } + }, + "autoload": { + "files": [ + "src/polyfill.php" + ], + "psr-4": { + "Phplrt\\Parser\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov", + "email": "nesk@xakep.ru" + } + ], + "description": "The phplrt Parser package.", + "homepage": "https://github.com/phplrt", + "keywords": [ + "language", + "ll1", + "llk", + "lr", + "parser", + "php", + "slr" + ], + "support": { + "issues": "https://github.com/phplrt/phplrt/issues", + "source": "https://github.com/phplrt/parser" + }, + "time": "2023-06-03T16:03:13+00:00" + }, + { + "name": "phplrt/parser-contracts", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/phplrt/parser-contracts.git", + "reference": "ea333079066c9b26a26e4faf693dcb57d71cf80d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phplrt/parser-contracts/zipball/ea333079066c9b26a26e4faf693dcb57d71cf80d", + "reference": "ea333079066c9b26a26e4faf693dcb57d71cf80d", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Phplrt\\Contracts\\Parser\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov", + "email": "nesk@xakep.ru" + } + ], + "description": "A set of phplrt parser abstractions", + "homepage": "https://github.com/phplrt", + "keywords": [ + "abstractions", + "analysis", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "language", + "parser", + "php", + "standards", + "syntax" + ], + "support": { + "issues": "https://github.com/phplrt/parser-contracts/issues", + "source": "https://github.com/phplrt/parser-contracts" + }, + "time": "2023-06-03T15:58:54+00:00" + }, + { + "name": "phplrt/position", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/phplrt/position.git", + "reference": "de23645ce6b8c523c20c85acef8fe008e20e2713" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phplrt/position/zipball/de23645ce6b8c523c20c85acef8fe008e20e2713", + "reference": "de23645ce6b8c523c20c85acef8fe008e20e2713", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "phplrt/position-contracts": "^3.2", + "phplrt/source": "^3.2" + }, + "provide": { + "phplrt/position-contracts-implementation": "^3.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.20", + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Phplrt\\Position\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov", + "email": "nesk@xakep.ru" + } + ], + "description": "The phplrt position package.", + "homepage": "https://github.com/phplrt", + "keywords": [ + "analyzing", + "column", + "input", + "line", + "offset", + "position", + "utils", + "visualization" + ], + "support": { + "issues": "https://github.com/phplrt/phplrt/issues", + "source": "https://github.com/phplrt/position" + }, + "time": "2023-06-03T15:59:18+00:00" + }, + { + "name": "phplrt/position-contracts", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/phplrt/position-contracts.git", + "reference": "6c5b902e1ea93b54b92199d9ddeb8d102cbd9570" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phplrt/position-contracts/zipball/6c5b902e1ea93b54b92199d9ddeb8d102cbd9570", + "reference": "6c5b902e1ea93b54b92199d9ddeb8d102cbd9570", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Phplrt\\Contracts\\Position\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov", + "email": "nesk@xakep.ru" + } + ], + "description": "A set of phplrt position abstractions", + "homepage": "https://github.com/phplrt", + "keywords": [ + "abstractions", + "analyzing", + "column", + "contracts", + "decoupling", + "input", + "interfaces", + "interoperability", + "line", + "offset", + "position", + "standards", + "utils", + "visualization" + ], + "support": { + "issues": "https://github.com/phplrt/position-contracts/issues", + "source": "https://github.com/phplrt/position-contracts" + }, + "time": "2023-06-03T15:59:05+00:00" + }, + { + "name": "phplrt/runtime", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/phplrt/runtime.git", + "reference": "a7310098ee98f7b148e60b64ac173b76e7926e46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phplrt/runtime/zipball/a7310098ee98f7b148e60b64ac173b76e7926e46", + "reference": "a7310098ee98f7b148e60b64ac173b76e7926e46", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "phplrt/lexer": "^3.2", + "phplrt/parser": "^3.2", + "phplrt/position": "^3.2", + "phplrt/visitor": "^3.2" + }, + "type": "metapackage", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-main": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov", + "email": "nesk@xakep.ru" + } + ], + "description": "A set of phplrt runtime libraries", + "homepage": "https://github.com/phplrt", + "keywords": [ + "runtime" + ], + "support": { + "issues": "https://github.com/phplrt/runtime/issues", + "source": "https://github.com/phplrt/runtime" + }, + "time": "2022-04-09T18:55:43+00:00" + }, + { + "name": "phplrt/source", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/phplrt/source.git", + "reference": "29fd90d64b870e7b7e05998bb9156522243b7185" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phplrt/source/zipball/29fd90d64b870e7b7e05998bb9156522243b7185", + "reference": "29fd90d64b870e7b7e05998bb9156522243b7185", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "phplrt/source-contracts": "^3.2" + }, + "provide": { + "phplrt/source-contracts-implementation": "^3.2" + }, + "require-dev": { + "laminas/laminas-diactoros": "^2.17", + "phpunit/phpunit": "^9.5.20", + "psr/http-message": "^1.0", + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Phplrt\\Source\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov", + "email": "nesk@xakep.ru" + } + ], + "description": "The phplrt sources package", + "homepage": "https://github.com/phplrt", + "keywords": [ + "abstraction", + "directory", + "file", + "file system", + "fs", + "reader" + ], + "support": { + "issues": "https://github.com/phplrt/phplrt/issues", + "source": "https://github.com/phplrt/source" + }, + "time": "2023-06-03T16:16:14+00:00" + }, + { + "name": "phplrt/source-contracts", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/phplrt/source-contracts.git", + "reference": "02c31832ce80770d298e8c80d2fadd9b8094b618" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phplrt/source-contracts/zipball/02c31832ce80770d298e8c80d2fadd9b8094b618", + "reference": "02c31832ce80770d298e8c80d2fadd9b8094b618", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Phplrt\\Contracts\\Source\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov", + "email": "nesk@xakep.ru" + } + ], + "description": "A set of phplrt source abstractions", + "homepage": "https://github.com/phplrt", + "keywords": [ + "disk", + "file", + "io", + "read", + "source" + ], + "support": { + "issues": "https://github.com/phplrt/source-contracts/issues", + "source": "https://github.com/phplrt/source-contracts" + }, + "time": "2023-06-03T15:59:02+00:00" + }, + { + "name": "phplrt/visitor", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/phplrt/visitor.git", + "reference": "5136d8971f7f454b5d907c147b7d267faeec289b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phplrt/visitor/zipball/5136d8971f7f454b5d907c147b7d267faeec289b", + "reference": "5136d8971f7f454b5d907c147b7d267faeec289b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "phplrt/ast-contracts": "^3.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.20", + "vimeo/psalm": "^5.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Phplrt\\Visitor\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov", + "email": "nesk@xakep.ru" + } + ], + "description": "The phplrt visitor package", + "homepage": "https://github.com/phplrt", + "keywords": [ + "ast", + "traverser", + "tree", + "visitor" + ], + "support": { + "issues": "https://github.com/phplrt/phplrt/issues", + "source": "https://github.com/phplrt/visitor" + }, + "time": "2023-06-03T15:59:13+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2023-02-25T19:38:58+00:00" + }, + { + "name": "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/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-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/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.4", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "60a4c63ab724854332900504274f6150ff26d286" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286", + "reference": "60a4c63ab724854332900504274f6150ff26d286", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.4" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2023-04-15T23:01:58+00:00" + }, + { + "name": "roadrunner-php/app-logger", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/roadrunner-php/app-logger.git", + "reference": "d622d68e86f18ef7e0295bc749c2bd25b2bbabdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/roadrunner-php/app-logger/zipball/d622d68e86f18ef7e0295bc749c2bd25b2bbabdb", + "reference": "d622d68e86f18ef7e0295bc749c2bd25b2bbabdb", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=8.1", + "spiral/goridge": "^3.1 || ^4.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^10.0", + "vimeo/psalm": ">=5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "RoadRunner\\Logger\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Astakhov (kastahov)", + "email": "kirill.astakhov@spiralscout.com" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/spiral/roadrunner/graphs/contributors" + } + ], + "description": "Send log messages to RoadRunner", + "support": { + "issues": "https://github.com/roadrunner-php/app-logger/issues", + "source": "https://github.com/roadrunner-php/app-logger/tree/1.1.0" + }, + "funding": [ + { + "url": "https://github.com/roadrunner-server", + "type": "github" + } + ], + "time": "2023-04-13T13:48:31+00:00" + }, + { + "name": "roadrunner-php/centrifugo", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/roadrunner-php/centrifugo.git", + "reference": "9b48bfa1d6aee0c889ea77bb2afe8f733e0ad8e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/roadrunner-php/centrifugo/zipball/9b48bfa1d6aee0c889ea77bb2afe8f733e0ad8e7", + "reference": "9b48bfa1d6aee0c889ea77bb2afe8f733e0ad8e7", + "shasum": "" + }, + "require": { + "ext-json": "*", + "google/protobuf": "^3.7", + "php": ">=8.1", + "roadrunner-php/roadrunner-api-dto": "^1.0", + "spiral/goridge": "^4.0", + "spiral/roadrunner": "^2023.1", + "spiral/roadrunner-worker": "^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^10.0", + "vimeo/psalm": ">= 5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "RoadRunner\\Centrifugo\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "Kirill Nesmeyanov (SerafimArts)", + "email": "kirill.nesmeyanov@spiralscout.com" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/spiral/roadrunner/graphs/contributors" + } + ], + "description": "RoadRunner: Centrifugo bridge", + "homepage": "https://roadrunner.dev/", + "support": { + "chat": "https://discord.gg/V6EK4he", + "docs": "https://roadrunner.dev/docs", + "forum": "https://forum.roadrunner.dev/", + "issues": "https://github.com/roadrunner-server/roadrunner/issues", + "source": "https://github.com/roadrunner-php/centrifugo/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/roadrunner-server", + "type": "github" + } + ], + "time": "2023-04-13T11:38:58+00:00" + }, + { + "name": "roadrunner-php/roadrunner-api-dto", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/roadrunner-php/roadrunner-api-dto.git", + "reference": "da6424af20f66f47e29a12b287ae72baa9a7b640" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/roadrunner-php/roadrunner-api-dto/zipball/da6424af20f66f47e29a12b287ae72baa9a7b640", + "reference": "da6424af20f66f47e29a12b287ae72baa9a7b640", + "shasum": "" + }, + "require": { + "google/protobuf": "^v3.22", + "php": "^8.1" + }, + "conflict": { + "temporal/sdk": "<2.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Temporal\\": "generated/Temporal", + "RoadRunner\\": "generated/RoadRunner", + "GPBMetadata\\": "generated/GPBMetadata" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/roadrunner-server/roadrunner/graphs/contributors" + } + ], + "description": "RoadRunner PHP API", + "homepage": "https://roadrunner.dev/", + "support": { + "chat": "https://discord.gg/V6EK4he", + "docs": "https://roadrunner.dev/docs", + "forum": "https://forum.roadrunner.dev/", + "issues": "https://github.com/roadrunner-server/roadrunner/issues", + "source": "https://github.com/roadrunner-php/roadrunner-api-dto/tree/1.3.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/roadrunner-server", + "type": "github" + } + ], + "time": "2023-08-09T16:33:01+00:00" + }, + { + "name": "spiral-packages/cqrs", + "version": "dev-feature/coomand-query-suggestions", + "source": { + "type": "git", + "url": "https://github.com/spiral-packages/cqrs.git", + "reference": "5c4732339080a799f13dfcd6248dcc98fd9a1752" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral-packages/cqrs/zipball/5c4732339080a799f13dfcd6248dcc98fd9a1752", + "reference": "5c4732339080a799f13dfcd6248dcc98fd9a1752", + "shasum": "" + }, + "require": { + "php": "^8.1", + "spiral/attributes": "^3.0", + "spiral/boot": "^3.0", + "spiral/config": "^3.0", + "spiral/console": "^3.0", + "spiral/core": "^3.0", + "spiral/tokenizer": "^3.0", + "symfony/messenger": "^6.0" + }, + "require-dev": { + "spiral/framework": "^3.0", + "spiral/testing": "^2.0", + "vimeo/psalm": "^4.9" + }, + "type": "library", + "extra": { + "spiral": { + "bootloaders": [ + "Spiral\\Cqrs\\Bootloader\\CqrsBootloader" + ] + } + }, + "autoload": { + "psr-4": { + "Spiral\\Cqrs\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "butschster", + "email": "butschster@gmail.com", + "role": "Developer" + } + ], + "description": "Lightweight message bus supporting CQRS for Spiral Framework", + "homepage": "https://github.com/spiral-packages/cqrs", + "keywords": [ + "command-bus", + "cqrs", + "query-bus", + "spiral", + "spiral-packages" + ], + "support": { + "issues": "https://github.com/spiral-packages/cqrs/issues", + "source": "https://github.com/spiral-packages/cqrs/tree/feature/coomand-query-suggestions" + }, + "time": "2023-09-30T16:33:54+00:00" + }, + { + "name": "spiral-packages/league-event", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/spiral-packages/league-event.git", + "reference": "ef6e87e2e5a2d12ecfc92e99a6e6f0aec72f7aaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral-packages/league-event/zipball/ef6e87e2e5a2d12ecfc92e99a6e6f0aec72f7aaf", + "reference": "ef6e87e2e5a2d12ecfc92e99a6e6f0aec72f7aaf", + "shasum": "" + }, + "require": { + "league/event": "^3.0", + "php": "^8.1", + "spiral/events": "^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^9.5", + "roave/security-advisories": "dev-latest", + "spiral/testing": "^2.0", + "vimeo/psalm": "^4.22" + }, + "type": "library", + "extra": { + "spiral": { + "bootloaders": [ + "Spiral\\League\\Event\\Bootloader\\EventBootloader" + ] + } + }, + "autoload": { + "psr-4": { + "Spiral\\League\\Event\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The League Event bridge for Spiral Framework", + "homepage": "https://github.com/spiral-packages/symfony-event-dispatcher", + "keywords": [ + "event-dispatcher", + "spiral", + "spiral-packages" + ], + "support": { + "issues": "https://github.com/spiral-packages/league-event/issues", + "source": "https://github.com/spiral-packages/league-event/tree/1.0.1" + }, + "time": "2022-09-14T08:02:26+00:00" + }, + { + "name": "spiral/attributes", + "version": "v3.1.2", + "source": { + "type": "git", + "url": "https://github.com/spiral/attributes.git", + "reference": "aa45e59e0d50119d237177a897ee801efce3b8d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/attributes/zipball/aa45e59e0d50119d237177a897ee801efce3b8d9", + "reference": "aa45e59e0d50119d237177a897ee801efce3b8d9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": ">=1.0", + "psr/simple-cache": "1 - 3" + }, + "require-dev": { + "doctrine/annotations": "^1.12 || ^2.0", + "jetbrains/phpstorm-attributes": "^1.0", + "phpunit/phpunit": "^9.5.20", + "symfony/var-dumper": "^5.2 || ^6.0", + "vimeo/psalm": "^4.21" + }, + "suggest": { + "doctrine/annotations": "^1.0 for Doctrine metadata driver support" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/polyfill.php" + ], + "psr-4": { + "Spiral\\Attributes\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kirill Nesmeyanov (SerafimArts)", + "email": "kirill.nesmeyanov@spiralscout.com" + } + ], + "description": "PHP attributes reader", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/attributes/issues", + "source": "https://github.com/spiral/attributes" + }, + "time": "2023-07-04T14:18:50+00:00" + }, + { + "name": "spiral/composer-publish-plugin", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/spiral/composer-publish-plugin.git", + "reference": "8d25c228389fcc0d4315a83913b8a5eb26c4e45b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/composer-publish-plugin/zipball/8d25c228389fcc0d4315a83913b8a5eb26c4e45b", + "reference": "8d25c228389fcc0d4315a83913b8a5eb26c4e45b", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1|^2.0", + "php": ">=7.1" + }, + "require-dev": { + "composer/composer": "^1.7", + "phpunit/phpunit": "~7.0", + "spiral/code-style": "^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Spiral\\Composer\\PublishPlugin" + }, + "autoload": { + "psr-4": { + "Spiral\\Composer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Wolfy-J", + "email": "wolfy.jd@gmail.com" + } + ], + "support": { + "issues": "https://github.com/spiral/composer-publish-plugin/issues", + "source": "https://github.com/spiral/composer-publish-plugin/tree/v1.1.2" + }, + "time": "2020-11-12T23:10:18+00:00" + }, + { + "name": "spiral/data-grid", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/spiral/data-grid.git", + "reference": "dde45cec1a42802f84da191df6a67b11f7f30e3f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/data-grid/zipball/dde45cec1a42802f84da191df6a67b11f7f30e3f", + "reference": "dde45cec1a42802f84da191df6a67b11f7f30e3f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "spiral/attributes": "^2.10 || ^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.20", + "ramsey/uuid": "^4.2.3", + "vimeo/psalm": "^4.27" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-3.0": "3.0.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spiral\\DataGrid\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Valentin Vintsukevich (vvval)", + "email": "valentin@spiralscout.com" + }, + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + } + ], + "description": "Data Grid specification builder", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/data-grid" + }, + "time": "2022-09-14T18:34:05+00:00" + }, + { + "name": "spiral/data-grid-bridge", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/spiral/data-grid-bridge.git", + "reference": "29e8b7c9faf486d57bad8a3d14d53c2a7ccdf584" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/data-grid-bridge/zipball/29e8b7c9faf486d57bad8a3d14d53c2a7ccdf584", + "reference": "29e8b7c9faf486d57bad8a3d14d53c2a7ccdf584", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=8.1", + "spiral/attributes": "^2.10 || ^3.0", + "spiral/boot": "^3.0", + "spiral/data-grid": "^3.0", + "spiral/http": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.20", + "spiral/hmvc": "^3.0", + "vimeo/psalm": "^4.27" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-3.0": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spiral\\DataGrid\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + } + ], + "description": "Data Grid specification builder adapter for Spiral Framework", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/data-grid-bridge" + }, + "time": "2022-09-14T18:48:30+00:00" + }, + { + "name": "spiral/framework", + "version": "3.8.4", + "source": { + "type": "git", + "url": "https://github.com/spiral/framework.git", + "reference": "3d2189ad4ac6685cfd120eac7a2c52fc996670e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/framework/zipball/3d2189ad4ac6685cfd120eac7a2c52fc996670e4", + "reference": "3d2189ad4ac6685cfd120eac7a2c52fc996670e4", + "shasum": "" + }, + "require": { + "cocur/slugify": "^3.2", + "codedungeon/php-cli-colors": "^1.11", + "defuse/php-encryption": "^2.2", + "doctrine/annotations": "^1.12 || ^2.0", + "doctrine/inflector": "^1.4|^2.0", + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "league/flysystem": "^2.3.1", + "monolog/monolog": "^2.2", + "myclabs/deep-copy": "^1.9", + "nette/php-generator": "^4.0.1", + "nikic/php-parser": "^4.15.5", + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "psr/event-dispatcher": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-factory-implementation": "^1.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "1 - 3", + "psr/simple-cache": "2 - 3", + "spiral/attributes": "^2.8|^3.0", + "spiral/composer-publish-plugin": "^1.0", + "symfony/console": "^6.1", + "symfony/finder": "^5.3.7|^6.0", + "symfony/mailer": "^5.1|^6.0", + "symfony/translation": "^5.1|^6.0", + "vlucas/phpdotenv": "^5.4" + }, + "replace": { + "spiral/annotated-routes": "self.version", + "spiral/auth": "self.version", + "spiral/auth-http": "self.version", + "spiral/boot": "self.version", + "spiral/broadcasting": "self.version", + "spiral/cache": "self.version", + "spiral/config": "self.version", + "spiral/console": "self.version", + "spiral/cookies": "self.version", + "spiral/core": "self.version", + "spiral/csrf": "self.version", + "spiral/debug": "self.version", + "spiral/distribution": "self.version", + "spiral/dotenv-bridge": "self.version", + "spiral/encrypter": "self.version", + "spiral/events": "self.version", + "spiral/exceptions": "self.version", + "spiral/files": "self.version", + "spiral/filters": "self.version", + "spiral/hmvc": "self.version", + "spiral/http": "self.version", + "spiral/logger": "self.version", + "spiral/mailer": "self.version", + "spiral/models": "self.version", + "spiral/monolog-bridge": "self.version", + "spiral/pagination": "self.version", + "spiral/prototype": "self.version", + "spiral/queue": "self.version", + "spiral/reactor": "self.version", + "spiral/router": "self.version", + "spiral/scaffolder": "self.version", + "spiral/security": "self.version", + "spiral/sendit": "self.version", + "spiral/serializer": "self.version", + "spiral/session": "self.version", + "spiral/snapshots": "self.version", + "spiral/stempler": "self.version", + "spiral/stempler-bridge": "self.version", + "spiral/storage": "self.version", + "spiral/streams": "self.version", + "spiral/telemetry": "self.version", + "spiral/tokenizer": "self.version", + "spiral/translator": "self.version", + "spiral/validation": "self.version", + "spiral/views": "self.version" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.270", + "guzzlehttp/psr7": "^1.7|^2.0", + "jetbrains/phpstorm-attributes": "^1.0", + "league/flysystem-async-aws-s3": "^2.0", + "league/flysystem-aws-s3-v3": "^2.0", + "mikey179/vfsstream": "^1.6", + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^10.1", + "ramsey/collection": "^1.2", + "ramsey/uuid": "^4.2.3", + "rector/rector": "0.18.1", + "spiral/code-style": "^1.1", + "spiral/nyholm-bridge": "^1.2", + "spiral/testing": "^2.4", + "spiral/validator": "^1.3", + "symplify/monorepo-builder": "^10.2.7", + "vimeo/psalm": "^5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7.x-dev" + } + }, + "autoload": { + "files": [ + "src/Boot/src/helpers.php", + "src/Framework/helpers.php", + "src/Scaffolder/src/helpers.php", + "src/Stempler/src/helpers.php", + "src/Translator/src/helpers.php" + ], + "psr-4": { + "Spiral\\": "src/Framework", + "Spiral\\Auth\\": [ + "src/Auth/src", + "src/AuthHttp/src" + ], + "Spiral\\Boot\\": "src/Boot/src", + "Spiral\\Core\\": [ + "src/Core/src", + "src/Hmvc/src" + ], + "Spiral\\Csrf\\": "src/Csrf/src", + "Spiral\\Http\\": "src/Http/src", + "Spiral\\Cache\\": "src/Cache/src", + "Spiral\\Debug\\": "src/Debug/src", + "Spiral\\Files\\": "src/Files/src", + "Spiral\\Queue\\": "src/Queue/src", + "Spiral\\Views\\": "src/Views/src", + "Spiral\\Config\\": "src/Config/src", + "Spiral\\DotEnv\\": "src/Bridge/Dotenv/src", + "Spiral\\Events\\": "src/Events/src", + "Spiral\\Logger\\": "src/Logger/src", + "Spiral\\Mailer\\": "src/Mailer/src", + "Spiral\\Models\\": "src/Models/src", + "Spiral\\Router\\": [ + "src/AnnotatedRoutes/src", + "src/Router/src" + ], + "Spiral\\SendIt\\": "src/SendIt/src", + "Spiral\\Console\\": "src/Console/src", + "Spiral\\Cookies\\": "src/Cookies/src", + "Spiral\\Filters\\": "src/Filters/src", + "Spiral\\Monolog\\": "src/Bridge/Monolog/src", + "Spiral\\Reactor\\": "src/Reactor/src", + "Spiral\\Session\\": "src/Session/src", + "Spiral\\Storage\\": "src/Storage/src", + "Spiral\\Streams\\": "src/Streams/src", + "Spiral\\Security\\": "src/Security/src", + "Spiral\\Stempler\\": [ + "src/Bridge/Stempler/src", + "src/Stempler/src" + ], + "Spiral\\Encrypter\\": "src/Encrypter/src", + "Spiral\\Prototype\\": "src/Prototype/src", + "Spiral\\Snapshots\\": "src/Snapshots/src", + "Spiral\\Telemetry\\": "src/Telemetry/src", + "Spiral\\Tokenizer\\": "src/Tokenizer/src", + "Spiral\\Exceptions\\": "src/Exceptions/src", + "Spiral\\Pagination\\": "src/Pagination/src", + "Spiral\\Scaffolder\\": "src/Scaffolder/src", + "Spiral\\Serializer\\": "src/Serializer/src", + "Spiral\\Translator\\": "src/Translator/src", + "Spiral\\Validation\\": "src/Validation/src", + "Spiral\\Broadcasting\\": "src/Broadcasting/src", + "Spiral\\Distribution\\": "src/Distribution/src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Butchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + } + ], + "description": "Spiral, High-Performance PHP/Go Framework", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/framework" + }, + "funding": [ + { + "url": "https://github.com/roadrunner-server", + "type": "github" + } + ], + "time": "2023-09-08T10:07:46+00:00" + }, + { + "name": "spiral/goridge", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/roadrunner-php/goridge.git", + "reference": "56302fc0b677e7874a64ad5d76177e802f963a2a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/roadrunner-php/goridge/zipball/56302fc0b677e7874a64ad5d76177e802f963a2a", + "reference": "56302fc0b677e7874a64ad5d76177e802f963a2a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-sockets": "*", + "php": ">=8.1", + "spiral/roadrunner": "^2023" + }, + "require-dev": { + "google/protobuf": "^3.22", + "infection/infection": "^0.26.1", + "jetbrains/phpstorm-attributes": "^1.0", + "phpunit/phpunit": "^10.0", + "rybakit/msgpack": "^0.7", + "vimeo/psalm": "^5.9" + }, + "suggest": { + "ext-msgpack": "MessagePack codec support", + "ext-protobuf": "Protobuf codec support", + "google/protobuf": "(^3.0) Protobuf codec support", + "rybakit/msgpack": "(^0.7) MessagePack codec support" + }, + "type": "goridge", + "autoload": { + "psr-4": { + "Spiral\\Goridge\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Valery Piashchynski", + "homepage": "https://github.com/rustatian" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/roadrunner-server/roadrunner/graphs/contributors" + } + ], + "description": "High-performance PHP-to-Golang RPC bridge", + "homepage": "https://spiral.dev/", + "support": { + "chat": "https://discord.gg/V6EK4he", + "docs": "https://roadrunner.dev/docs", + "forum": "https://forum.roadrunner.dev/", + "issues": "https://github.com/roadrunner-server/roadrunner/issues", + "source": "https://github.com/roadrunner-php/goridge/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/roadrunner-server", + "type": "github" + } + ], + "time": "2023-04-13T11:38:18+00:00" + }, + { + "name": "spiral/nyholm-bridge", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/spiral/nyholm-bridge.git", + "reference": "e3d99a09a56450fa42d652bdcc3b96434f92448e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/nyholm-bridge/zipball/e3d99a09a56450fa42d652bdcc3b96434f92448e", + "reference": "e3d99a09a56450fa42d652bdcc3b96434f92448e", + "shasum": "" + }, + "require": { + "nyholm/psr7": "^1.4", + "php": ">=8.1", + "spiral/boot": "^3.0", + "spiral/http": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.20", + "vimeo/psalm": ">=4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spiral\\Nyholm\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Wolfy-J", + "email": "wolfy.jd@gmail.com" + } + ], + "description": "Spiral Framework: Nyholm PSR-7/PSR-17 bridge", + "support": { + "issues": "https://github.com/spiral/nyholm-bridge/issues", + "source": "https://github.com/spiral/nyholm-bridge/tree/v1.3.0" + }, + "time": "2022-09-19T07:50:08+00:00" + }, + { + "name": "spiral/roadrunner", + "version": "v2023.2.2", + "source": { + "type": "git", + "url": "https://github.com/roadrunner-server/roadrunner.git", + "reference": "ed31539895f2c02cb0186eb8eca9ead8eb2c382d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/roadrunner-server/roadrunner/zipball/ed31539895f2c02cb0186eb8eca9ead8eb2c382d", + "reference": "ed31539895f2c02cb0186eb8eca9ead8eb2c382d", + "shasum": "" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov / Wolfy-J", + "email": "wolfy.jd@gmail.com" + }, + { + "name": "Valery Piashchynski", + "homepage": "https://github.com/rustatian" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/roadrunner-server/roadrunner/graphs/contributors" + } + ], + "description": "RoadRunner: High-performance PHP application server and process manager written in Go and powered with plugins", + "homepage": "https://roadrunner.dev/", + "support": { + "chat": "https://discord.gg/V6EK4he", + "docs": "https://roadrunner.dev/docs", + "forum": "https://forum.roadrunner.dev/", + "issues": "https://github.com/roadrunner-server/roadrunner/issues", + "source": "https://github.com/roadrunner-server/roadrunner/tree/v2023.2.2" + }, + "funding": [ + { + "url": "https://github.com/sponsors/roadrunner-server", + "type": "github" + } + ], + "time": "2023-08-10T16:28:24+00:00" + }, + { + "name": "spiral/roadrunner-bridge", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/spiral/roadrunner-bridge.git", + "reference": "aa1716f4b31d05e187853debea6bd686f7cb2cbe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/roadrunner-bridge/zipball/aa1716f4b31d05e187853debea6bd686f7cb2cbe", + "reference": "aa1716f4b31d05e187853debea6bd686f7cb2cbe", + "shasum": "" + }, + "require": { + "grpc/grpc": "^1.42", + "php": ">=8.1", + "php-http/message-factory": "^1.0", + "psr/simple-cache": "3", + "roadrunner-php/app-logger": "^1.0", + "roadrunner-php/centrifugo": "^2.0", + "spiral/framework": "^3.7", + "spiral/roadrunner-grpc": "^3.0", + "spiral/roadrunner-http": "^3.0", + "spiral/roadrunner-jobs": "^4.0", + "spiral/roadrunner-kv": "^4.0", + "spiral/roadrunner-metrics": "^3.0", + "spiral/roadrunner-tcp": "^3.0", + "spiral/scaffolder": "^3.7", + "spiral/serializer": "^3.7" + }, + "require-dev": { + "phpunit/phpunit": "^10.1", + "spiral/nyholm-bridge": "^1.2", + "spiral/testing": "^2.3", + "vimeo/psalm": "^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spiral\\RoadRunnerBridge\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + } + ], + "description": "RoadRunner integration package", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/framework/issues", + "source": "https://github.com/spiral/roadrunner-bridge" + }, + "funding": [ + { + "url": "https://github.com/roadrunner-server", + "type": "github" + } + ], + "time": "2023-08-10T05:54:54+00:00" + }, + { + "name": "spiral/roadrunner-grpc", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/roadrunner-php/grpc.git", + "reference": "fe483cbcf41bb94cc8172a07d96b745f12026f9a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/roadrunner-php/grpc/zipball/fe483cbcf41bb94cc8172a07d96b745f12026f9a", + "reference": "fe483cbcf41bb94cc8172a07d96b745f12026f9a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "google/common-protos": "^3.1", + "google/protobuf": "^3.7", + "php": ">=8.1", + "spiral/goridge": "^4.0", + "spiral/roadrunner": "^2023.1", + "spiral/roadrunner-worker": "^3.0" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.0", + "mockery/mockery": "^1.4", + "phpunit/phpunit": "^10.0", + "vimeo/psalm": ">=5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spiral\\RoadRunner\\GRPC\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/spiral/roadrunner/graphs/contributors" + } + ], + "description": "High-Performance GRPC server for PHP applications", + "homepage": "https://roadrunner.dev/", + "support": { + "chat": "https://discord.gg/V6EK4he", + "docs": "https://roadrunner.dev/docs", + "forum": "https://forum.roadrunner.dev/", + "issues": "https://github.com/roadrunner-server/roadrunner/issues", + "source": "https://github.com/roadrunner-php/grpc/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/roadrunner-server", + "type": "github" + } + ], + "time": "2023-09-14T09:13:40+00:00" + }, + { + "name": "spiral/roadrunner-http", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/roadrunner-php/http.git", + "reference": "c6e6f0a547dbde79408d57e92e0711dd42082c0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/roadrunner-php/http/zipball/c6e6f0a547dbde79408d57e92e0711dd42082c0e", + "reference": "c6e6f0a547dbde79408d57e92e0711dd42082c0e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=8.1", + "psr/http-factory": "^1.0.1", + "psr/http-message": "^1.0.1 || ^2.0", + "spiral/roadrunner": "^2023.1", + "spiral/roadrunner-worker": "^3.0" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.0", + "nyholm/psr7": "^1.3", + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.2", + "vimeo/psalm": "^5.9" + }, + "suggest": { + "spiral/roadrunner-cli": "Provides RoadRunner installation and management CLI tools" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spiral\\RoadRunner\\Http\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Valery Piashchynski", + "homepage": "https://github.com/rustatian" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/roadrunner-server/roadrunner/graphs/contributors" + } + ], + "description": "RoadRunner: HTTP and PSR-7 worker", + "homepage": "https://spiral.dev/", + "support": { + "chat": "https://discord.gg/V6EK4he", + "docs": "https://roadrunner.dev/docs", + "forum": "https://forum.roadrunner.dev/", + "issues": "https://github.com/roadrunner-server/roadrunner/issues", + "source": "https://github.com/roadrunner-php/http/tree/3.1.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/roadrunner-server", + "type": "github" + } + ], + "time": "2023-07-17T16:19:35+00:00" + }, + { + "name": "spiral/roadrunner-jobs", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/roadrunner-php/jobs.git", + "reference": "049efed2803d6bc29961bfb826a12d082e1e3c22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/roadrunner-php/jobs/zipball/049efed2803d6bc29961bfb826a12d082e1e3c22", + "reference": "049efed2803d6bc29961bfb826a12d082e1e3c22", + "shasum": "" + }, + "require": { + "ext-json": "*", + "google/protobuf": "^v3.17", + "php": ">=8.1", + "ramsey/uuid": "^3 || ^4", + "roadrunner-php/roadrunner-api-dto": "^1.0", + "spiral/goridge": "^4.0", + "spiral/roadrunner": "^2023.1", + "spiral/roadrunner-worker": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "roave/security-advisories": "dev-master", + "vimeo/psalm": ">=5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spiral\\RoadRunner\\Jobs\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "Kirill Nesmeyanov (SerafimArts)", + "email": "kirill.nesmeyanov@spiralscout.com" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/spiral/roadrunner/graphs/contributors" + } + ], + "description": "RoadRunner Queues (Jobs) plugin API library", + "homepage": "https://roadrunner.dev/", + "support": { + "chat": "https://discord.gg/V6EK4he", + "docs": "https://roadrunner.dev/docs", + "forum": "https://forum.roadrunner.dev/", + "issues": "https://github.com/roadrunner-server/roadrunner/issues", + "source": "https://github.com/roadrunner-php/jobs/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/roadrunner-server", + "type": "github" + } + ], + "time": "2023-09-14T09:07:58+00:00" + }, + { + "name": "spiral/roadrunner-kv", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/roadrunner-php/kv.git", + "reference": "fca0221f91de80ad7a8c3b03f5d4cdf5bfdf0a4c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/roadrunner-php/kv/zipball/fca0221f91de80ad7a8c3b03f5d4cdf5bfdf0a4c", + "reference": "fca0221f91de80ad7a8c3b03f5d4cdf5bfdf0a4c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "google/protobuf": "^3.7", + "php": ">=8.1", + "psr/simple-cache": "3", + "roadrunner-php/roadrunner-api-dto": "^1.0", + "spiral/goridge": "^4.0", + "spiral/roadrunner": "^2023.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "roave/security-advisories": "dev-master", + "vimeo/psalm": ">=5.8" + }, + "suggest": { + "ext-igbinary": "(>3.1.6) Igbinary serailizer support", + "ext-sodium": "Sodium serailizer support" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spiral\\RoadRunner\\KeyValue\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Wolfy-J", + "email": "wolfy.jd@gmail.com" + }, + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "Kirill Nesmeyanov (SerafimArts)", + "email": "kirill.nesmeyanov@spiralscout.com" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/spiral/roadrunner/graphs/contributors" + } + ], + "description": "RoadRunner kv plugin bridge", + "homepage": "https://roadrunner.dev/", + "support": { + "chat": "https://discord.gg/V6EK4he", + "docs": "https://roadrunner.dev/docs", + "forum": "https://forum.roadrunner.dev/", + "issues": "https://github.com/roadrunner-server/roadrunner/issues", + "source": "https://github.com/roadrunner-php/kv/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/roadrunner-server", + "type": "github" + } + ], + "time": "2023-04-13T12:55:51+00:00" + }, + { + "name": "spiral/roadrunner-metrics", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/roadrunner-php/metrics.git", + "reference": "27331968ecb789f5e9a3c603a4301e85f51f6156" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/roadrunner-php/metrics/zipball/27331968ecb789f5e9a3c603a4301e85f51f6156", + "reference": "27331968ecb789f5e9a3c603a4301e85f51f6156", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "spiral/goridge": "^4.0", + "spiral/roadrunner": "^2023.1" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.0", + "phpunit/phpunit": "^10.0", + "vimeo/psalm": ">=5.8" + }, + "suggest": { + "spiral/roadrunner-cli": "Provides RoadRunner installation and management CLI tools" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spiral\\RoadRunner\\Metrics\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "Kirill Nesmeyanov (SerafimArts)", + "email": "kirill.nesmeyanov@spiralscout.com" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/spiral/roadrunner/graphs/contributors" + } + ], + "description": "RoadRunner: Prometheus metrics RPC", + "homepage": "https://roadrunner.dev/", + "support": { + "chat": "https://discord.gg/V6EK4he", + "docs": "https://roadrunner.dev/docs", + "forum": "https://forum.roadrunner.dev/", + "issues": "https://github.com/roadrunner-server/roadrunner/issues", + "source": "https://github.com/roadrunner-php/metrics/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/roadrunner-server", + "type": "github" + } + ], + "time": "2023-04-13T10:43:10+00:00" + }, + { + "name": "spiral/roadrunner-services", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/roadrunner-php/services.git", + "reference": "9b5cdb6e058e4f6dd378fd0cd685c3677a7e20ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/roadrunner-php/services/zipball/9b5cdb6e058e4f6dd378fd0cd685c3677a7e20ac", + "reference": "9b5cdb6e058e4f6dd378fd0cd685c3677a7e20ac", + "shasum": "" + }, + "require": { + "google/protobuf": "^3.7", + "php": ">=8.1", + "roadrunner-php/roadrunner-api-dto": "^1.1", + "spiral/goridge": "^4.0", + "spiral/roadrunner": "^2023.2" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^10.0", + "vimeo/psalm": ">=5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spiral\\RoadRunner\\Services\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/spiral/roadrunner/graphs/contributors" + } + ], + "description": "RoadRunner services manager", + "homepage": "https://roadrunner.dev/", + "support": { + "chat": "https://discord.gg/V6EK4he", + "docs": "https://roadrunner.dev/docs", + "forum": "https://forum.roadrunner.dev/", + "issues": "https://github.com/roadrunner-server/roadrunner/issues", + "source": "https://github.com/roadrunner-php/services/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/roadrunner-server", + "type": "github" + } + ], + "time": "2023-07-12T07:25:55+00:00" + }, + { + "name": "spiral/roadrunner-tcp", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/roadrunner-php/tcp.git", + "reference": "ee4a060609a7540f60bbce8843704fb915fe6b02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/roadrunner-php/tcp/zipball/ee4a060609a7540f60bbce8843704fb915fe6b02", + "reference": "ee4a060609a7540f60bbce8843704fb915fe6b02", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=8.1", + "spiral/roadrunner": "^2023.1", + "spiral/roadrunner-worker": "^3.0" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.0", + "phpunit/phpunit": "^10.0", + "vimeo/psalm": ">=5.8" + }, + "suggest": { + "spiral/roadrunner-cli": "Provides RoadRunner installation and management CLI tools" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spiral\\RoadRunner\\Tcp\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/spiral/roadrunner/graphs/contributors" + } + ], + "description": "RoadRunner: TCP worker", + "homepage": "https://roadrunner.dev/", + "support": { + "chat": "https://discord.gg/V6EK4he", + "docs": "https://roadrunner.dev/docs", + "forum": "https://forum.roadrunner.dev/", + "issues": "https://github.com/roadrunner-server/roadrunner/issues", + "source": "https://github.com/roadrunner-php/tcp/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/roadrunner-server", + "type": "github" + } + ], + "time": "2023-04-13T10:34:26+00:00" + }, + { + "name": "spiral/roadrunner-worker", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/roadrunner-php/worker.git", + "reference": "97f966a6685809c7fa024b022f953bd1ae3b6135" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/roadrunner-php/worker/zipball/97f966a6685809c7fa024b022f953bd1ae3b6135", + "reference": "97f966a6685809c7fa024b022f953bd1ae3b6135", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0", + "ext-json": "*", + "ext-sockets": "*", + "php": ">=8.1", + "psr/log": "^2.0|^3.0", + "spiral/goridge": "^4.0", + "spiral/roadrunner": "^2023.1" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.0", + "phpunit/phpunit": "^10.0", + "symfony/var-dumper": "^6.3", + "vimeo/psalm": "^5.9" + }, + "suggest": { + "spiral/roadrunner-cli": "Provides RoadRunner installation and management CLI tools" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spiral\\RoadRunner\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Valery Piashchynski", + "homepage": "https://github.com/rustatian" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "homepage": "https://github.com/roxblnfk" + }, + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/roadrunner-server/roadrunner/graphs/contributors" + } + ], + "description": "RoadRunner: PHP worker", + "homepage": "https://spiral.dev/", + "support": { + "chat": "https://discord.gg/V6EK4he", + "docs": "https://roadrunner.dev/docs", + "forum": "https://forum.roadrunner.dev/", + "issues": "https://github.com/roadrunner-server/roadrunner/issues", + "source": "https://github.com/roadrunner-php/worker/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/roadrunner-server", + "type": "github" + } + ], + "time": "2023-04-12T11:16:47+00:00" + }, + { + "name": "spiral/validator", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/spiral/validator.git", + "reference": "f26e6c83c98f0c302c2c64851e37defd4aa4387f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/validator/zipball/f26e6c83c98f0c302c2c64851e37defd4aa4387f", + "reference": "f26e6c83c98f0c302c2c64851e37defd4aa4387f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=8.1", + "spiral/core": "^3.1", + "spiral/files": "^3.1", + "spiral/filters": "^3.1", + "spiral/streams": "^3.1", + "spiral/translator": "^3.1", + "spiral/validation": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.20", + "spiral/hmvc": "^3.1", + "spiral/testing": "^2.0", + "vimeo/psalm": "^4.21" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spiral\\Validator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Nested validation, Checkers, Conditional Validation", + "homepage": "https://spiral.dev", + "support": { + "issues": "https://github.com/spiral/validator/issues", + "source": "https://github.com/spiral/validator" + }, + "time": "2023-03-17T11:34:10+00:00" + }, + { + "name": "symfony/clock", + "version": "v6.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "a74086d3db70d0f06ffd84480daa556248706e98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/a74086d3db70d0f06ffd84480daa556248706e98", + "reference": "a74086d3db70d0f06ffd84480daa556248706e98", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/clock": "^1.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "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": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v6.3.4" + }, + "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-31T11:35:03+00:00" + }, + { + "name": "symfony/console", + "version": "v6.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.3.4" + }, + "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-16T10:10:12+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-06T06:56:43+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/a1b31d88c0e998168ca7792f222cbecee47428c4", + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-26T12:56:25+00:00" + }, + { + "name": "symfony/http-client", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "213e564da4cbf61acc9728d97e666bcdb868c10d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/213e564da4cbf61acc9728d97e666bcdb868c10d", + "reference": "213e564da4cbf61acc9728d97e666bcdb868c10d", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "^3", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.3" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" + }, + "require-dev": { + "amphp/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/stopwatch": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "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 powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-29T15:57:12+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "3b66325d0176b4ec826bffab57c9037d759c31fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/3b66325d0176b4ec826bffab57c9037d759c31fb", + "reference": "3b66325d0176b4ec826bffab57c9037d759c31fb", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + }, + "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 HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/d89611a7830d51b5e118bca38e390dea92f9ea06", + "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/mime": "^6.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/messenger": "^6.2", + "symfony/twig-bridge": "^6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-06T09:47:15+00:00" + }, + { + "name": "symfony/messenger", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/messenger.git", + "reference": "fb29632c2abdc52f4f10f9402f8f93ebb8938234" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/messenger/zipball/fb29632c2abdc52f4f10f9402f8f93ebb8938234", + "reference": "fb29632c2abdc52f4f10f9402f8f93ebb8938234", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/clock": "^6.3" + }, + "conflict": { + "symfony/console": "<6.3", + "symfony/event-dispatcher": "<5.4", + "symfony/event-dispatcher-contracts": "<2.5", + "symfony/framework-bundle": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/serializer": "<5.4" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/console": "^6.3", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/rate-limiter": "^5.4|^6.0", + "symfony/routing": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0", + "symfony/validator": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Messenger\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Roze", + "email": "samuel.roze@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps applications send and receive messages to/from other applications or via message queues", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/messenger/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-29T16:11:24+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/d5179eedf1cb2946dbd760475ebf05c251ef6a6e", + "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/serializer": "~6.2.13|^6.3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-29T06:59:36+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-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-idn", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "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\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.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:30:37+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-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-php72", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", + "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\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.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-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": "symfony/process", + "version": "v6.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.3.4" + }, + "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-07T10:39:22+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/string", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/13d76d0fb049051ed12a04bef4f9de8715bea339", + "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-18T10:38:32+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", + "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.13", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.3.3" + }, + "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-31T07:08:24+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/02c24deb352fb0d79db5486c0c79905a85e37e86", + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-30T17:17:10+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.5.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.5-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2022-10-16T01:01:54+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "amphp/amp", + "version": "v2.6.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "psalm/phar": "^3.11@dev", + "react/promise": "^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ], + "psr-4": { + "Amp\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", + "keywords": [ + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v2.6.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2022-02-20T17:52:18+00:00" + }, + { + "name": "amphp/byte-stream", + "version": "v1.8.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/byte-stream.git", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.4", + "friendsofphp/php-cs-fixer": "^2.3", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^6 || ^7 || ^8", + "psalm/phar": "^3.11.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "http://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2021-03-30T17:13:30+00:00" + }, + { + "name": "composer/pcre", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.1.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-11-17T09:50:14+00:00" + }, + { + "name": "composer/semver", + "version": "3.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": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "support": { + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + }, + "time": "2019-12-04T15:06:13+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", + "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "v1.21-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.0" + }, + "time": "2023-06-12T08:44:38+00:00" + }, + { + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "php": "^7.1 || ^8.0", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "A more advanced JSONRPC implementation", + "support": { + "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", + "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + }, + "time": "2021-06-11T22:34:44+00:00" + }, + { + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.2", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "LanguageServerProtocol\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "PHP classes for the Language Server Protocol", + "keywords": [ + "language", + "microsoft", + "php", + "server" + ], + "support": { + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + }, + "time": "2022-03-02T22:36:06+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "0.5.1", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/b58e5a3933e541dc286cc91fc4f3898bbc6f1623", + "reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^9.5.26 || ^8.5.31", + "theofidry/php-cs-fixer-config": "^1.0", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/0.5.1" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2022-12-24T12:35:10+00:00" + }, + { + "name": "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": "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": "netresearch/jsonmapper", + "version": "v4.2.0", + "source": { + "type": "git", + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "f60565f8c0566a31acf06884cdaa591867ecc956" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/f60565f8c0566a31acf06884cdaa591867ecc956", + "reference": "f60565f8c0566a31acf06884cdaa591867ecc956", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v4.2.0" + }, + "time": "2023-04-09T17:37:40+00:00" + }, + { + "name": "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": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.7.3", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.3" + }, + "time": "2023-08-12T11:01:26+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.24.2", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "bcad8d995980440892759db0c32acae7c8e79442" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bcad8d995980440892759db0c32acae7c8e79442", + "reference": "bcad8d995980440892759db0c32acae7c8e79442", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.2" + }, + "time": "2023-09-26T12:28:12+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "56f33548fe522c8d82da7ff3824b42829d324364" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/56f33548fe522c8d82da7ff3824b42829d324364", + "reference": "56f33548fe522c8d82da7ff3824b42829d324364", + "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.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-09-19T04:59:03+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.3.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/747c3b2038f1139e3dcd9886a3f5a948648b7503", + "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503", + "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.3-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.3.5" + }, + "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-09-19T05:42:37+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": "spatie/array-to-xml", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/array-to-xml.git", + "reference": "f9ab39c808500c347d5a8b6b13310bd5221e39e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/f9ab39c808500c347d5a8b6b13310bd5221e39e7", + "reference": "f9ab39c808500c347d5a8b6b13310bd5221e39e7", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": "^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.2", + "pestphp/pest": "^1.21", + "spatie/pest-plugin-snapshots": "^1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\ArrayToXml\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://freek.dev", + "role": "Developer" + } + ], + "description": "Convert an array to xml", + "homepage": "https://github.com/spatie/array-to-xml", + "keywords": [ + "array", + "convert", + "xml" + ], + "support": { + "source": "https://github.com/spatie/array-to-xml/tree/3.2.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-07-19T18:30:26+00:00" + }, + { + "name": "spiral/testing", + "version": "2.5.0", + "source": { + "type": "git", + "url": "https://github.com/spiral/testing.git", + "reference": "c21734316a897c3f19e7b28ce5ef7399903e315c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spiral/testing/zipball/c21734316a897c3f19e7b28ce5ef7399903e315c", + "reference": "c21734316a897c3f19e7b28ce5ef7399903e315c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "mockery/mockery": "^1.5", + "nyholm/psr7": "^1.5", + "php": ">=8.1", + "phpunit/phpunit": "^9.6 || ^10.0", + "spiral/auth": "^3.7", + "spiral/auth-http": "^3.7", + "spiral/boot": "^3.7", + "spiral/console": "^3.7", + "spiral/events": "^3.7", + "spiral/http": "^3.7", + "spiral/mailer": "^3.7", + "spiral/queue": "^3.7", + "spiral/scaffolder": "^3.7", + "spiral/security": "^3.7", + "spiral/session": "^3.7", + "spiral/storage": "^3.7", + "spiral/tokenizer": "^3.7", + "spiral/translator": "^3.7", + "spiral/views": "^3.7", + "symfony/mime": "^6.0" + }, + "require-dev": { + "spiral-packages/league-event": "^1.0.1", + "spiral/nyholm-bridge": "^1.2", + "spiral/roadrunner-bridge": "^2.2 || ^3.0", + "vimeo/psalm": "^5.9" + }, + "suggest": { + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "ext-gd": "Required to use generate fake image files" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spiral\\Testing\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Titov (wolfy-j)", + "email": "wolfy-j@spiralscout.com" + }, + { + "name": "Pavel Buchnev (butschster)", + "email": "pavel.buchnev@spiralscout.com" + }, + { + "name": "Aleksei Gagarin (roxblnfk)", + "email": "alexey.gagarin@spiralscout.com" + }, + { + "name": "Maksim Smakouz (msmakouz)", + "email": "maksim.smakouz@spiralscout.com" + }, + { + "name": "RoadRunner Community", + "homepage": "https://github.com/spiral/roadrunner/graphs/contributors" + } + ], + "description": "Spiral Framework testing SDK", + "homepage": "https://spiral.dev/", + "keywords": [ + "spiral", + "spiral-packages", + "testing" + ], + "support": { + "chat": "https://discord.gg/TFeEmCs", + "docs": "https://spiral.dev/docs/testing-start", + "forum": "https://forum.roadrunner.dev/", + "issues": "https://github.com/spiral/testing/issues", + "source": "https://github.com/spiral/testing/tree/2.5.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/roadrunner-server", + "type": "github" + } + ], + "time": "2023-09-20T11:00:47+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.3.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-06-01T08:30:39+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3d9999376be5fea8de47752837a3e1d1c5f69ef5", + "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-09-12T10:11:35+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + }, + { + "name": "vimeo/psalm", + "version": "5.15.0", + "source": { + "type": "git", + "url": "https://github.com/vimeo/psalm.git", + "reference": "5c774aca4746caf3d239d9c8cadb9f882ca29352" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/5c774aca4746caf3d239d9c8cadb9f882ca29352", + "reference": "5c774aca4746caf3d239d9c8cadb9f882ca29352", + "shasum": "" + }, + "require": { + "amphp/amp": "^2.4.2", + "amphp/byte-stream": "^1.5", + "composer-runtime-api": "^2", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^2.0 || ^3.0", + "dnoegel/php-xdg-base-dir": "^0.1.1", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "felixfbecker/advanced-json-rpc": "^3.1", + "felixfbecker/language-server-protocol": "^1.5.2", + "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^4.16", + "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", + "sebastian/diff": "^4.0 || ^5.0", + "spatie/array-to-xml": "^2.17.0 || ^3.0", + "symfony/console": "^4.1.6 || ^5.0 || ^6.0", + "symfony/filesystem": "^5.4 || ^6.0" + }, + "conflict": { + "nikic/php-parser": "4.17.0" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "amphp/phpunit-util": "^2.0", + "bamarni/composer-bin-plugin": "^1.4", + "brianium/paratest": "^6.9", + "ext-curl": "*", + "mockery/mockery": "^1.5", + "nunomaduro/mock-final-classes": "^1.1", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpdoc-parser": "^1.6", + "phpunit/phpunit": "^9.6", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.6", + "symfony/process": "^4.4 || ^5.0 || ^6.0" + }, + "suggest": { + "ext-curl": "In order to send data to shepherd", + "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + }, + "bin": [ + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev", + "dev-4.x": "4.x-dev", + "dev-3.x": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psalm\\": "src/Psalm/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Brown" + } + ], + "description": "A static analysis tool for finding errors in PHP applications", + "keywords": [ + "code", + "inspection", + "php", + "static analysis" + ], + "support": { + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm/tree/5.15.0" + }, + "time": "2023-08-20T23:07:30+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "spiral-packages/cqrs": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=8.2", + "ext-mbstring": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/frontend/api/rest.js b/frontend/api/rest.js index 2da8f45..298c54f 100644 --- a/frontend/api/rest.js +++ b/frontend/api/rest.js @@ -41,6 +41,13 @@ const jobsPipelineResume = ({$axios}) => async (server, pipeline) => $axios.$pos }) .then((response) => response.status) +// Informer +const addWorker = ({$axios}) => async (server, plugin) => $axios.$post(`/informer/worker`, {server, plugin}) + .then((response) => response.status) + +const removeWorker = ({$axios}) => async (server, plugin) => $axios.$delete(`/informer/worker`, {server, plugin}) + .then((response) => response.status) + // Services const servicesList = ({$axios}) => async (server) => $axios.$get(`/services?server=${server}`) .then((response) => response.data.services) @@ -81,5 +88,7 @@ export default { metricsGet, metricsGeByKey, settingsGet, - settingsStore + settingsStore, + addWorker, + removeWorker, } diff --git a/frontend/api/ws.js b/frontend/api/ws.js index f7f22f6..154c84d 100644 --- a/frontend/api/ws.js +++ b/frontend/api/ws.js @@ -1,58 +1,65 @@ // Servers -const serversList = ({$ws}) => async () => $ws.rpc('get:servers') +const serversList = ({$ws}) => async () => $ws.rpc('get:v1/servers') .then((response) => { return { - servers: response.data.data.servers, + servers: response.data.data, default: response.data.default } }) -const serverRegister = ({$ws}) => async (name, address) => $ws.rpc('post:server/register', {name, address}) +const serverRegister = ({$ws}) => async (name, address) => $ws.rpc('post:v1/server/register', {name, address}) // Roadrunner -const configGet = ({$ws}) => async (server) => $ws.rpc(`get:rr/config`, {server}) - .then((response) => response.data.config) -const versionGet = ({$ws}) => async (server) => $ws.rpc(`get:rr/version`, {server}) +const configGet = ({$ws}) => async (server) => $ws.rpc(`get:v1/server/config`, {server}) + .then((response) => response.data.data) +const versionGet = ({$ws}) => async (server) => $ws.rpc(`get:v1/server/version`, {server}) .then((response) => response.data.version || '0.0.0') // Plugins -const pluginsList = ({$ws}) => async (server) => $ws.rpc(`get:plugins`, {server}) +const pluginsList = ({$ws}) => async (server) => $ws.rpc(`get:v1/plugins`, {server}) .then((response) => response.data.data) -const pluginReset = ({$ws}) => async (server, plugin) => $ws.rpc(`post:plugin/reset`, {server, plugin}) +const pluginReset = ({$ws}) => async (server, plugin) => $ws.rpc(`post:v1/plugin/reset`, {server, plugin}) .then((response) => response.data.status) -const pluginWorkers = ({$ws}) => async (server, plugin) => $ws.rpc(`get:plugin/workers`, {server, plugin}) +const pluginWorkers = ({$ws}) => async (server, plugin) => $ws.rpc(`get:v1/plugin/workers`, {server, plugin}) .then((response) => response.data.data || []) // Jobs -const jobsPipelines = ({$ws}) => async (server) => $ws.rpc(`get:jobs/pipelines`, {server}) +const jobsPipelines = ({$ws}) => async (server) => $ws.rpc(`get:v1/jobs/pipelines`, {server}) .then((response) => response.data.data) -const jobsPipelinePause = ({$ws}) => async (server, pipeline) => $ws.rpc(`post:jobs/pipeline/pause`, { +const jobsPipelinePause = ({$ws}) => async (server, pipeline) => $ws.rpc(`post:v1/jobs/pipeline/pause`, { server, pipeline }) .then((response) => response.data.status) -const jobsPipelineResume = ({$ws}) => async (server, pipeline) => $ws.rpc(`post:jobs/pipeline/resume`, { +const jobsPipelineResume = ({$ws}) => async (server, pipeline) => $ws.rpc(`post:v1/jobs/pipeline/resume`, { server, pipeline }) .then((response) => response.data.status) +// Informer +const addWorker = ({$ws}) => async (server, plugin) => $ws.rpc(`post:v1/plugin/worker`, {server, plugin}) + .then((response) => response.data.status) + +const removeWorker = ({$ws}) => async (server, plugin) => $ws.rpc(`delete:v1/plugin/worker`, {server, plugin}) + .then((response) => response.data.status) + // Services -const servicesList = ({$ws}) => async (server) => $ws.rpc(`get:services`, {server}) - .then((response) => response.data.data.services) +const servicesList = ({$ws}) => async (server) => $ws.rpc(`get:v1/services`, {server}) + .then((response) => response.data.data) -const serviceStatus = ({$ws}) => async (server, service) => $ws.rpc(`get:service/status`, {server, service}) - .then((response) => response.data.data.statuses) +const serviceStatus = ({$ws}) => async (server, service) => $ws.rpc(`get:v1/service/status`, {server, service}) + .then((response) => response.data.data) -const servicesTerminate = ({$ws}) => async (server, service) => $ws.rpc(`post:service/terminate`, {server, service}) -const servicesRestart = ({$ws}) => async (server, service) => $ws.rpc(`post:service/restart`, {server, service}) +const servicesTerminate = ({$ws}) => async (server, service) => $ws.rpc(`post:v1/service/terminate`, {server, service}) +const servicesRestart = ({$ws}) => async (server, service) => $ws.rpc(`post:v1/service/restart`, {server, service}) // Metrics -const metricsGet = ({$ws}) => async (server) => $ws.rpc(`get:metrics`, {server}) +const metricsGet = ({$ws}) => async (server) => $ws.rpc(`get:v1/metrics`, {server}) .then((response) => { return { metrics: response.data.data, @@ -60,17 +67,17 @@ const metricsGet = ({$ws}) => async (server) => $ws.rpc(`get:metrics`, {server}) } }) -const metricsGetByKey = ({$ws}) => async (server, key, tags) => $ws.rpc(`get:metrics/${key}`, {server, tag: tags}) +const metricsGetByKey = ({$ws}) => async (server, key, tags) => $ws.rpc(`get:v1/metrics/${key}`, {server, tag: tags}) .then((response) => response.data.data) -const metricsGetRangeByKey = ({$ws}) => async (server, key, tags) => $ws.rpc(`get:metrics/${key}/range`, {server, tag: tags}) +const metricsGetRangeByKey = ({$ws}) => async (server, key, tags) => $ws.rpc(`get:v1/metrics/${key}/range`, {server, tag: tags}) .then((response) => response.data.data) // Settings -const settingsGet = ({$ws}) => async () => $ws.rpc(`get:settings`) +const settingsGet = ({$ws}) => async () => $ws.rpc(`get:v1/settings`) .then((response) => response.data.settings) -const settingsStore = ({$ws}) => async (settings) => $ws.rpc(`post:settings`, {settings}) +const settingsStore = ({$ws}) => async (settings) => $ws.rpc(`post:v1/settings`, {settings}) export default { serversList, @@ -91,5 +98,7 @@ export default { metricsGetByKey, metricsGetRangeByKey, settingsGet, - settingsStore + settingsStore, + addWorker, + removeWorker, } diff --git a/frontend/components/Jobs/Pipeline.vue b/frontend/components/Jobs/Pipeline.vue index f0fd1a9..550610c 100644 --- a/frontend/components/Jobs/Pipeline.vue +++ b/frontend/components/Jobs/Pipeline.vue @@ -4,24 +4,24 @@
{{ pipeline.name }} - Consuming - Paused + Consuming + Paused
- Driver - {{ pipeline.driver }} - Priority - {{ pipeline.priority }} - Active jobs - {{ pipeline.active }} - Delayed jobs - {{ pipeline.delayed }} - Reserved jobs - {{ pipeline.reserved }} + Driver - {{ pipeline.driver }} + Priority - {{ pipeline.priority }} + Active jobs - {{ pipeline.active }} + Delayed jobs - {{ pipeline.delayed }} + Reserved jobs - {{ pipeline.reserved }}
diff --git a/frontend/components/Jobs/Pipelines.vue b/frontend/components/Jobs/Pipelines.vue index d63a67d..646653d 100644 --- a/frontend/components/Jobs/Pipelines.vue +++ b/frontend/components/Jobs/Pipelines.vue @@ -2,7 +2,6 @@

Pipelines

-
- There are no available Jobs pipelines on {{ server }} server. diff --git a/frontend/components/Metrics/CreateChart.vue b/frontend/components/Metrics/CreateChart.vue index 915ac8a..07a853d 100644 --- a/frontend/components/Metrics/CreateChart.vue +++ b/frontend/components/Metrics/CreateChart.vue @@ -8,7 +8,7 @@ Create - + Clear @@ -23,7 +23,7 @@
- - - - + class="mb-4"/> +
@@ -24,8 +21,6 @@ export default { } } - -