From af6c0d97b412fa8b434427aec35a34060732c6c9 Mon Sep 17 00:00:00 2001 From: "iVampireSP.com" Date: Thu, 5 Jan 2023 22:12:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=88=B0=20php8.2=20?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Commands/Cluster/Upload.php | 40 +-- app/Console/Commands/Cluster/Work.php | 106 +++--- .../Controllers/Admin/ModuleController.php | 25 +- app/Http/Controllers/Api/ServerController.php | 3 +- app/Http/Middleware/TrustProxies.php | 2 - app/Models/Balance.php | 50 +-- app/Models/User.php | 32 +- app/Models/WorkOrder/Reply.php | 64 ++-- app/Models/WorkOrder/WorkOrder.php | 92 +++--- app/Providers/AppServiceProvider.php | 1 - app/Support/Cluster.php | 70 ++-- composer.json | 2 +- composer.lock | 303 +++++++++--------- 13 files changed, 402 insertions(+), 388 deletions(-) diff --git a/app/Console/Commands/Cluster/Upload.php b/app/Console/Commands/Cluster/Upload.php index 681369a..504ff2d 100644 --- a/app/Console/Commands/Cluster/Upload.php +++ b/app/Console/Commands/Cluster/Upload.php @@ -82,24 +82,9 @@ public function handle(): int return CommandAlias::SUCCESS; } - public function addFileToZip(string $path, ZipArchive $zip): void - { - $handler = opendir($path); - while (($filename = readdir($handler)) !== false) { - if ($filename != '.' && $filename != '..') { - if (is_dir($path . '/' . $filename)) { - $this->addFileToZip($path . '/' . $filename, $zip); - } else { - $zip->addFile($path . '/' . $filename); - } - } - } - @closedir($handler); - } - public function upload($node_type) { - $this->warn("正在上传 ${node_type} 文件。"); + $this->warn("正在上传 {$node_type} 文件。"); $this->info('正在打包 config 目录。'); if ($node_type === 'master') { @@ -114,12 +99,12 @@ public function upload($node_type) $this->info('正在上传 config 目录。'); - $cache_key = "${node_type}_config_zip"; + $cache_key = "{$node_type}_config_zip"; Cluster::forever($cache_key, file_get_contents($cacheZip)); // md5 $this->info('正在报告 cache 目录的 MD5 值。'); - $cache_md5_key = "${node_type}_config_zip_md5"; + $cache_md5_key = "{$node_type}_config_zip_md5"; Cluster::forever($cache_md5_key, md5_file($cacheZip)); unlink($cacheZip); @@ -127,14 +112,29 @@ public function upload($node_type) // 上传 .env 文件 $this->info('正在上传 .env 文件。'); - $env_key = "${node_type}_env"; + $env_key = "{$node_type}_env"; Cluster::forever($env_key, file_get_contents(base_path('.env'))); // 上传 .env 文件的 MD5 $this->info('正在报告 .env 文件的 MD5 值。'); - $env_md5_key = "${node_type}_env_md5"; + $env_md5_key = "{$node_type}_env_md5"; Cluster::forever($env_md5_key, md5_file(base_path('.env'))); $this->info('完成。'); } + + public function addFileToZip(string $path, ZipArchive $zip): void + { + $handler = opendir($path); + while (($filename = readdir($handler)) !== false) { + if ($filename != '.' && $filename != '..') { + if (is_dir($path . '/' . $filename)) { + $this->addFileToZip($path . '/' . $filename, $zip); + } else { + $zip->addFile($path . '/' . $filename); + } + } + } + @closedir($handler); + } } diff --git a/app/Console/Commands/Cluster/Work.php b/app/Console/Commands/Cluster/Work.php index 6001347..4f0e8c2 100644 --- a/app/Console/Commands/Cluster/Work.php +++ b/app/Console/Commands/Cluster/Work.php @@ -137,6 +137,59 @@ public function handle(): int return CommandAlias::SUCCESS; } + private function pipeCommand($command): void + { + $descriptor_spec = [ + 0 => ['pipe', 'r'], + 1 => ['pipe', 'w'], + 2 => ['pipe', 'w'], + ]; + + $pipes = []; + $process = proc_open($command, $descriptor_spec, $pipes); + + if (is_resource($process)) { + while ($s = fgets($pipes[1])) { + echo $s; + } + } + + // 命令结束后,关闭管道 + fclose($pipes[0]); + + fclose($pipes[1]); + + fclose($pipes[2]); + + // 关闭进程 + + proc_close($process); + + } + + private function report(): void + { + $this->info('正在报告此系统,请保持此命令一直运行。'); + + Artisan::call('config:cache'); + + $cpu = $this->getCpuUsage(); + + while (1) { + Cluster::publish('system_usage', [ + 'cpu' => $cpu, + ]); + + sleep(1); + } + } + + private function getCpuUsage(): float + { + // 获取 CPU 使用率 + $cpu = sys_getloadavg(); + return $cpu[0]; + } private function work(): void { @@ -187,57 +240,4 @@ private function dispatchEvent($event, $message = []): void $events[$event]($message); } } - - private function report(): void - { - $this->info('正在报告此系统,请保持此命令一直运行。'); - - Artisan::call('config:cache'); - - $cpu = $this->getCpuUsage(); - - while (1) { - Cluster::publish('system_usage', [ - 'cpu' => $cpu, - ]); - - sleep(1); - } - } - - private function getCpuUsage(): float - { - // 获取 CPU 使用率 - $cpu = sys_getloadavg(); - return $cpu[0]; - } - - private function pipeCommand($command): void - { - $descriptor_spec = [ - 0 => ['pipe', 'r'], - 1 => ['pipe', 'w'], - 2 => ['pipe', 'w'], - ]; - - $process = proc_open($command, $descriptor_spec, $pipes); - - if (is_resource($process)) { - while ($s = fgets($pipes[1])) { - echo $s; - } - } - - // 命令结束后,关闭管道 - fclose($pipes[0]); - - fclose($pipes[1]); - - fclose($pipes[2]); - - // 关闭进程 - - proc_close($process); - - } } diff --git a/app/Http/Controllers/Admin/ModuleController.php b/app/Http/Controllers/Admin/ModuleController.php index 388c82e..c63a919 100644 --- a/app/Http/Controllers/Admin/ModuleController.php +++ b/app/Http/Controllers/Admin/ModuleController.php @@ -66,6 +66,16 @@ public function store(Request $request): RedirectResponse } + private function rules(): array + { + return [ + 'id' => 'required|string|max:255', + 'name' => 'required|string|max:255', + 'url' => 'required|url', + 'status' => 'required|string|in:up,down,maintenance', + ]; + } + /** * Display the specified resource. * @@ -165,6 +175,9 @@ public function allows_store(Request $request, Module $module) return back()->with('success', '已信任该模块。'); } + + // fast login + public function allows_destroy(Module $module, ModuleAllow $allow) { $allow->delete(); @@ -172,8 +185,6 @@ public function allows_destroy(Module $module, ModuleAllow $allow) return redirect()->route('admin.modules.allows', $module)->with('success', '取消信任完成。'); } - - // fast login public function fast_login(Module $module): View|RedirectResponse { $resp = $module->baseRequest('post', 'fast-login', []); @@ -185,14 +196,4 @@ public function fast_login(Module $module): View|RedirectResponse return redirect()->route('admin.modules.show', $module)->with('error', '快速登录失败,可能是模块不支持。'); } } - - private function rules(): array - { - return [ - 'id' => 'required|string|max:255', - 'name' => 'required|string|max:255', - 'url' => 'required|url', - 'status' => 'required|string|in:up,down,maintenance', - ]; - } } diff --git a/app/Http/Controllers/Api/ServerController.php b/app/Http/Controllers/Api/ServerController.php index 4a64886..27725e2 100644 --- a/app/Http/Controllers/Api/ServerController.php +++ b/app/Http/Controllers/Api/ServerController.php @@ -23,7 +23,8 @@ public function module_reports(Request $request) return $this->success($servers); } - public function nodes() { + public function nodes() + { $nodes = Cluster::nodes(true); $current_node_id = Cluster::currentNode()['id']; diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index e2755da..cd8ae59 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -2,9 +2,7 @@ namespace App\Http\Middleware; -use Closure; use Illuminate\Http\Middleware\TrustProxies as Middleware; -use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Request as RequestAlias; class TrustProxies extends Middleware diff --git a/app/Models/Balance.php b/app/Models/Balance.php index bde3bac..07fa4d0 100644 --- a/app/Models/Balance.php +++ b/app/Models/Balance.php @@ -77,31 +77,6 @@ class Balance extends Model 'amount' => 'decimal:2', ]; - public function user(): BelongsToAlias - { - return $this->belongsTo(User::class); - } - - public function scopeThisUser($query) - { - return $query->where('user_id', auth()->id()); - } - - public function isPaid(): bool - { - return $this->paid_at !== null; - } - - public function isOverdue(): bool - { - return $this->created_at->diffInDays(now()) > 1 && !$this->isPaid(); - } - - public function canPay(): bool - { - return !$this->isPaid() && !$this->isOverdue(); - } - protected static function boot() { parent::boot(); @@ -113,4 +88,29 @@ protected static function boot() $balance->order_id = date('YmdHis') . $balance->id . rand(1000, 9999); }); } + + public function user(): BelongsToAlias + { + return $this->belongsTo(User::class); + } + + public function scopeThisUser($query) + { + return $query->where('user_id', auth()->id()); + } + + public function canPay(): bool + { + return !$this->isPaid() && !$this->isOverdue(); + } + + public function isPaid(): bool + { + return $this->paid_at !== null; + } + + public function isOverdue(): bool + { + return $this->created_at->diffInDays(now()) > 1 && !$this->isPaid(); + } } diff --git a/app/Models/User.php b/app/Models/User.php index 002735d..1346b66 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -124,22 +124,6 @@ class User extends Authenticatable 'birthday_at' => 'date', ]; - public function hosts(): HasMany - { - return $this->hasMany(Host::class); - } - - public function user_group(): BelongsTo - { - return $this->belongsTo(UserGroup::class); - } - - public function scopeBirthday() - { - return $this->select(['id', 'name', 'birthday_at', 'email_md5', 'created_at'])->whereMonth('birthday_at', now()->month) - ->whereDay('birthday_at', now()->day); - } - protected static function boot() { parent::boot(); @@ -159,4 +143,20 @@ protected static function boot() } }); } + + public function hosts(): HasMany + { + return $this->hasMany(Host::class); + } + + public function user_group(): BelongsTo + { + return $this->belongsTo(UserGroup::class); + } + + public function scopeBirthday() + { + return $this->select(['id', 'name', 'birthday_at', 'email_md5', 'created_at'])->whereMonth('birthday_at', now()->month) + ->whereDay('birthday_at', now()->day); + } } diff --git a/app/Models/WorkOrder/Reply.php b/app/Models/WorkOrder/Reply.php index 887cc09..b1f44eb 100644 --- a/app/Models/WorkOrder/Reply.php +++ b/app/Models/WorkOrder/Reply.php @@ -73,38 +73,6 @@ class Reply extends Model 'role' ]; - public function scopeWorkOrderId($query, $work_order_id) - { - return $query->where('work_order_id', $work_order_id); - } - - public function scopeWithUser($query) - { - return $query->with(['user' => function ($query) { - $query->select('id', 'name', 'email_md5'); - }]); - } - - public function workOrder(): BelongsTo - { - return $this->belongsTo(WorkOrder::class, 'work_order_id', 'id'); - } - - public function module(): BelongsTo - { - return $this->belongsTo(Module::class); - } - - public function user(): BelongsTo - { - return $this->belongsTo(User::class); - } - - public function safeDelete(): void - { - dispatch(new \App\Jobs\Module\WorkOrder\Reply($this, 'delete')); - } - protected static function boot() { parent::boot(); @@ -159,4 +127,36 @@ protected static function boot() dispatch(new \App\Jobs\Module\WorkOrder\Reply($model, 'patch')); }); } + + public function scopeWorkOrderId($query, $work_order_id) + { + return $query->where('work_order_id', $work_order_id); + } + + public function scopeWithUser($query) + { + return $query->with(['user' => function ($query) { + $query->select('id', 'name', 'email_md5'); + }]); + } + + public function workOrder(): BelongsTo + { + return $this->belongsTo(WorkOrder::class, 'work_order_id', 'id'); + } + + public function module(): BelongsTo + { + return $this->belongsTo(Module::class); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function safeDelete(): void + { + dispatch(new \App\Jobs\Module\WorkOrder\Reply($this, 'delete')); + } } diff --git a/app/Models/WorkOrder/WorkOrder.php b/app/Models/WorkOrder/WorkOrder.php index 0b8a0fa..b71bbd9 100644 --- a/app/Models/WorkOrder/WorkOrder.php +++ b/app/Models/WorkOrder/WorkOrder.php @@ -89,6 +89,52 @@ class WorkOrder extends Model 'notify' => 'boolean' ]; + protected static function boot() + { + parent::boot(); + + static::creating(function (self $model) { + $model->uuid = Str::uuid()->toString(); + + if ($model->host_id) { + $model->load(['host']); + $model->module_id = $model->host->module_id; + } + + if (auth('sanctum')->check()) { + $model->user_id = auth()->id(); + + if ($model->host_id) { + if (!$model->user_id == $model->host->user_id) { + throw new CommonException('user_id not match host user_id'); + } + } + } else { + if (!$model->user_id) { + throw new CommonException('user_id is required'); + } + } + + if ($model->host_id) { + $model->host->load('module'); + $module = $model->host->module; + + if ($module === null) { + $model->status = 'open'; + } else { + $model->status = 'pending'; + } + } + + $model->notify = true; + }); + + // updated + static::updated(function ($model) { + dispatch(new WorkOrderJob($model, 'put')); + }); + } + public function scopeThisModule($query) { return $query->where('module_id', auth('module')->id()); @@ -147,50 +193,4 @@ public function safeDelete(): bool return true; } - - protected static function boot() - { - parent::boot(); - - static::creating(function (self $model) { - $model->uuid = Str::uuid()->toString(); - - if ($model->host_id) { - $model->load(['host']); - $model->module_id = $model->host->module_id; - } - - if (auth('sanctum')->check()) { - $model->user_id = auth()->id(); - - if ($model->host_id) { - if (!$model->user_id == $model->host->user_id) { - throw new CommonException('user_id not match host user_id'); - } - } - } else { - if (!$model->user_id) { - throw new CommonException('user_id is required'); - } - } - - if ($model->host_id) { - $model->host->load('module'); - $module = $model->host->module; - - if ($module === null) { - $model->status = 'open'; - } else { - $model->status = 'pending'; - } - } - - $model->notify = true; - }); - - // updated - static::updated(function ($model) { - dispatch(new WorkOrderJob($model, 'put')); - }); - } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index f4d3525..1ae9788 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,7 +2,6 @@ namespace App\Providers; -use App\Http\Middleware\TrustProxies; use App\Models\PersonalAccessToken; use Illuminate\Pagination\Paginator; use Illuminate\Support\Facades\Http; diff --git a/app/Support/Cluster.php b/app/Support/Cluster.php index ff78403..34ce0f3 100644 --- a/app/Support/Cluster.php +++ b/app/Support/Cluster.php @@ -9,6 +9,11 @@ class Cluster public static string $prefix = 'cluster:'; + public static function isCluster(): bool + { + return self::isMaster() || self::isSlave(); + } + public static function isMaster(): bool { return config('settings.node.type') === 'master'; @@ -19,11 +24,6 @@ public static function isSlave(): bool return config('settings.node.type') === 'slave'; } - public static function isCluster(): bool - { - return self::isMaster() || self::isSlave(); - } - public static function publish($event, $data = []): void { Redis::publish('cluster_ready', json_encode([ @@ -40,6 +40,28 @@ public static function publish($event, $data = []): void self::registerThisNode(false); } + public static function registerThisNode($report = true): void + { + $node_id = config('settings.node.id'); + + Cluster::hset('nodes', $node_id, [ + 'type' => config('settings.node.type'), + 'id' => $node_id, + 'ip' => config('settings.node.ip'), + // utc +8 timestamp + 'last_heartbeat' => time(), + ]); + + if ($report) { + Cluster::publish('node.ok'); + } + } + + public static function hset($key, $value, $data = []): void + { + Redis::hset(self::$prefix . $key, $value, json_encode($data)); + } + /** * @param string|array $events 事件名称 * @param $callback callable 回调函数,接收一个参数,为事件数据。 @@ -71,21 +93,11 @@ public static function listen(string|array $events, callable $callback, bool $ig }); } - public static function hset($key, $value, $data = []): void - { - Redis::hset(self::$prefix . $key, $value, json_encode($data)); - } - public static function get($key, $default = null): string|array|null { return Redis::get(self::$prefix . $key, $default); } - public static function set($key, $value, $ttl = null): void - { - Redis::set(self::$prefix . $key, $value, $ttl); - } - public static function forget($key): void { Redis::forget(self::$prefix . $key); @@ -97,6 +109,11 @@ public static function forever($key, $value): void self::set($key, $value, -1); } + public static function set($key, $value, $ttl = null): void + { + Redis::set(self::$prefix . $key, $value, $ttl); + } + public static function hget($key, $hashKey, $default = []): string|array|null { $value = Redis::hget(self::$prefix . $key, $hashKey); @@ -104,13 +121,6 @@ public static function hget($key, $hashKey, $default = []): string|array|null return $value ?: $default; } - public static function hgetAll($hashKey, $default = []): array - { - $value = Redis::hgetall(self::$prefix . $hashKey); - - return $value ?: $default; - } - public static function nodes($hide_ip = false): array { $nodes = self::hgetAll('nodes'); @@ -126,21 +136,11 @@ public static function nodes($hide_ip = false): array return $nodes; } - public static function registerThisNode($report = true): void + public static function hgetAll($hashKey, $default = []): array { - $node_id = config('settings.node.id'); + $value = Redis::hgetall(self::$prefix . $hashKey); - Cluster::hset('nodes', $node_id, [ - 'type' => config('settings.node.type'), - 'id' => $node_id, - 'ip' => config('settings.node.ip'), - // utc +8 timestamp - 'last_heartbeat' => time(), - ]); - - if ($report) { - Cluster::publish('node.ok'); - } + return $value ?: $default; } public static function currentNode() diff --git a/composer.json b/composer.json index 415410c..dee5dd8 100644 --- a/composer.json +++ b/composer.json @@ -8,7 +8,7 @@ ], "license": "MIT", "require": { - "php": "^8.1", + "php": "^8.2", "ext-zip": "^1.19", "doctrine/dbal": "^3.4", "erusev/parsedown": "^1.7", diff --git a/composer.lock b/composer.lock index 89d3b23..a5df79a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "81fa8fb300376dbf0ae3eb8771d2018f", + "content-hash": "7354c998d6e06ecf6a4dd7c044db632e", "packages": [ { "name": "bacon/bacon-qr-code", @@ -813,16 +813,16 @@ }, { "name": "doctrine/lexer", - "version": "1.2.3", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", "shasum": "", "mirrors": [ { @@ -832,18 +832,20 @@ ] }, "require": { + "doctrine/deprecations": "^1.0", "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9.0", + "doctrine/coding-standard": "^9 || ^10", "phpstan/phpstan": "^1.3", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.0" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -875,7 +877,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.3" + "source": "https://github.com/doctrine/lexer/tree/2.1.0" }, "funding": [ { @@ -891,7 +893,7 @@ "type": "tidelift" } ], - "time": "2022-02-28T11:07:21+00:00" + "time": "2022-12-14T08:49:07+00:00" }, { "name": "dragonmantank/cron-expression", @@ -962,16 +964,16 @@ }, { "name": "egulias/email-validator", - "version": "3.2.1", + "version": "3.2.4", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715" + "reference": "5f35e41eba05fdfbabd95d72f83795c835fb7ed2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/f88dcf4b14af14a98ad96b14b2b317969eab6715", - "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/5f35e41eba05fdfbabd95d72f83795c835fb7ed2", + "reference": "5f35e41eba05fdfbabd95d72f83795c835fb7ed2", "shasum": "", "mirrors": [ { @@ -981,7 +983,7 @@ ] }, "require": { - "doctrine/lexer": "^1.2", + "doctrine/lexer": "^1.2|^2", "php": ">=7.2", "symfony/polyfill-intl-idn": "^1.15" }, @@ -1024,7 +1026,7 @@ ], "support": { "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/3.2.1" + "source": "https://github.com/egulias/EmailValidator/tree/3.2.4" }, "funding": [ { @@ -1032,7 +1034,7 @@ "type": "github" } ], - "time": "2022-06-18T20:57:19+00:00" + "time": "2022-12-30T14:09:25+00:00" }, { "name": "erusev/parsedown", @@ -3156,16 +3158,16 @@ }, { "name": "nesbot/carbon", - "version": "2.64.0", + "version": "2.64.1", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "889546413c97de2d05063b8cb7b193c2531ea211" + "reference": "f2e59963f4c4f4fdfb9fcfd752e8d2e2b79a4e2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/889546413c97de2d05063b8cb7b193c2531ea211", - "reference": "889546413c97de2d05063b8cb7b193c2531ea211", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f2e59963f4c4f4fdfb9fcfd752e8d2e2b79a4e2c", + "reference": "f2e59963f4c4f4fdfb9fcfd752e8d2e2b79a4e2c", "shasum": "", "mirrors": [ { @@ -3260,7 +3262,7 @@ "type": "tidelift" } ], - "time": "2022-11-26T17:36:00+00:00" + "time": "2023-01-01T23:17:36+00:00" }, { "name": "nette/schema", @@ -4663,16 +4665,16 @@ }, { "name": "ramsey/collection", - "version": "1.2.2", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + "reference": "ad7475d1c9e70b190ecffc58f2d989416af339b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "url": "https://api.github.com/repos/ramsey/collection/zipball/ad7475d1c9e70b190ecffc58f2d989416af339b4", + "reference": "ad7475d1c9e70b190ecffc58f2d989416af339b4", "shasum": "", "mirrors": [ { @@ -4682,29 +4684,40 @@ ] }, "require": { - "php": "^7.3 || ^8", + "php": "^7.4 || ^8.0", "symfony/polyfill-php81": "^1.23" }, "require-dev": { - "captainhook/captainhook": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "ergebnis/composer-normalize": "^2.6", - "fakerphp/faker": "^1.5", - "hamcrest/hamcrest-php": "^2", - "jangregor/phpstan-prophecy": "^0.8", - "mockery/mockery": "^1.3", + "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", - "phpstan/phpstan": "^0.12.32", - "phpstan/phpstan-mockery": "^0.12.5", - "phpstan/phpstan-phpunit": "^0.12.11", - "phpunit/phpunit": "^8.5 || ^9", - "psy/psysh": "^0.10.4", - "slevomat/coding-standard": "^6.3", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.4" + "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/" @@ -4732,7 +4745,7 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.2.2" + "source": "https://github.com/ramsey/collection/tree/1.3.0" }, "funding": [ { @@ -4744,7 +4757,7 @@ "type": "tidelift" } ], - "time": "2021-10-10T03:01:02+00:00" + "time": "2022-12-27T19:12:24+00:00" }, { "name": "ramsey/uuid", @@ -5705,16 +5718,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.2.1", + "version": "v6.2.3", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "b4e41f62c1124378863ff2705158a60da3e4c6b9" + "reference": "0926124c95d220499e2baf0fb465772af3a4eddb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/b4e41f62c1124378863ff2705158a60da3e4c6b9", - "reference": "b4e41f62c1124378863ff2705158a60da3e4c6b9", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/0926124c95d220499e2baf0fb465772af3a4eddb", + "reference": "0926124c95d220499e2baf0fb465772af3a4eddb", "shasum": "", "mirrors": [ { @@ -5762,7 +5775,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.2.1" + "source": "https://github.com/symfony/error-handler/tree/v6.2.3" }, "funding": [ { @@ -5778,20 +5791,20 @@ "type": "tidelift" } ], - "time": "2022-12-01T21:07:46+00:00" + "time": "2022-12-19T14:33:49+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.2.0", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9efb1618fabee89515fe031314e8ed5625f85a53" + "reference": "3ffeb31139b49bf6ef0bc09d1db95eac053388d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9efb1618fabee89515fe031314e8ed5625f85a53", - "reference": "9efb1618fabee89515fe031314e8ed5625f85a53", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/3ffeb31139b49bf6ef0bc09d1db95eac053388d1", + "reference": "3ffeb31139b49bf6ef0bc09d1db95eac053388d1", "shasum": "", "mirrors": [ { @@ -5851,7 +5864,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.2" }, "funding": [ { @@ -5867,7 +5880,7 @@ "type": "tidelift" } ], - "time": "2022-11-02T09:08:04+00:00" + "time": "2022-12-14T16:11:27+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5956,16 +5969,16 @@ }, { "name": "symfony/finder", - "version": "v6.1.3", + "version": "v6.2.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709" + "reference": "81eefbddfde282ee33b437ba5e13d7753211ae8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/39696bff2c2970b3779a5cac7bf9f0b88fc2b709", - "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709", + "url": "https://api.github.com/repos/symfony/finder/zipball/81eefbddfde282ee33b437ba5e13d7753211ae8e", + "reference": "81eefbddfde282ee33b437ba5e13d7753211ae8e", "shasum": "", "mirrors": [ { @@ -6006,7 +6019,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.1.3" + "source": "https://github.com/symfony/finder/tree/v6.2.3" }, "funding": [ { @@ -6022,20 +6035,20 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:42:06+00:00" + "time": "2022-12-22T17:55:15+00:00" }, { "name": "symfony/http-client", - "version": "v6.2.0", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "153540b6ed72eecdcb42dc847f8d8cf2e2516e8e" + "reference": "7054ad466f836309aef511789b9c697bc986d8ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/153540b6ed72eecdcb42dc847f8d8cf2e2516e8e", - "reference": "153540b6ed72eecdcb42dc847f8d8cf2e2516e8e", + "url": "https://api.github.com/repos/symfony/http-client/zipball/7054ad466f836309aef511789b9c697bc986d8ce", + "reference": "7054ad466f836309aef511789b9c697bc986d8ce", "shasum": "", "mirrors": [ { @@ -6097,7 +6110,7 @@ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-client/tree/v6.2.0" + "source": "https://github.com/symfony/http-client/tree/v6.2.2" }, "funding": [ { @@ -6113,7 +6126,7 @@ "type": "tidelift" } ], - "time": "2022-11-14T10:13:36+00:00" + "time": "2022-12-14T16:11:27+00:00" }, { "name": "symfony/http-client-contracts", @@ -6204,16 +6217,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.2.1", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "d0bbd5a7e81b38f32504399b9199f265505b7bac" + "reference": "ddf4dd35de1623e7c02013523e6c2137b67b636f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d0bbd5a7e81b38f32504399b9199f265505b7bac", - "reference": "d0bbd5a7e81b38f32504399b9199f265505b7bac", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ddf4dd35de1623e7c02013523e6c2137b67b636f", + "reference": "ddf4dd35de1623e7c02013523e6c2137b67b636f", "shasum": "", "mirrors": [ { @@ -6268,7 +6281,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.2.1" + "source": "https://github.com/symfony/http-foundation/tree/v6.2.2" }, "funding": [ { @@ -6284,20 +6297,20 @@ "type": "tidelift" } ], - "time": "2022-12-04T18:26:13+00:00" + "time": "2022-12-14T16:11:27+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.2.2", + "version": "v6.2.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "860a0189969b755cd571709bd32313aa8599867a" + "reference": "56c0c0d051579d25aec059a21dfe469634396a0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/860a0189969b755cd571709bd32313aa8599867a", - "reference": "860a0189969b755cd571709bd32313aa8599867a", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/56c0c0d051579d25aec059a21dfe469634396a0f", + "reference": "56c0c0d051579d25aec059a21dfe469634396a0f", "shasum": "", "mirrors": [ { @@ -6385,7 +6398,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.2.2" + "source": "https://github.com/symfony/http-kernel/tree/v6.2.3" }, "funding": [ { @@ -6401,7 +6414,7 @@ "type": "tidelift" } ], - "time": "2022-12-16T19:38:34+00:00" + "time": "2022-12-28T15:05:50+00:00" }, { "name": "symfony/mailer", @@ -6490,16 +6503,16 @@ }, { "name": "symfony/mime", - "version": "v6.2.0", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "1e8005a7cbd79fb824ad81308ef2a76592a08bc0" + "reference": "8c98bf40406e791043890a163f6f6599b9cfa1ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/1e8005a7cbd79fb824ad81308ef2a76592a08bc0", - "reference": "1e8005a7cbd79fb824ad81308ef2a76592a08bc0", + "url": "https://api.github.com/repos/symfony/mime/zipball/8c98bf40406e791043890a163f6f6599b9cfa1ed", + "reference": "8c98bf40406e791043890a163f6f6599b9cfa1ed", "shasum": "", "mirrors": [ { @@ -6559,7 +6572,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.2.0" + "source": "https://github.com/symfony/mime/tree/v6.2.2" }, "funding": [ { @@ -6575,7 +6588,7 @@ "type": "tidelift" } ], - "time": "2022-11-28T12:28:19+00:00" + "time": "2022-12-14T16:38:10+00:00" }, { "name": "symfony/polyfill-ctype", @@ -8079,16 +8092,16 @@ }, { "name": "symfony/var-dumper", - "version": "v6.2.1", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "1e7544c8698627b908657e5276854d52ab70087a" + "reference": "6168f544827e897f708a684f75072a8c33a5e309" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1e7544c8698627b908657e5276854d52ab70087a", - "reference": "1e7544c8698627b908657e5276854d52ab70087a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6168f544827e897f708a684f75072a8c33a5e309", + "reference": "6168f544827e897f708a684f75072a8c33a5e309", "shasum": "", "mirrors": [ { @@ -8153,7 +8166,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.2.1" + "source": "https://github.com/symfony/var-dumper/tree/v6.2.2" }, "funding": [ { @@ -8169,20 +8182,20 @@ "type": "tidelift" } ], - "time": "2022-12-03T22:32:58+00:00" + "time": "2022-12-14T16:11:27+00:00" }, { "name": "symfony/yaml", - "version": "v6.2.0", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "f2570f21bd4adc3589aa3133323273995109bae0" + "reference": "6ed8243aa5f2cb5a57009f826b5e7fb3c4200cf3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/f2570f21bd4adc3589aa3133323273995109bae0", - "reference": "f2570f21bd4adc3589aa3133323273995109bae0", + "url": "https://api.github.com/repos/symfony/yaml/zipball/6ed8243aa5f2cb5a57009f826b5e7fb3c4200cf3", + "reference": "6ed8243aa5f2cb5a57009f826b5e7fb3c4200cf3", "shasum": "", "mirrors": [ { @@ -8233,7 +8246,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.2.0" + "source": "https://github.com/symfony/yaml/tree/v6.2.2" }, "funding": [ { @@ -8249,20 +8262,20 @@ "type": "tidelift" } ], - "time": "2022-11-25T19:00:27+00:00" + "time": "2022-12-14T16:11:27+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.5", + "version": "2.2.6", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "4348a3a06651827a27d989ad1d13efec6bb49b19" + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/4348a3a06651827a27d989ad1d13efec6bb49b19", - "reference": "4348a3a06651827a27d989ad1d13efec6bb49b19", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c", "shasum": "", "mirrors": [ { @@ -8306,9 +8319,9 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.5" + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.6" }, - "time": "2022-09-12T13:28:28+00:00" + "time": "2023-01-03T09:29:04+00:00" }, { "name": "vlucas/phpdotenv", @@ -8830,16 +8843,16 @@ }, { "name": "doctrine/instantiator", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", "shasum": "", "mirrors": [ { @@ -8852,14 +8865,14 @@ "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9", + "doctrine/coding-standard": "^9 || ^11", "ext-pdo": "*", "ext-phar": "*", "phpbench/phpbench": "^0.16 || ^1", "phpstan/phpstan": "^1.4", "phpstan/phpstan-phpunit": "^1", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.22" + "vimeo/psalm": "^4.30 || ^5.4" }, "type": "library", "autoload": { @@ -8886,7 +8899,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" }, "funding": [ { @@ -8902,7 +8915,7 @@ "type": "tidelift" } ], - "time": "2022-03-03T08:28:38+00:00" + "time": "2022-12-30T00:15:36+00:00" }, { "name": "fakerphp/faker", @@ -9234,16 +9247,16 @@ }, { "name": "laravel/sail", - "version": "v1.16.6", + "version": "v1.17.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "2e8be54590bde421eb04e461a1421302a5b22cca" + "reference": "7d69da7b2bdb8cbe8da6663eb2ae0e00c884bf80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/2e8be54590bde421eb04e461a1421302a5b22cca", - "reference": "2e8be54590bde421eb04e461a1421302a5b22cca", + "url": "https://api.github.com/repos/laravel/sail/zipball/7d69da7b2bdb8cbe8da6663eb2ae0e00c884bf80", + "reference": "7d69da7b2bdb8cbe8da6663eb2ae0e00c884bf80", "shasum": "", "mirrors": [ { @@ -9296,20 +9309,20 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2022-12-19T15:41:32+00:00" + "time": "2022-12-22T14:46:08+00:00" }, { "name": "laravel/telescope", - "version": "v4.10.2", + "version": "v4.11.0", "source": { "type": "git", "url": "https://github.com/laravel/telescope.git", - "reference": "3b1220b71ee08ac7be6be074635df50c2b83ab51" + "reference": "a910e64a9464312ed0a26ccecbf7a1f969f20806" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/telescope/zipball/3b1220b71ee08ac7be6be074635df50c2b83ab51", - "reference": "3b1220b71ee08ac7be6be074635df50c2b83ab51", + "url": "https://api.github.com/repos/laravel/telescope/zipball/a910e64a9464312ed0a26ccecbf7a1f969f20806", + "reference": "a910e64a9464312ed0a26ccecbf7a1f969f20806", "shasum": "", "mirrors": [ { @@ -9321,7 +9334,7 @@ "require": { "ext-json": "*", "laravel/framework": "^8.37|^9.0", - "php": "^7.3|^8.0", + "php": "^8.0", "symfony/var-dumper": "^5.0|^6.0" }, "require-dev": { @@ -9368,9 +9381,9 @@ ], "support": { "issues": "https://github.com/laravel/telescope/issues", - "source": "https://github.com/laravel/telescope/tree/v4.10.2" + "source": "https://github.com/laravel/telescope/tree/v4.11.0" }, - "time": "2022-12-19T11:20:10+00:00" + "time": "2023-01-03T09:40:48+00:00" }, { "name": "mockery/mockery", @@ -9517,16 +9530,16 @@ }, { "name": "nunomaduro/collision", - "version": "v6.3.1", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "0f6349c3ed5dd28467087b08fb59384bb458a22b" + "reference": "f05978827b9343cba381ca05b8c7deee346b6015" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/0f6349c3ed5dd28467087b08fb59384bb458a22b", - "reference": "0f6349c3ed5dd28467087b08fb59384bb458a22b", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/f05978827b9343cba381ca05b8c7deee346b6015", + "reference": "f05978827b9343cba381ca05b8c7deee346b6015", "shasum": "", "mirrors": [ { @@ -9607,7 +9620,7 @@ "type": "patreon" } ], - "time": "2022-09-29T12:29:49+00:00" + "time": "2023-01-03T12:54:54+00:00" }, { "name": "phar-io/manifest", @@ -9734,16 +9747,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.3", + "version": "1.9.7", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "709999b91448d4f2bb07daffffedc889b33e461c" + "reference": "0501435cd342eac7664bd62155b1ef907fc60b6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/709999b91448d4f2bb07daffffedc889b33e461c", - "reference": "709999b91448d4f2bb07daffffedc889b33e461c", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0501435cd342eac7664bd62155b1ef907fc60b6f", + "reference": "0501435cd342eac7664bd62155b1ef907fc60b6f", "shasum": "", "mirrors": [ { @@ -9779,7 +9792,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.3" + "source": "https://github.com/phpstan/phpstan/tree/1.9.7" }, "funding": [ { @@ -9795,20 +9808,20 @@ "type": "tidelift" } ], - "time": "2022-12-13T10:28:10+00:00" + "time": "2023-01-04T21:59:57+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.22", + "version": "9.2.23", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "e4bf60d2220b4baaa0572986b5d69870226b06df" + "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e4bf60d2220b4baaa0572986b5d69870226b06df", - "reference": "e4bf60d2220b4baaa0572986b5d69870226b06df", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", + "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", "shasum": "", "mirrors": [ { @@ -9870,7 +9883,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.22" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.23" }, "funding": [ { @@ -9878,7 +9891,7 @@ "type": "github" } ], - "time": "2022-12-18T16:40:55+00:00" + "time": "2022-12-28T12:41:10+00:00" }, { "name": "phpunit/php-file-iterator", @@ -11696,8 +11709,10 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.1", - "ext-zip": "^1.19" + "php": "^8.2", + "ext-zip": "^1.19", + "ext-pcntl": "*", + "ext-posix": "*" }, "platform-dev": [], "plugin-api-version": "2.3.0"