From 33dfb11414787d2c8e1aa667fc0fc820b7b0622f Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 16 Dec 2025 16:46:11 -0300 Subject: [PATCH 01/71] feat: Atualiza arquivo de gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index d5673e3..c4c1e13 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,5 @@ Homestead.json .env.production .phpactor.json auth.json +/draft.yaml +/.blueprint From dd332988e00c82cc527837dd7a98d3db23ec21be Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 16 Dec 2025 16:46:33 -0300 Subject: [PATCH 02/71] feat: Adiciona arquivos de constantes --- src/Support/FieldType.php | 18 ++++++++++++++++++ src/Support/RelationshipType.php | 16 ++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 src/Support/FieldType.php create mode 100644 src/Support/RelationshipType.php diff --git a/src/Support/FieldType.php b/src/Support/FieldType.php new file mode 100644 index 0000000..2a944df --- /dev/null +++ b/src/Support/FieldType.php @@ -0,0 +1,18 @@ + Date: Tue, 16 Dec 2025 16:46:50 -0300 Subject: [PATCH 03/71] feat: Adiciona arquivos builders --- src/Blueprint/Builders/ControllerBuilder.php | 35 ++++++++++++ src/Blueprint/Builders/DraftBuilder.php | 53 +++++++++++++++++++ src/Blueprint/Builders/RequestBuilder.php | 16 ++++++ .../Builders/ValidationRuleBuilder.php | 34 ++++++++++++ 4 files changed, 138 insertions(+) create mode 100644 src/Blueprint/Builders/ControllerBuilder.php create mode 100644 src/Blueprint/Builders/DraftBuilder.php create mode 100644 src/Blueprint/Builders/RequestBuilder.php create mode 100644 src/Blueprint/Builders/ValidationRuleBuilder.php diff --git a/src/Blueprint/Builders/ControllerBuilder.php b/src/Blueprint/Builders/ControllerBuilder.php new file mode 100644 index 0000000..225f4d4 --- /dev/null +++ b/src/Blueprint/Builders/ControllerBuilder.php @@ -0,0 +1,35 @@ + [ + 'index' => [ + 'query' => 'all', + ], + 'store' => [ + 'validate' => "Store{$model}Request", + 'save' => $resource, + ], + 'show' => [ + 'query' => 'find:id', + ], + 'update' => [ + 'validate' => "Update{$model}Request", + 'save' => $resource, + ], + 'destroy' => [ + 'delete' => $resource, + ], + ], + ]; + } +} diff --git a/src/Blueprint/Builders/DraftBuilder.php b/src/Blueprint/Builders/DraftBuilder.php new file mode 100644 index 0000000..f6ae086 --- /dev/null +++ b/src/Blueprint/Builders/DraftBuilder.php @@ -0,0 +1,53 @@ + [ + $model => $fields, + ], + 'requests' =>$this->requestBuilder->build($model, $fields), + 'controllers' => $this->controllerBuilder->build($model), + ]; + + if (! empty($relationships)) { + $draft['models'][$model]['relationships'] = + $this->mapRelationships($relationships); + } + + return $draft; + } + + private function mapRelationships(array $relationships): array + { + $mapped = []; + + foreach ($relationships as $model => $type) { + if (! isset($mapped[$type])) { + $mapped[$type] = []; + } + + $mapped[$type][] = $model; + } + + return collect($mapped) + ->map(fn ($models) => implode(',', $models)) + ->toArray(); + } + +} diff --git a/src/Blueprint/Builders/RequestBuilder.php b/src/Blueprint/Builders/RequestBuilder.php new file mode 100644 index 0000000..f4063d9 --- /dev/null +++ b/src/Blueprint/Builders/RequestBuilder.php @@ -0,0 +1,16 @@ + ValidationRuleBuilder::required($fields), + "Update{$model}Request" => ValidationRuleBuilder::optional($fields), + ]; + } +} diff --git a/src/Blueprint/Builders/ValidationRuleBuilder.php b/src/Blueprint/Builders/ValidationRuleBuilder.php new file mode 100644 index 0000000..4876fa4 --- /dev/null +++ b/src/Blueprint/Builders/ValidationRuleBuilder.php @@ -0,0 +1,34 @@ +map(fn ($type) => self::rule($type, $partial))->toArray(); + } + + private static function rule(string $type, bool $partial): string + { + $rules = match ($type) { + 'string' => 'string|max:255', + 'integer' => 'integer', + 'boolean' => 'boolean', + 'date', 'timestamp' => 'date', + default => 'string', + }; + + return $partial ? "sometimes|{$rules}" : "required|{$rules}"; + } +} From 644fd78e4fb8b513e718ee799e3ad0a75efdf4e2 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 16 Dec 2025 16:47:16 -0300 Subject: [PATCH 04/71] chore: Registra no serviceProvider comando --- .../CuidsGeneratorServiceProvider.php | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/Providers/CuidsGeneratorServiceProvider.php diff --git a/src/Providers/CuidsGeneratorServiceProvider.php b/src/Providers/CuidsGeneratorServiceProvider.php new file mode 100644 index 0000000..8ad64f8 --- /dev/null +++ b/src/Providers/CuidsGeneratorServiceProvider.php @@ -0,0 +1,23 @@ +app->runningInConsole()) { + $this->commands([ + CuidsGenerateCommand::class, + ]); + } + } + + public function boot(): void + {} +} From 3d6f9bcde055e3d4cf9a7a081979e83c47bd9ed9 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 16 Dec 2025 16:48:17 -0300 Subject: [PATCH 05/71] feat: Adiciona arquivos de gerenciamento dos campos e relacionamentos --- src/Console/Editors/FieldEditor.php | 90 ++++++++++++++++++++++ src/Console/Editors/RelationshipEditor.php | 85 ++++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 src/Console/Editors/FieldEditor.php create mode 100644 src/Console/Editors/RelationshipEditor.php diff --git a/src/Console/Editors/FieldEditor.php b/src/Console/Editors/FieldEditor.php new file mode 100644 index 0000000..67cea4c --- /dev/null +++ b/src/Console/Editors/FieldEditor.php @@ -0,0 +1,90 @@ +info('Configuração dos campos'); + + while (true) { + $action = $cli->choice( + 'Campos', + ['Adicionar', 'Atualizar nome', 'Atualizar tipo', 'Remover', 'Listar', 'Finalizar'], + ); + + match ($action) { + 'Adicionar' => $this->add($cli, $fields), + 'Atualizar nome' => $this->rename($cli, $fields), + 'Atualizar tipo' => $this->changeType($cli, $fields), + 'Remover' => $this->remove($cli, $fields), + 'Listar' => $this->list($cli, $fields), + 'Finalizar' => null, + }; + + if ($action === 'Finalizar') break; + } + + return $fields; + } + + private function add(Command $cli, array &$fields): void + { + $name = $cli->ask('Nome do campo'); + + if (! $name || isset($fields[$name])) { + $cli->warn('Campo inválido ou duplicado.'); + return; + } + + $type = $cli->choice('Tipo', FieldType::values(), 0); + + $fields[$name] = $type; + } + + private function rename(Command $cli, array &$fields): void + { + if (empty($fields)) { + $cli->warn('Nenhum campo.'); + return; + } + + $old = $cli->choice('Campo', array_keys($fields)); + $new = $cli->ask('Novo nome'); + + if (! $new || isset($fields[$new])) { + $cli->warn('Nome inválido.'); + return; + } + + $fields[$new] = $fields[$old]; + unset($fields[$old]); + } + + private function changeType(Command $cli, array &$fields): void + { + if (empty($fields)) return; + + $name = $cli->choice('Campo', array_keys($fields)); + $fields[$name] = $cli->choice('Tipo', FieldType::values(), 0); + } + + private function remove(Command $cli, array &$fields): void + { + if (empty($fields)) return; + + $name = $cli->choice('Campo', array_keys($fields)); + unset($fields[$name]); + } + + private function list(Command $cli, array $fields): void + { + $cli->table(['Campo', 'Tipo'], collect($fields)->map(fn ($t, $n) => [$n, $t])); + } +} diff --git a/src/Console/Editors/RelationshipEditor.php b/src/Console/Editors/RelationshipEditor.php new file mode 100644 index 0000000..b7bbe81 --- /dev/null +++ b/src/Console/Editors/RelationshipEditor.php @@ -0,0 +1,85 @@ +info('Configuração de relacionamentos'); + + while (true) { + $action = $cli->choice( + 'Relacionamentos', + ['Adicionar', 'Atualizar', 'Remover', 'Listar', 'Finalizar'], + ); + + match ($action) { + 'Adicionar' => $this->add($cli, $relationships), + 'Atualizar' => $this->update($cli, $relationships), + 'Remover' => $this->remove($cli, $relationships), + 'Listar' => $this->list($cli, $relationships), + 'Finalizar' => null, + }; + + if ($action === 'Finalizar') break; + } + + return $relationships; + } + + private function add(Command $cli, array &$fields): void + { + $name = $cli->ask('Nome da collection (Ex: User)'); + + if (! $name || isset($fields[$name])) { + $cli->warn('Campo inválido ou duplicado.'); + return; + } + + $type = $cli->choice('Tipo de relacionamento', RelationshipType::values()); + + $fields[$name] = $type; + } + + private function update(Command $cli, array &$relationships): void + { + if (empty($relationships)) { + $cli->warn('Nenhum relacionamento.'); + return; + } + + $collection = $cli->choice( + 'Escolha a collection para atualizar o relacionamento', + array_keys($relationships) + ); + + $newType = $cli->choice( + 'Novo tipo de relacionamento', + RelationshipType::values(), + 0 + ); + + $relationships[$collection] = $newType; + + $cli->info("Relacionamento de '{$collection}' atualizado para '{$newType}'."); + } + + private function remove(Command $cli, array &$fields): void + { + if (empty($fields)) return; + + $name = $cli->choice('Escolhar a collection para remover o relacionamento', array_keys($fields)); + unset($fields[$name]); + } + + private function list(Command $cli, array $fields): void + { + $cli->table(['Collection', 'Relacionamento'], collect($fields)->map(fn ($t, $n) => [$n, $t])); + } +} From 9165e71e0a7109456872b52932e50f98385e1f5d Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 16 Dec 2025 16:48:53 -0300 Subject: [PATCH 06/71] =?UTF-8?q?feat:=20Adiciona=20arquivo=20responsavel?= =?UTF-8?q?=20por=20cria=C3=A7=C3=A3o=20do=20yaml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Blueprint/BlueprintWriter.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/Blueprint/BlueprintWriter.php diff --git a/src/Blueprint/BlueprintWriter.php b/src/Blueprint/BlueprintWriter.php new file mode 100644 index 0000000..a3e005f --- /dev/null +++ b/src/Blueprint/BlueprintWriter.php @@ -0,0 +1,21 @@ + Date: Tue, 16 Dec 2025 16:49:12 -0300 Subject: [PATCH 07/71] feat: Adiciona comando --- src/Console/Commands/CuidsGenerateCommand.php | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/Console/Commands/CuidsGenerateCommand.php diff --git a/src/Console/Commands/CuidsGenerateCommand.php b/src/Console/Commands/CuidsGenerateCommand.php new file mode 100644 index 0000000..0da4da2 --- /dev/null +++ b/src/Console/Commands/CuidsGenerateCommand.php @@ -0,0 +1,61 @@ +blueprintWriter = $blueprintWriter; + $this->draftBuilder = $draftBuilder; + $this->fieldEditor = $fieldEditor; + $this->relationshipEditor = $relationshipEditor; + } + + public function handle() + { + $entity = $this->ask('Qual o nome do model (em inglês, no singular e kebab-case)?'); + + $fields = $this->fieldEditor->run($this); + $relationships = []; + + $this->newLine(); + + if ($this->confirm('Adicionar relacionamentos?')) { + $this->newLine(); + + $relationships = $this->relationshipEditor->run($this); + } + + $draft = $this->draftBuilder->build($entity, $fields, $relationships); + + $this->blueprintWriter->write($draft); + + $this->call('blueprint:build'); + } +} + + \ No newline at end of file From cbd81532f18819c7abc881abafa7db9e10298538 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 16 Dec 2025 16:49:41 -0300 Subject: [PATCH 08/71] feat: Adiciona arquivo de composer com dependencias para funcionamento do pacote --- composer.json | 28 + composer.lock | 2881 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 2909 insertions(+) create mode 100644 composer.json create mode 100644 composer.lock diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..b7c7f09 --- /dev/null +++ b/composer.json @@ -0,0 +1,28 @@ +{ + "name": "sysvale/cuids-generator", + "description": "Gerador de módulos", + "type": "library", + "license": "Apache-2.0", + "require": { + "php": "^8.1", + "illuminate/support": "^10|^11", + "illuminate/console": "^10|^11", + "laravel-shift/blueprint": "^2.12", + "jasonmccreary/laravel-test-assertions": "^0.1.0", + "symfony/yaml": "^7.4" + }, + "autoload": { + "psr-4": { + "Sysvale\\CuidsGenerator\\": "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Sysvale\\CuidsGenerator\\Providers\\CuidsGeneratorServiceProvider" + ] + } + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..99017ab --- /dev/null +++ b/composer.lock @@ -0,0 +1,2881 @@ +{ + "_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": "089723f04f0117f5cc1b14539aed6dd4", + "packages": [ + { + "name": "brick/math", + "version": "0.14.1", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "f05858549e5f9d7bb45875a75583240a38a281d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/f05858549e5f9d7bb45875a75583240a38a281d0", + "reference": "f05858549e5f9d7bb45875a75583240a38a281d0", + "shasum": "" + }, + "require": { + "php": "^8.2" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpstan/phpstan": "2.1.22", + "phpunit/phpunit": "^11.5" + }, + "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", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.14.1" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2025-11-24T14:40:29+00:00" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "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 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.1.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%2Finflector", + "type": "tidelift" + } + ], + "time": "2025-08-10T19:31:58+00:00" + }, + { + "name": "illuminate/bus", + "version": "v11.47.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/bus.git", + "reference": "2adf211bada7184410501b37882845230d6bf2f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/bus/zipball/2adf211bada7184410501b37882845230d6bf2f4", + "reference": "2adf211bada7184410501b37882845230d6bf2f4", + "shasum": "" + }, + "require": { + "illuminate/collections": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/pipeline": "^11.0", + "illuminate/support": "^11.0", + "php": "^8.2" + }, + "suggest": { + "illuminate/queue": "Required to use closures when chaining jobs (^7.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Bus\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Bus package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-10-14T19:59:30+00:00" + }, + { + "name": "illuminate/collections", + "version": "v11.47.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "856b1da953e46281ba61d7c82d337072d3ee1825" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/856b1da953e46281ba61d7c82d337072d3ee1825", + "reference": "856b1da953e46281ba61d7c82d337072d3ee1825", + "shasum": "" + }, + "require": { + "illuminate/conditionable": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/macroable": "^11.0", + "php": "^8.2" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^7.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php", + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-03-24T11:54:20+00:00" + }, + { + "name": "illuminate/conditionable", + "version": "v11.47.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/conditionable.git", + "reference": "319b717e0587bd7c8a3b44464f0e27867b4bcda9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/319b717e0587bd7c8a3b44464f0e27867b4bcda9", + "reference": "319b717e0587bd7c8a3b44464f0e27867b4bcda9", + "shasum": "" + }, + "require": { + "php": "^8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Conditionable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-03-24T11:54:20+00:00" + }, + { + "name": "illuminate/console", + "version": "v11.47.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/console.git", + "reference": "a41fbfc99bac948ee27fc8d99bb0e5b4175dec00" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/console/zipball/a41fbfc99bac948ee27fc8d99bb0e5b4175dec00", + "reference": "a41fbfc99bac948ee27fc8d99bb0e5b4175dec00", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/macroable": "^11.0", + "illuminate/support": "^11.0", + "illuminate/view": "^11.0", + "laravel/prompts": "^0.1.20|^0.2|^0.3", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "symfony/console": "^7.0.3", + "symfony/polyfill-php83": "^1.31", + "symfony/process": "^7.0.3" + }, + "suggest": { + "dragonmantank/cron-expression": "Required to use scheduler (^3.3.2).", + "ext-pcntl": "Required to use signal trapping.", + "guzzlehttp/guzzle": "Required to use the ping methods on schedules (^7.8).", + "illuminate/bus": "Required to use the scheduled job dispatcher (^11.0).", + "illuminate/container": "Required to use the scheduler (^11.0).", + "illuminate/filesystem": "Required to use the generator command (^11.0).", + "illuminate/queue": "Required to use closures for scheduled jobs (^11.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Console package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-11-11T13:49:37+00:00" + }, + { + "name": "illuminate/container", + "version": "v11.47.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "79bf9149ad7ddd7e14326ebcdd41197d2c4ee36a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/79bf9149ad7ddd7e14326ebcdd41197d2c4ee36a", + "reference": "79bf9149ad7ddd7e14326ebcdd41197d2c4ee36a", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^11.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1" + }, + "provide": { + "psr/container-implementation": "1.1|2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-03-24T11:54:20+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v11.47.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "4787042340aae19a7ea0fa82f4073c4826204a48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/4787042340aae19a7ea0fa82f4073c4826204a48", + "reference": "4787042340aae19a7ea0fa82f4073c4826204a48", + "shasum": "" + }, + "require": { + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/simple-cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-11-27T16:16:07+00:00" + }, + { + "name": "illuminate/database", + "version": "v11.47.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/database.git", + "reference": "96abcce13f405701363d916dd312835e04848d04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/database/zipball/96abcce13f405701363d916dd312835e04848d04", + "reference": "96abcce13f405701363d916dd312835e04848d04", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12|^0.13|^0.14", + "ext-pdo": "*", + "illuminate/collections": "^11.0", + "illuminate/container": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/macroable": "^11.0", + "illuminate/support": "^11.0", + "laravel/serializable-closure": "^1.3|^2.0", + "php": "^8.2" + }, + "suggest": { + "ext-filter": "Required to use the Postgres database driver.", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.24).", + "illuminate/console": "Required to use the database commands (^11.0).", + "illuminate/events": "Required to use the observers with Eloquent (^11.0).", + "illuminate/filesystem": "Required to use the migrations (^11.0).", + "illuminate/pagination": "Required to paginate the result set (^11.0).", + "symfony/finder": "Required to use Eloquent model factories (^7.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Database\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Database package.", + "homepage": "https://laravel.com", + "keywords": [ + "database", + "laravel", + "orm", + "sql" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-09-29T09:23:31+00:00" + }, + { + "name": "illuminate/events", + "version": "v11.47.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/events.git", + "reference": "b72dab66d8e05d22dc5aa949efec150bbc73e827" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/events/zipball/b72dab66d8e05d22dc5aa949efec150bbc73e827", + "reference": "b72dab66d8e05d22dc5aa949efec150bbc73e827", + "shasum": "" + }, + "require": { + "illuminate/bus": "^11.0", + "illuminate/collections": "^11.0", + "illuminate/container": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/macroable": "^11.0", + "illuminate/support": "^11.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Illuminate\\Events\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Events package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-03-24T11:54:20+00:00" + }, + { + "name": "illuminate/filesystem", + "version": "v11.47.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/filesystem.git", + "reference": "d1f217b75ee193bbe27f31df8a94ff6759f31469" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/filesystem/zipball/d1f217b75ee193bbe27f31df8a94ff6759f31469", + "reference": "d1f217b75ee193bbe27f31df8a94ff6759f31469", + "shasum": "" + }, + "require": { + "illuminate/collections": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/macroable": "^11.0", + "illuminate/support": "^11.0", + "php": "^8.2", + "symfony/finder": "^7.0.3" + }, + "suggest": { + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-hash": "Required to use the Filesystem class.", + "illuminate/http": "Required for handling uploaded files (^7.0).", + "league/flysystem": "Required to use the Flysystem local driver (^3.25.1).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).", + "symfony/mime": "Required to enable support for guessing extensions (^7.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Illuminate\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Filesystem package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-03-24T11:54:20+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v11.47.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", + "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", + "shasum": "" + }, + "require": { + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-06-28T20:10:30+00:00" + }, + { + "name": "illuminate/pipeline", + "version": "v11.47.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/pipeline.git", + "reference": "f73bb7cab13ac8ef91094dc46976f5e992eea127" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/pipeline/zipball/f73bb7cab13ac8ef91094dc46976f5e992eea127", + "reference": "f73bb7cab13ac8ef91094dc46976f5e992eea127", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^11.0", + "illuminate/support": "^11.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Pipeline\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Pipeline package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-03-24T11:54:20+00:00" + }, + { + "name": "illuminate/support", + "version": "v11.47.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "20fbd9f9f502a55de0cbba3f3f81444b7c44af4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/20fbd9f9f502a55de0cbba3f3f81444b7c44af4b", + "reference": "20fbd9f9f502a55de0cbba3f3f81444b7c44af4b", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-mbstring": "*", + "illuminate/collections": "^11.0", + "illuminate/conditionable": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/macroable": "^11.0", + "nesbot/carbon": "^2.72.6|^3.8.4", + "php": "^8.2", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "replace": { + "spatie/once": "*" + }, + "suggest": { + "illuminate/filesystem": "Required to use the Composer class (^11.0).", + "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).", + "league/uri": "Required to use the Uri class (^7.5.1).", + "ramsey/uuid": "Required to use Str::uuid() (^4.7).", + "symfony/process": "Required to use the Composer class (^7.0).", + "symfony/uid": "Required to use Str::ulid() (^7.0).", + "symfony/var-dumper": "Required to use the dd function (^7.0).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php", + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-11-27T16:16:32+00:00" + }, + { + "name": "illuminate/view", + "version": "v11.47.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/view.git", + "reference": "9da5543dccb4e406f98016bac8678c97b7dc6915" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/view/zipball/9da5543dccb4e406f98016bac8678c97b7dc6915", + "reference": "9da5543dccb4e406f98016bac8678c97b7dc6915", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "illuminate/collections": "^11.0", + "illuminate/container": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/events": "^11.0", + "illuminate/filesystem": "^11.0", + "illuminate/macroable": "^11.0", + "illuminate/support": "^11.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\View\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate View package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-03-24T11:54:20+00:00" + }, + { + "name": "jasonmccreary/laravel-test-assertions", + "version": "0.1.0", + "source": { + "type": "git", + "url": "https://github.com/jasonmccreary/laravel-test-assertions.git", + "reference": "4bb1c078e39d5acb46b104c0347373b9623c6904" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jasonmccreary/laravel-test-assertions/zipball/4bb1c078e39d5acb46b104c0347373b9623c6904", + "reference": "4bb1c078e39d5acb46b104c0347373b9623c6904", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "JMac\\Testing\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jason McCreary", + "email": "jason@pureconcepts.net" + } + ], + "description": "A set of helpful assertions when testing Laravel applications.", + "support": { + "issues": "https://github.com/jasonmccreary/laravel-test-assertions/issues", + "source": "https://github.com/jasonmccreary/laravel-test-assertions/tree/master" + }, + "time": "2019-06-25T15:44:18+00:00" + }, + { + "name": "laravel-shift/blueprint", + "version": "v2.12.0", + "source": { + "type": "git", + "url": "https://github.com/laravel-shift/blueprint.git", + "reference": "fe90c6ab736fd8fa5acba04c8f4d0547da0be092" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel-shift/blueprint/zipball/fe90c6ab736fd8fa5acba04c8f4d0547da0be092", + "reference": "fe90c6ab736fd8fa5acba04c8f4d0547da0be092", + "shasum": "" + }, + "require": { + "illuminate/console": "^10.38|^11.0|^12.0", + "illuminate/database": "^10.38|^11.0|^12.0", + "illuminate/filesystem": "^10.38|^11.0|^12.0", + "illuminate/support": "^10.38|^11.0|^12.0", + "laravel-shift/faker-registry": "^0.3.0", + "symfony/yaml": ">=6.2" + }, + "require-dev": { + "laravel/pint": "~1.18.0", + "mockery/mockery": "^1.4.4", + "orchestra/testbench": "^8.0|^9.0|^10.0", + "phpunit/phpunit": "^10.0|^11.5.3" + }, + "suggest": { + "jasonmccreary/laravel-test-assertions": "Required to use additional assertions in generated tests (^1.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Blueprint\\BlueprintServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Blueprint\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "An expressive, human readable code generation tool.", + "keywords": [ + "code generation", + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel-shift/blueprint/issues", + "source": "https://github.com/laravel-shift/blueprint/tree/v2.12.0" + }, + "time": "2025-04-16T16:22:29+00:00" + }, + { + "name": "laravel-shift/faker-registry", + "version": "v0.3.0", + "source": { + "type": "git", + "url": "https://github.com/laravel-shift/faker-registry.git", + "reference": "968ab023b6c76c2f67cc474ba6d81fce8ff869a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel-shift/faker-registry/zipball/968ab023b6c76c2f67cc474ba6d81fce8ff869a9", + "reference": "968ab023b6c76c2f67cc474ba6d81fce8ff869a9", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Shift\\Faker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jason McCreary", + "email": "jason@pureconcepts.net" + } + ], + "description": "A registry for generating Faker data from a name or data type.", + "support": { + "issues": "https://github.com/laravel-shift/faker-registry/issues", + "source": "https://github.com/laravel-shift/faker-registry/tree/v0.3.0" + }, + "time": "2023-11-24T15:54:02+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.3.8", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "096748cdfb81988f60090bbb839ce3205ace0d35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/096748cdfb81988f60090bbb839ce3205ace0d35", + "reference": "096748cdfb81988f60090bbb839ce3205ace0d35", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "illuminate/collections": "^10.0|^11.0|^12.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4|^4.0", + "phpstan/phpstan": "^1.12.28", + "phpstan/phpstan-mockery": "^1.1.3" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.3.8" + }, + "time": "2025-11-21T20:52:52+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v2.0.7", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "cb291e4c998ac50637c7eeb58189c14f5de5b9dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/cb291e4c998ac50637c7eeb58189c14f5de5b9dd", + "reference": "cb291e4c998ac50637c7eeb58189c14f5de5b9dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0|^11.0|^12.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0|^4.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2025-11-21T20:52:36+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.11.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "bdb375400dcd162624531666db4799b36b64e4a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/bdb375400dcd162624531666db4799b36b64e4a1", + "reference": "bdb375400dcd162624531666db4799b36b64e4a1", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^v3.87.1", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "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/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/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": "2025-12-02T21:04:28+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v2.3.3", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/6fb2a640ff502caace8e05fd7be3b503a7e1c017", + "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.3.6" + }, + "require-dev": { + "illuminate/console": "^11.46.1", + "laravel/pint": "^1.25.1", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.1.3", + "phpstan/phpstan": "^1.12.32", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.3.5", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.3.3" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2025-11-20T02:34:59+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/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": "symfony/clock", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/9169f24776edde469914c1e7a1442a50f7a4e110", + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "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/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-12T15:39:26+00:00" + }, + { + "name": "symfony/console", + "version": "v7.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e", + "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.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/v7.4.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-05T15:23:39+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "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.6.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": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "340b9ed7320570f319028a2cbec46d40535e94bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd", + "reference": "340b9ed7320570f319028a2cbec46d40535e94bd", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0|^8.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/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-05T05:42:40+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-27T09:58:17+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-08T02:45:35+00:00" + }, + { + "name": "symfony/process", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8", + "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-10-16T11:21:06+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "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.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T11:30:57+00:00" + }, + { + "name": "symfony/string", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003", + "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-27T13:27:24+00:00" + }, + { + "name": "symfony/translation", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/2d01ca0da3f092f91eeedb46f24aa30d2fca8f68", + "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5.3|^3.3" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0|^8.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/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-27T13:27:24+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "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.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "24dd4de28d2e3988b311751ac49e684d783e2345" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/24dd4de28d2e3988b311751ac49e684d783e2345", + "reference": "24dd4de28d2e3988b311751ac49e684d783e2345", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "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": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.4.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-04T18:11:45+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2024-11-21T01:49:47+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.1" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} From 343a38c8bcd2b4f5d6a434e7ccccfda23bbfef43 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Thu, 18 Dec 2025 13:14:17 -0300 Subject: [PATCH 09/71] feat: Adiciona postProcessors para fazer ajustes para uso no mongo --- src/Blueprint/Builders/ControllerBuilder.php | 14 +++--- src/Blueprint/Builders/DraftBuilder.php | 4 +- src/Blueprint/PostProcessorRunner.php | 17 +++++++ .../MongoCastCleanupPostProcessor.php | 28 ++++++++++++ .../MongoModelPostProcessor.php | 45 +++++++++++++++++++ .../MongoSoftDeletesPostProcessor.php | 38 ++++++++++++++++ .../MongoVisibilityPostProcessor.php | 30 +++++++++++++ .../PostProcessors/PostProcessor.php | 8 ++++ src/Console/Commands/CuidsGenerateCommand.php | 21 +++++++-- .../CuidsGeneratorServiceProvider.php | 18 ++++++++ src/Support/FieldType.php | 7 +-- 11 files changed, 215 insertions(+), 15 deletions(-) create mode 100644 src/Blueprint/PostProcessorRunner.php create mode 100644 src/Blueprint/PostProcessors/MongoCastCleanupPostProcessor.php create mode 100644 src/Blueprint/PostProcessors/MongoModelPostProcessor.php create mode 100644 src/Blueprint/PostProcessors/MongoSoftDeletesPostProcessor.php create mode 100644 src/Blueprint/PostProcessors/MongoVisibilityPostProcessor.php create mode 100644 src/Blueprint/PostProcessors/PostProcessor.php diff --git a/src/Blueprint/Builders/ControllerBuilder.php b/src/Blueprint/Builders/ControllerBuilder.php index 225f4d4..8e1400a 100644 --- a/src/Blueprint/Builders/ControllerBuilder.php +++ b/src/Blueprint/Builders/ControllerBuilder.php @@ -8,26 +8,28 @@ class ControllerBuilder { public function build(string $model): array { - $resource = Str::camel($model); + $singularVar = Str::camel($model); + $pluralVar = Str::camel(Str::plural($model)); return [ "{$model}Controller" => [ 'index' => [ - 'query' => 'all', + 'query' => "all", + 'resource' => "paginate:{$pluralVar}", ], 'store' => [ 'validate' => "Store{$model}Request", - 'save' => $resource, + 'save' => $singularVar, ], 'show' => [ - 'query' => 'find:id', + 'resource' => $singularVar, ], 'update' => [ 'validate' => "Update{$model}Request", - 'save' => $resource, + 'update' => $singularVar, ], 'destroy' => [ - 'delete' => $resource, + 'delete' => $singularVar, ], ], ]; diff --git a/src/Blueprint/Builders/DraftBuilder.php b/src/Blueprint/Builders/DraftBuilder.php index f6ae086..9539e74 100644 --- a/src/Blueprint/Builders/DraftBuilder.php +++ b/src/Blueprint/Builders/DraftBuilder.php @@ -13,10 +13,8 @@ public function __construct( protected ControllerBuilder $controllerBuilder ) {} - public function build(string $entity, array $fields, array $relationships): array + public function build(string $model, array $fields, array $relationships): array { - $model = Str::studly(Str::singular($entity)); - $draft = [ 'models' => [ $model => $fields, diff --git a/src/Blueprint/PostProcessorRunner.php b/src/Blueprint/PostProcessorRunner.php new file mode 100644 index 0000000..5dcca03 --- /dev/null +++ b/src/Blueprint/PostProcessorRunner.php @@ -0,0 +1,17 @@ +processors as $processor) { + $processor->handle($model); + } + } +} diff --git a/src/Blueprint/PostProcessors/MongoCastCleanupPostProcessor.php b/src/Blueprint/PostProcessors/MongoCastCleanupPostProcessor.php new file mode 100644 index 0000000..1104bbb --- /dev/null +++ b/src/Blueprint/PostProcessors/MongoCastCleanupPostProcessor.php @@ -0,0 +1,28 @@ +draftBuilder = $draftBuilder; $this->fieldEditor = $fieldEditor; $this->relationshipEditor = $relationshipEditor; + $this->postProcessorRunner = $postProcessorRunner; } public function handle() { - $entity = $this->ask('Qual o nome do model (em inglês, no singular e kebab-case)?'); + $entity = $this->ask('Qual o nome do model (em inglês)?'); $fields = $this->fieldEditor->run($this); $relationships = []; + $entityStudly = Str::studly(Str::singular($entity)); + $this->newLine(); if ($this->confirm('Adicionar relacionamentos?')) { @@ -50,11 +59,17 @@ public function handle() $relationships = $this->relationshipEditor->run($this); } - $draft = $this->draftBuilder->build($entity, $fields, $relationships); + $draft = $this->draftBuilder->build($entityStudly, $fields, $relationships); $this->blueprintWriter->write($draft); $this->call('blueprint:build'); + + try { + $this->postProcessorRunner->run($entityStudly); + } catch (\Exception $e) { + $this->error("Erro ao aplicar pós-processadores]: {$e->getMessage()}"); + } } } diff --git a/src/Providers/CuidsGeneratorServiceProvider.php b/src/Providers/CuidsGeneratorServiceProvider.php index 8ad64f8..90aab7a 100644 --- a/src/Providers/CuidsGeneratorServiceProvider.php +++ b/src/Providers/CuidsGeneratorServiceProvider.php @@ -5,12 +5,18 @@ use Illuminate\Support\ServiceProvider; use Sysvale\CuidsGenerator\Console\Commands\CuidsGenerateCommand; use Sysvale\CuidsGenerator\Blueprint\PostProcessorRunner; +use Sysvale\CuidsGenerator\Blueprint\PostProcessors\MongoCastCleanupPostProcessor; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\MongoModelPostProcessor; +use Sysvale\CuidsGenerator\Blueprint\PostProcessors\MongoSoftDeletesPostProcessor; +use Sysvale\CuidsGenerator\Blueprint\PostProcessors\MongoVisibilityPostProcessor; +use Sysvale\CuidsGenerator\Blueprint\PostProcessors\TestPostProcessor; class CuidsGeneratorServiceProvider extends ServiceProvider { public function register(): void { + $this->registerPostProcessors(); + if ($this->app->runningInConsole()) { $this->commands([ CuidsGenerateCommand::class, @@ -18,6 +24,18 @@ public function register(): void } } + private function registerPostProcessors(): void + { + $this->app->singleton(PostProcessorRunner::class, function ($app) { + return new PostProcessorRunner([ + $app->make(MongoModelPostProcessor::class), + $app->make(MongoCastCleanupPostProcessor::class), + $app->make(MongoSoftDeletesPostProcessor::class), + $app->make(MongoVisibilityPostProcessor::class), + ]); + }); + } + public function boot(): void {} } diff --git a/src/Support/FieldType.php b/src/Support/FieldType.php index 2a944df..1c77215 100644 --- a/src/Support/FieldType.php +++ b/src/Support/FieldType.php @@ -4,11 +4,12 @@ enum FieldType: string { - case STRING = 'string'; + case ARRAY = 'array'; + case DATE = 'date'; + case BOOLEAN = 'boolean'; case INTEGER = 'integer'; case FLOAT = 'float'; - case BOOLEAN = 'boolean'; - case DATE = 'date'; + case STRING = 'string'; case TIMESTAMP = 'timestamp'; public static function values(): array From 2bef7e0f7a342b4b93d287d639e0716df6db4304 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Thu, 18 Dec 2025 13:18:09 -0300 Subject: [PATCH 10/71] refactor: Realiza ajuste para early return --- .../PostProcessors/MongoCastCleanupPostProcessor.php | 4 +--- src/Blueprint/PostProcessors/MongoModelPostProcessor.php | 4 +--- .../PostProcessors/MongoSoftDeletesPostProcessor.php | 4 +--- src/Blueprint/PostProcessors/MongoVisibilityPostProcessor.php | 4 +--- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/Blueprint/PostProcessors/MongoCastCleanupPostProcessor.php b/src/Blueprint/PostProcessors/MongoCastCleanupPostProcessor.php index 1104bbb..3eb2f90 100644 --- a/src/Blueprint/PostProcessors/MongoCastCleanupPostProcessor.php +++ b/src/Blueprint/PostProcessors/MongoCastCleanupPostProcessor.php @@ -11,9 +11,7 @@ public function handle(string $model): void { $path = app_path("Models/{$model}.php"); - if (! File::exists($path)) { - return; - } + if (! File::exists($path)) return; $content = File::get($path); diff --git a/src/Blueprint/PostProcessors/MongoModelPostProcessor.php b/src/Blueprint/PostProcessors/MongoModelPostProcessor.php index 89d67dd..40f1115 100644 --- a/src/Blueprint/PostProcessors/MongoModelPostProcessor.php +++ b/src/Blueprint/PostProcessors/MongoModelPostProcessor.php @@ -12,9 +12,7 @@ public function handle(string $model): void { $path = app_path("Models/{$model}.php"); - if (! File::exists($path)) { - return; - } + if (! File::exists($path)) return; $content = File::get($path); diff --git a/src/Blueprint/PostProcessors/MongoSoftDeletesPostProcessor.php b/src/Blueprint/PostProcessors/MongoSoftDeletesPostProcessor.php index 9528371..6b6ac66 100644 --- a/src/Blueprint/PostProcessors/MongoSoftDeletesPostProcessor.php +++ b/src/Blueprint/PostProcessors/MongoSoftDeletesPostProcessor.php @@ -11,9 +11,7 @@ public function handle(string $model): void { $path = app_path("Models/{$model}.php"); - if (! File::exists($path)) { - return; - } + if (! File::exists($path)) return; $content = File::get($path); diff --git a/src/Blueprint/PostProcessors/MongoVisibilityPostProcessor.php b/src/Blueprint/PostProcessors/MongoVisibilityPostProcessor.php index be3abd5..13091ec 100644 --- a/src/Blueprint/PostProcessors/MongoVisibilityPostProcessor.php +++ b/src/Blueprint/PostProcessors/MongoVisibilityPostProcessor.php @@ -11,9 +11,7 @@ public function handle(string $model): void { $path = app_path("Models/{$model}.php"); - if (! File::exists($path)) { - return; - } + if (! File::exists($path)) return; $content = File::get($path); From 652abc79a7dba533e96364f8fcfcae8a55ec275d Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Thu, 18 Dec 2025 15:42:36 -0300 Subject: [PATCH 11/71] =?UTF-8?q?refactor:=20Remove=20pos=20processadores?= =?UTF-8?q?=20que=20n=C3=A3o=20est=C3=A3o=20mais=20sendo=20utilizados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MongoCastCleanupPostProcessor.php | 26 ----------- .../MongoModelPostProcessor.php | 43 ------------------- .../MongoSoftDeletesPostProcessor.php | 36 ---------------- .../MongoVisibilityPostProcessor.php | 28 ------------ 4 files changed, 133 deletions(-) delete mode 100644 src/Blueprint/PostProcessors/MongoCastCleanupPostProcessor.php delete mode 100644 src/Blueprint/PostProcessors/MongoModelPostProcessor.php delete mode 100644 src/Blueprint/PostProcessors/MongoSoftDeletesPostProcessor.php delete mode 100644 src/Blueprint/PostProcessors/MongoVisibilityPostProcessor.php diff --git a/src/Blueprint/PostProcessors/MongoCastCleanupPostProcessor.php b/src/Blueprint/PostProcessors/MongoCastCleanupPostProcessor.php deleted file mode 100644 index 3eb2f90..0000000 --- a/src/Blueprint/PostProcessors/MongoCastCleanupPostProcessor.php +++ /dev/null @@ -1,26 +0,0 @@ - Date: Thu, 18 Dec 2025 17:01:24 -0300 Subject: [PATCH 12/71] feat: Adiciona stub de teste --- src/Console/Commands/CuidsGenerateCommand.php | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Console/Commands/CuidsGenerateCommand.php b/src/Console/Commands/CuidsGenerateCommand.php index c586abc..84fe810 100644 --- a/src/Console/Commands/CuidsGenerateCommand.php +++ b/src/Console/Commands/CuidsGenerateCommand.php @@ -9,10 +9,9 @@ use Sysvale\CuidsGenerator\Console\Editors\FieldEditor; use Sysvale\CuidsGenerator\Console\Editors\RelationshipEditor; use Sysvale\CuidsGenerator\Blueprint\PostProcessorRunner; -use Sysvale\CuidsGenerator\Blueprint\PostProcessors\MongoCastCleanupPostProcessor; -use Sysvale\CuidsGenerator\Blueprint\PostProcessors\MongoModelPostProcessor; -use Sysvale\CuidsGenerator\Blueprint\PostProcessors\MongoSoftDeletesPostProcessor; -use Sysvale\CuidsGenerator\Blueprint\PostProcessors\MongoVisibilityPostProcessor; +use function Laravel\Prompts\text; +use function Laravel\Prompts\confirm; +use function Laravel\Prompts\note; class CuidsGenerateCommand extends Command { @@ -44,7 +43,7 @@ public function __construct( public function handle() { - $entity = $this->ask('Qual o nome do model (em inglês)?'); + $entity = text('Qual o nome do model (em inglês e no singular)?'); $fields = $this->fieldEditor->run($this); $relationships = []; @@ -53,10 +52,15 @@ public function handle() $this->newLine(); - if ($this->confirm('Adicionar relacionamentos?')) { - $this->newLine(); - + if (confirm( + label: 'Deseja adicionar relacionamentos a este model?', + default: true, + yes: 'Sim, configurar agora', + no: 'Não, pular esta estapa' + )) { $relationships = $this->relationshipEditor->run($this); + } else { + note('Nenhum relacionamento configurado.'); } $draft = $this->draftBuilder->build($entityStudly, $fields, $relationships); From 3d0c2a1ab753f2c7c2ec6ce4feb2c57ec2313fe6 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Thu, 18 Dec 2025 17:01:36 -0300 Subject: [PATCH 13/71] feat: Adiciona stub --- src/Blueprint/Stubs/controller.test.stub | 61 ++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/Blueprint/Stubs/controller.test.stub diff --git a/src/Blueprint/Stubs/controller.test.stub b/src/Blueprint/Stubs/controller.test.stub new file mode 100644 index 0000000..fbe8929 --- /dev/null +++ b/src/Blueprint/Stubs/controller.test.stub @@ -0,0 +1,61 @@ +count(3)->create(); + + $this->getJson(route('{{ route }}.index')) + ->assertStatus(200); + } + + public function testIf{{ model }}CanBeCreated(): void + { + $data = {{ model }}::factory()->make()->toArray(); + + $this->postJson(route('{{ route }}.store'), $data) + ->assertStatus(201); + } + + public function testIf{{ model }}CanBeShown(): void + { + $model = {{ model }}::factory()->create(); + + $this->getJson(route('{{ route }}.show', $model)) + ->assertStatus(200); + } + + public function testIf{{ model }}CanBeUpdated(): void + { + $model = {{ model }}::factory()->create(); + $updatedData = {{ model }}::factory()->make()->toArray(); + + $response = $this->putJson(route('{{ route }}.update', $model), $updatedData) + ->assertStatus(200); + } + + public function testIf{{ model }}CanBeDeleted(): void + { + $model = {{ model }}::factory()->create(); + + $response = $this->deleteJson(route('{{ route }}.destroy', $model)) + ->assertStatus(200); + + $this->assertDatabaseMissing('{{ table }}', ['id' => $model->id]); + } +} From 42d7fa4e882b0171d22b80499891addd86add753 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Thu, 18 Dec 2025 17:02:14 -0300 Subject: [PATCH 14/71] refactor: Refatora logica de exibicao do prompt para padrao do laravel disponivel a partir da versao 10 --- src/Console/Editors/FieldEditor.php | 126 ++++++++++++++------- src/Console/Editors/RelationshipEditor.php | 112 +++++++++++------- 2 files changed, 156 insertions(+), 82 deletions(-) diff --git a/src/Console/Editors/FieldEditor.php b/src/Console/Editors/FieldEditor.php index 67cea4c..27f4edd 100644 --- a/src/Console/Editors/FieldEditor.php +++ b/src/Console/Editors/FieldEditor.php @@ -4,6 +4,12 @@ use Sysvale\CuidsGenerator\Support\FieldType; use Illuminate\Console\Command; +use function Laravel\Prompts\select; +use function Laravel\Prompts\text; +use function Laravel\Prompts\table; +use function Laravel\Prompts\info; +use function Laravel\Prompts\warning; +use function Laravel\Prompts\confirm; class FieldEditor { @@ -11,80 +17,114 @@ public function run(Command $cli): array { $fields = []; - $cli->info('Configuração dos campos'); + info('Configuração dos campos'); while (true) { - $action = $cli->choice( - 'Campos', - ['Adicionar', 'Atualizar nome', 'Atualizar tipo', 'Remover', 'Listar', 'Finalizar'], + $action = select( + label: 'O que deseja fazer com os campos?', + options: [ + 'add' => 'Adicionar', + 'rename' => 'Atualizar nome', + 'change-type' => 'Atualizar tipo', + 'remove' => 'Remover', + 'list' => 'Listar', + 'done' => 'Ir para próxima etapa', + ], + default: 'add', ); match ($action) { - 'Adicionar' => $this->add($cli, $fields), - 'Atualizar nome' => $this->rename($cli, $fields), - 'Atualizar tipo' => $this->changeType($cli, $fields), - 'Remover' => $this->remove($cli, $fields), - 'Listar' => $this->list($cli, $fields), - 'Finalizar' => null, + 'add' => $this->add($fields), + 'rename' => $this->rename($fields), + 'change-type' => $this->changeType($fields), + 'remove' => $this->remove($fields), + 'list' => $this->list($fields), + 'done' => null, }; - if ($action === 'Finalizar') break; + if ($action === 'done') break; } return $fields; } - private function add(Command $cli, array &$fields): void + private function add(array &$fields): void { - $name = $cli->ask('Nome do campo'); - - if (! $name || isset($fields[$name])) { - $cli->warn('Campo inválido ou duplicado.'); - return; - } - - $type = $cli->choice('Tipo', FieldType::values(), 0); + $name = text( + label: 'Nome do campo', + placeholder: 'ex: title', + validate: fn (string $value) => match (true) { + empty($value) => 'O nome é obrigatório', + isset($fields[$value]) => 'Este campo já existe', + default => null, + } + ); + + $type = select( + label: "Qual o tipo de '{$name}'?", + options: FieldType::values(), + default: FieldType::values()[0] + ); $fields[$name] = $type; } - private function rename(Command $cli, array &$fields): void +private function rename(array &$fields): void { - if (empty($fields)) { - $cli->warn('Nenhum campo.'); - return; - } - - $old = $cli->choice('Campo', array_keys($fields)); - $new = $cli->ask('Novo nome'); - - if (! $new || isset($fields[$new])) { - $cli->warn('Nome inválido.'); - return; - } + if ($this->isEmpty($fields)) return; + + $old = select('Selecione o campo para renomear', array_keys($fields)); + $new = text( + label: "Novo nome para '{$old}'", + validate: fn (string $value) => match (true) { + empty($value) => 'O nome é obrigatório.', + isset($fields[$value]) => 'Este nome já está em uso.', + default => null, + } + ); $fields[$new] = $fields[$old]; unset($fields[$old]); } - private function changeType(Command $cli, array &$fields): void + private function changeType(array &$fields): void { - if (empty($fields)) return; + if ($this->isEmpty($fields)) return; - $name = $cli->choice('Campo', array_keys($fields)); - $fields[$name] = $cli->choice('Tipo', FieldType::values(), 0); + $name = select('Alterar tipo de qual campo?', array_keys($fields)); + $fields[$name] = select( + label: "Novo tipo para '{$name}'", + options: FieldType::values() + ); } - private function remove(Command $cli, array &$fields): void + private function remove(array &$fields): void { - if (empty($fields)) return; + if ($this->isEmpty($fields)) return; - $name = $cli->choice('Campo', array_keys($fields)); - unset($fields[$name]); + $name = select('Remover qual campo?', array_keys($fields)); + + if (confirm("Tem certeza que deseja remover '{$name}'?")) { + unset($fields[$name]); + } } - private function list(Command $cli, array $fields): void + private function list(array $fields): void { - $cli->table(['Campo', 'Tipo'], collect($fields)->map(fn ($t, $n) => [$n, $t])); + if ($this->isEmpty($fields)) return; + + table( + ['Campo', 'Tipo'], + collect($fields)->map(fn ($t, $n) => [$n, $t])->toArray() + ); + } + + private function isEmpty(array $fields): bool + { + if (empty($fields)) { + warning('Nenhum campo configurado até o momento.'); + return true; + } + return false; } } diff --git a/src/Console/Editors/RelationshipEditor.php b/src/Console/Editors/RelationshipEditor.php index b7bbe81..e82c33d 100644 --- a/src/Console/Editors/RelationshipEditor.php +++ b/src/Console/Editors/RelationshipEditor.php @@ -4,6 +4,12 @@ use Sysvale\CuidsGenerator\Support\RelationshipType; use Illuminate\Console\Command; +use function Laravel\Prompts\select; +use function Laravel\Prompts\text; +use function Laravel\Prompts\table; +use function Laravel\Prompts\info; +use function Laravel\Prompts\warning; +use function Laravel\Prompts\confirm; class RelationshipEditor { @@ -11,75 +17,103 @@ public function run(Command $cli): array { $relationships = []; - $cli->info('Configuração de relacionamentos'); + info('Configuração de Relacionamentos (MongoDB)'); while (true) { - $action = $cli->choice( - 'Relacionamentos', - ['Adicionar', 'Atualizar', 'Remover', 'Listar', 'Finalizar'], + $action = select( + label: 'Gerenciar relacionamentos', + options: [ + 'add' => 'Adicionar novo', + 'update' => 'Atualizar existente', + 'remove' => 'Remover', + 'list' => 'Listar todos', + 'done' => 'Finalizar', + ], + default: 'add' ); + if ($action === 'done') break; + match ($action) { - 'Adicionar' => $this->add($cli, $relationships), - 'Atualizar' => $this->update($cli, $relationships), - 'Remover' => $this->remove($cli, $relationships), - 'Listar' => $this->list($cli, $relationships), - 'Finalizar' => null, + 'add' => $this->add($relationships), + 'update' => $this->update($relationships), + 'remove' => $this->remove($relationships), + 'list' => $this->list($relationships), }; - - if ($action === 'Finalizar') break; } return $relationships; } - private function add(Command $cli, array &$fields): void + private function add(array &$relationships): void { - $name = $cli->ask('Nome da collection (Ex: User)'); - - if (! $name || isset($fields[$name])) { - $cli->warn('Campo inválido ou duplicado.'); - return; - } + $name = text( + label: 'Nome do Model relacionado (Ex: User, Category)', + placeholder: 'Sempre em StudlyCase e singular', + validate: fn (string $value) => match (true) { + empty($value) => 'O nome é obrigatório.', + isset($relationships[$value]) => 'Este relacionamento já foi definido.', + default => null, + } + ); - $type = $cli->choice('Tipo de relacionamento', RelationshipType::values()); + $type = select( + label: "Qual o tipo de relacionamento com '{$name}'?", + options: RelationshipType::values(), + hint: 'Lembre-se: belongsTo criará um campo _id no documento atual.' + ); - $fields[$name] = $type; + $relationships[$name] = $type; + info("Relacionamento '{$name} ({$type})' adicionado."); } - private function update(Command $cli, array &$relationships): void + private function update(array &$relationships): void { - if (empty($relationships)) { - $cli->warn('Nenhum relacionamento.'); - return; - } + if ($this->isEmpty($relationships)) return; - $collection = $cli->choice( - 'Escolha a collection para atualizar o relacionamento', + $collection = select( + 'Selecione o relacionamento para atualizar', array_keys($relationships) ); - $newType = $cli->choice( - 'Novo tipo de relacionamento', - RelationshipType::values(), - 0 + $newType = select( + label: "Novo tipo para '{$collection}'", + options: RelationshipType::values(), + default: $relationships[$collection] ); $relationships[$collection] = $newType; + info("Atualizado: '{$collection}' agora é '{$newType}'."); + } + + private function remove(array &$relationships): void + { + if ($this->isEmpty($relationships)) return; - $cli->info("Relacionamento de '{$collection}' atualizado para '{$newType}'."); + $name = select('Remover qual relacionamento?', array_keys($relationships)); + + if (confirm("Deseja realmente remover o vínculo com '{$name}'?")) { + unset($relationships[$name]); + warning("Relacionamento com '{$name}' removido."); + } } - private function remove(Command $cli, array &$fields): void + private function list(array $relationships): void { - if (empty($fields)) return; + if ($this->isEmpty($relationships)) return; - $name = $cli->choice('Escolhar a collection para remover o relacionamento', array_keys($fields)); - unset($fields[$name]); + table( + ['Model Relacionado', 'Tipo'], + collect($relationships)->map(fn ($t, $n) => [$n, $t])->toArray() + ); } - private function list(Command $cli, array $fields): void + private function isEmpty(array $relationships): bool { - $cli->table(['Collection', 'Relacionamento'], collect($fields)->map(fn ($t, $n) => [$n, $t])); + if (empty($relationships)) { + warning('Nenhum relacionamento configurado.'); + return true; + } + return false; } -} +} \ No newline at end of file From f0f5e5037ed73ec387d3ab403a62d361b72d8ff4 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Thu, 18 Dec 2025 17:02:45 -0300 Subject: [PATCH 15/71] refactor: Atualiza e agrupa logicas de pos processamentos --- .../PostProcessors/FactoryPostProcessor.php | 31 +++++++++++++++ .../PostProcessors/RequestPostProcessor.php | 37 ++++++++++++++++++ .../PostProcessors/TestPostProcessor.php | 38 +++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 src/Blueprint/PostProcessors/FactoryPostProcessor.php create mode 100644 src/Blueprint/PostProcessors/RequestPostProcessor.php create mode 100644 src/Blueprint/PostProcessors/TestPostProcessor.php diff --git a/src/Blueprint/PostProcessors/FactoryPostProcessor.php b/src/Blueprint/PostProcessors/FactoryPostProcessor.php new file mode 100644 index 0000000..0b73041 --- /dev/null +++ b/src/Blueprint/PostProcessors/FactoryPostProcessor.php @@ -0,0 +1,31 @@ +\s*([\w\\\]+)::factory\(\),/i", + "'$1' => $2::factory()->create()->id,", + $content + ); + + File::put($path, $content); + } +} \ No newline at end of file diff --git a/src/Blueprint/PostProcessors/RequestPostProcessor.php b/src/Blueprint/PostProcessors/RequestPostProcessor.php new file mode 100644 index 0000000..c031fa0 --- /dev/null +++ b/src/Blueprint/PostProcessors/RequestPostProcessor.php @@ -0,0 +1,37 @@ +\s*\[(.*?)'integer'(.*?)\]/", + "'$1' => [$2'string'$3]", + $content + ); + + $content = preg_replace( + "/exists:([a-zA-Z0-9_]+),id/", + "exists:$1,_id", + $content + ); + + File::put($path, $content); + } + } +} \ No newline at end of file diff --git a/src/Blueprint/PostProcessors/TestPostProcessor.php b/src/Blueprint/PostProcessors/TestPostProcessor.php new file mode 100644 index 0000000..e767d71 --- /dev/null +++ b/src/Blueprint/PostProcessors/TestPostProcessor.php @@ -0,0 +1,38 @@ + $model, + '{{ pluralModel }}' => Str::plural($model), + '{{ route }}' => Str::kebab(Str::plural($model)), + '{{ table }}' => Str::snake(Str::plural($model)), + '{{ variable }}' => Str::camel($model), + ]; + + $content = str_replace( + array_keys($replaces), + array_values($replaces), + $stub + ); + + File::put($path, $content); + } +} \ No newline at end of file From 25b20b9b2b945bd7e70f27e764dc3c666af1bdc3 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Thu, 18 Dec 2025 17:03:07 -0300 Subject: [PATCH 16/71] refactor: Altera logica de montagem da validacao --- src/Blueprint/Builders/RequestBuilder.php | 6 ++++-- .../Builders/ValidationRuleBuilder.php | 18 ++++-------------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/Blueprint/Builders/RequestBuilder.php b/src/Blueprint/Builders/RequestBuilder.php index f4063d9..1b90ac7 100644 --- a/src/Blueprint/Builders/RequestBuilder.php +++ b/src/Blueprint/Builders/RequestBuilder.php @@ -8,9 +8,11 @@ class RequestBuilder { public function build(string $model, array $fields): array { + $rules = ValidationRuleBuilder::build($fields); + return [ - "Store{$model}Request" => ValidationRuleBuilder::required($fields), - "Update{$model}Request" => ValidationRuleBuilder::optional($fields), + "Store{$model}Request" => $rules, + "Update{$model}Request" => $rules, ]; } } diff --git a/src/Blueprint/Builders/ValidationRuleBuilder.php b/src/Blueprint/Builders/ValidationRuleBuilder.php index 4876fa4..c371bb8 100644 --- a/src/Blueprint/Builders/ValidationRuleBuilder.php +++ b/src/Blueprint/Builders/ValidationRuleBuilder.php @@ -4,22 +4,12 @@ class ValidationRuleBuilder { - public static function required(array $fields): array + public static function build(array $fields): array { - return self::build($fields, false); + return collect($fields)->map(fn ($type) => self::rule($type))->toArray(); } - public static function optional(array $fields): array - { - return self::build($fields, true); - } - - private static function build(array $fields, bool $partial): array - { - return collect($fields)->map(fn ($type) => self::rule($type, $partial))->toArray(); - } - - private static function rule(string $type, bool $partial): string + private static function rule(string $type): string { $rules = match ($type) { 'string' => 'string|max:255', @@ -29,6 +19,6 @@ private static function rule(string $type, bool $partial): string default => 'string', }; - return $partial ? "sometimes|{$rules}" : "required|{$rules}"; + return "required|{$rules}"; } } From ed1a46d6fdf3e5348aec75443905e6bb64bd34be Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Thu, 18 Dec 2025 17:03:26 -0300 Subject: [PATCH 17/71] refactor: Atualiza provider removendo processors que nao estao mais sendo utilizados --- src/Providers/CuidsGeneratorServiceProvider.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Providers/CuidsGeneratorServiceProvider.php b/src/Providers/CuidsGeneratorServiceProvider.php index 90aab7a..67f1a61 100644 --- a/src/Providers/CuidsGeneratorServiceProvider.php +++ b/src/Providers/CuidsGeneratorServiceProvider.php @@ -2,13 +2,13 @@ namespace Sysvale\CuidsGenerator\Providers; +use Illuminate\Support\Facades\Request; use Illuminate\Support\ServiceProvider; use Sysvale\CuidsGenerator\Console\Commands\CuidsGenerateCommand; use Sysvale\CuidsGenerator\Blueprint\PostProcessorRunner; -use Sysvale\CuidsGenerator\Blueprint\PostProcessors\MongoCastCleanupPostProcessor; -use Sysvale\CuidsGenerator\Blueprint\PostProcessors\MongoModelPostProcessor; -use Sysvale\CuidsGenerator\Blueprint\PostProcessors\MongoSoftDeletesPostProcessor; -use Sysvale\CuidsGenerator\Blueprint\PostProcessors\MongoVisibilityPostProcessor; +use Sysvale\CuidsGenerator\Blueprint\PostProcessors\FactoryPostProcessor; +use Sysvale\CuidsGenerator\Blueprint\PostProcessors\Mongo\MongoModelTransformer; +use Sysvale\CuidsGenerator\Blueprint\PostProcessors\RequestPostProcessor; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\TestPostProcessor; class CuidsGeneratorServiceProvider extends ServiceProvider @@ -28,10 +28,10 @@ private function registerPostProcessors(): void { $this->app->singleton(PostProcessorRunner::class, function ($app) { return new PostProcessorRunner([ - $app->make(MongoModelPostProcessor::class), - $app->make(MongoCastCleanupPostProcessor::class), - $app->make(MongoSoftDeletesPostProcessor::class), - $app->make(MongoVisibilityPostProcessor::class), + $app->make(MongoModelTransformer::class), + $app->make(FactoryPostProcessor::class), + $app->make(RequestPostProcessor::class), + $app->make(TestPostProcessor::class), ]); }); } From 27d5e7ee4355c187b3b0a373e65ef9d45f95c522 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Thu, 18 Dec 2025 17:03:47 -0300 Subject: [PATCH 18/71] feat: Adiciona novo pos processador --- src/Blueprint/Builders/ControllerBuilder.php | 3 + .../Mongo/MongoModelTransformer.php | 94 +++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php diff --git a/src/Blueprint/Builders/ControllerBuilder.php b/src/Blueprint/Builders/ControllerBuilder.php index 8e1400a..15c117a 100644 --- a/src/Blueprint/Builders/ControllerBuilder.php +++ b/src/Blueprint/Builders/ControllerBuilder.php @@ -20,6 +20,7 @@ public function build(string $model): array 'store' => [ 'validate' => "Store{$model}Request", 'save' => $singularVar, + 'respond' => 201, ], 'show' => [ 'resource' => $singularVar, @@ -27,9 +28,11 @@ public function build(string $model): array 'update' => [ 'validate' => "Update{$model}Request", 'update' => $singularVar, + 'respond' => 200 ], 'destroy' => [ 'delete' => $singularVar, + 'respond' => 204 ], ], ]; diff --git a/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php b/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php new file mode 100644 index 0000000..4e76b24 --- /dev/null +++ b/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php @@ -0,0 +1,94 @@ +setupBaseStructure($content, $model); + + $content = $this->applySoftDeletes($content); + + $content = $this->cleanupCasts($content); + + $content = $this->setupVisibility($content); + + File::put($path, $content); + } + + protected function setupBaseStructure(string $content, string $model): string + { + $content = str_replace( + 'use Illuminate\Database\Eloquent\Model;', + 'use MongoDB\Laravel\Eloquent\Model;', + $content + ); + + if (!str_contains($content, 'protected $connection')) { + $collection = Str::snake(Str::pluralStudly($model)); + + $content = preg_replace( + '/(class\s+' . $model . '\s+extends\s+Model\s*\{)/', + "$1\n protected \$connection = 'mongodb';\n protected \$collection = '{$collection}';", + $content + ); + } + + return $content; + } + + protected function applySoftDeletes(string $content): string + { + if (!str_contains($content, 'MongoDB\\Laravel\\Eloquent\\SoftDeletes')) { + $content = str_replace( + "use MongoDB\Laravel\Eloquent\Model;", + "use MongoDB\Laravel\Eloquent\Model;\nuse MongoDB\Laravel\Eloquent\SoftDeletes;", + $content + ); + } + + if (!str_contains($content, 'use SoftDeletes;')) { + $content = preg_replace( + '/(use HasFactory;)/', + "$1\n use SoftDeletes;", + $content + ); + } + + return $content; + } + + protected function cleanupCasts(string $content): string + { + return preg_replace( + '/protected function casts\(\): array\s*\{[\s\S]*?\n\s*\}/', + '', + $content + ); + } + + protected function setupVisibility(string $content): string + { + if (!str_contains($content, 'protected $appends')) { + + $content = preg_replace( + '/(protected\s+\$fillable\s*=\s*\[[^\]]*\];)/s', + "$1\n\n protected \$appends = ['id'];\n protected \$hidden = ['_id'];", + $content + ); + } + + return $content; + } +} \ No newline at end of file From f2270807aef038d67740342281d1bc1be71ce11e Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Fri, 19 Dec 2025 11:36:14 -0300 Subject: [PATCH 19/71] feat: Instala orchestra para poder utilizar comandos de pacotes --- composer.json | 5 +- composer.lock | 8616 +++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 7263 insertions(+), 1358 deletions(-) diff --git a/composer.json b/composer.json index b7c7f09..ced36bf 100644 --- a/composer.json +++ b/composer.json @@ -24,5 +24,8 @@ } }, "minimum-stability": "dev", - "prefer-stable": true + "prefer-stable": true, + "require-dev": { + "orchestra/testbench": "^9.0" + } } diff --git a/composer.lock b/composer.lock index 99017ab..502fb38 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": "089723f04f0117f5cc1b14539aed6dd4", + "content-hash": "03184e0f33e8c861867a42dcb902e005", "packages": [ { "name": "brick/math", @@ -135,6 +135,81 @@ ], "time": "2024-02-09T16:56:22+00:00" }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, { "name": "doctrine/inflector", "version": "2.1.0", @@ -226,38 +301,33 @@ "time": "2025-08-10T19:31:58+00:00" }, { - "name": "illuminate/bus", - "version": "v11.47.0", + "name": "doctrine/lexer", + "version": "3.0.1", "source": { "type": "git", - "url": "https://github.com/illuminate/bus.git", - "reference": "2adf211bada7184410501b37882845230d6bf2f4" + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/bus/zipball/2adf211bada7184410501b37882845230d6bf2f4", - "reference": "2adf211bada7184410501b37882845230d6bf2f4", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", "shasum": "" }, "require": { - "illuminate/collections": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/pipeline": "^11.0", - "illuminate/support": "^11.0", - "php": "^8.2" + "php": "^8.1" }, - "suggest": { - "illuminate/queue": "Required to use closures when chaining jobs (^7.0)." + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, "autoload": { "psr-4": { - "Illuminate\\Bus\\": "" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -266,54 +336,81 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "description": "The Illuminate Bus package.", - "homepage": "https://laravel.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/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" }, - "time": "2025-10-14T19:59:30+00:00" + "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": "2024-02-05T11:56:58+00:00" }, { - "name": "illuminate/collections", - "version": "v11.47.0", + "name": "dragonmantank/cron-expression", + "version": "v3.6.0", "source": { "type": "git", - "url": "https://github.com/illuminate/collections.git", - "reference": "856b1da953e46281ba61d7c82d337072d3ee1825" + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/856b1da953e46281ba61d7c82d337072d3ee1825", - "reference": "856b1da953e46281ba61d7c82d337072d3ee1825", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013", "shasum": "" }, "require": { - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "php": "^8.2" + "php": "^8.2|^8.3|^8.4|^8.5" }, - "suggest": { - "symfony/var-dumper": "Required to use the dump method (^7.0)." + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.32|^2.1.31", + "phpunit/phpunit": "^8.5.48|^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { - "files": [ - "functions.php", - "helpers.php" - ], "psr-4": { - "Illuminate\\Support\\": "" + "Cron\\": "src/Cron/" } }, "notification-url": "https://packagist.org/downloads/", @@ -322,44 +419,63 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" } ], - "description": "The Illuminate Collections package.", - "homepage": "https://laravel.com", + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.6.0" }, - "time": "2025-03-24T11:54:20+00:00" + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2025-10-31T18:51:33+00:00" }, { - "name": "illuminate/conditionable", - "version": "v11.47.0", + "name": "egulias/email-validator", + "version": "4.0.4", "source": { "type": "git", - "url": "https://github.com/illuminate/conditionable.git", - "reference": "319b717e0587bd7c8a3b44464f0e27867b4bcda9" + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/conditionable/zipball/319b717e0587bd7c8a3b44464f0e27867b4bcda9", - "reference": "319b717e0587bd7c8a3b44464f0e27867b4bcda9", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", "shasum": "" }, "require": { - "php": "^8.0.2" + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { "psr-4": { - "Illuminate\\Support\\": "" + "Egulias\\EmailValidator\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -368,64 +484,62 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Eduardo Gulias Davis" } ], - "description": "The Illuminate Conditionable package.", - "homepage": "https://laravel.com", + "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/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" }, - "time": "2025-03-24T11:54:20+00:00" + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2025-03-06T22:45:56+00:00" }, { - "name": "illuminate/console", - "version": "v11.47.0", + "name": "fruitcake/php-cors", + "version": "v1.4.0", "source": { "type": "git", - "url": "https://github.com/illuminate/console.git", - "reference": "a41fbfc99bac948ee27fc8d99bb0e5b4175dec00" + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/console/zipball/a41fbfc99bac948ee27fc8d99bb0e5b4175dec00", - "reference": "a41fbfc99bac948ee27fc8d99bb0e5b4175dec00", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", "shasum": "" }, "require": { - "ext-mbstring": "*", - "illuminate/collections": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "illuminate/support": "^11.0", - "illuminate/view": "^11.0", - "laravel/prompts": "^0.1.20|^0.2|^0.3", - "nunomaduro/termwind": "^2.0", - "php": "^8.2", - "symfony/console": "^7.0.3", - "symfony/polyfill-php83": "^1.31", - "symfony/process": "^7.0.3" + "php": "^8.1", + "symfony/http-foundation": "^5.4|^6.4|^7.3|^8" }, - "suggest": { - "dragonmantank/cron-expression": "Required to use scheduler (^3.3.2).", - "ext-pcntl": "Required to use signal trapping.", - "guzzlehttp/guzzle": "Required to use the ping methods on schedules (^7.8).", - "illuminate/bus": "Required to use the scheduled job dispatcher (^11.0).", - "illuminate/container": "Required to use the scheduler (^11.0).", - "illuminate/filesystem": "Required to use the generator command (^11.0).", - "illuminate/queue": "Required to use closures for scheduled jobs (^11.0)." + "require-dev": { + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "1.3-dev" } }, "autoload": { "psr-4": { - "Illuminate\\Console\\": "" + "Fruitcake\\Cors\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -434,49 +548,62 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" } ], - "description": "The Illuminate Console package.", - "homepage": "https://laravel.com", + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.4.0" }, - "time": "2025-11-11T13:49:37+00:00" + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-12-03T09:33:47+00:00" }, { - "name": "illuminate/container", - "version": "v11.47.0", + "name": "graham-campbell/result-type", + "version": "v1.1.3", "source": { "type": "git", - "url": "https://github.com/illuminate/container.git", - "reference": "79bf9149ad7ddd7e14326ebcdd41197d2c4ee36a" + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/container/zipball/79bf9149ad7ddd7e14326ebcdd41197d2c4ee36a", - "reference": "79bf9149ad7ddd7e14326ebcdd41197d2c4ee36a", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", "shasum": "" }, "require": { - "illuminate/contracts": "^11.0", - "php": "^8.2", - "psr/container": "^1.1.1|^2.0.1" + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" }, - "provide": { - "psr/container-implementation": "1.1|2.0" + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, "autoload": { "psr-4": { - "Illuminate\\Container\\": "" + "GrahamCampbell\\ResultType\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -485,46 +612,86 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" } ], - "description": "The Illuminate Container package.", - "homepage": "https://laravel.com", + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" }, - "time": "2025-03-24T11:54:20+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" }, { - "name": "illuminate/contracts", - "version": "v11.47.0", + "name": "guzzlehttp/guzzle", + "version": "7.10.0", "source": { "type": "git", - "url": "https://github.com/illuminate/contracts.git", - "reference": "4787042340aae19a7ea0fa82f4073c4826204a48" + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/4787042340aae19a7ea0fa82f4073c4826204a48", - "reference": "4787042340aae19a7ea0fa82f4073c4826204a48", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", "shasum": "" }, "require": { - "php": "^8.2", - "psr/container": "^1.1.1|^2.0.1", - "psr/simple-cache": "^1.0|^2.0|^3.0" + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "11.x-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { - "Illuminate\\Contracts\\": "" + "GuzzleHttp\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -533,61 +700,104 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], - "description": "The Illuminate Contracts package.", - "homepage": "https://laravel.com", + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" }, - "time": "2025-11-27T16:16:07+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-08-23T22:36:01+00:00" }, { - "name": "illuminate/database", - "version": "v11.47.0", + "name": "guzzlehttp/promises", + "version": "2.3.0", "source": { "type": "git", - "url": "https://github.com/illuminate/database.git", - "reference": "96abcce13f405701363d916dd312835e04848d04" + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/database/zipball/96abcce13f405701363d916dd312835e04848d04", - "reference": "96abcce13f405701363d916dd312835e04848d04", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", "shasum": "" }, "require": { - "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12|^0.13|^0.14", - "ext-pdo": "*", - "illuminate/collections": "^11.0", - "illuminate/container": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "illuminate/support": "^11.0", - "laravel/serializable-closure": "^1.3|^2.0", - "php": "^8.2" + "php": "^7.2.5 || ^8.0" }, - "suggest": { - "ext-filter": "Required to use the Postgres database driver.", - "fakerphp/faker": "Required to use the eloquent factory builder (^1.24).", - "illuminate/console": "Required to use the database commands (^11.0).", - "illuminate/events": "Required to use the observers with Eloquent (^11.0).", - "illuminate/filesystem": "Required to use the migrations (^11.0).", - "illuminate/pagination": "Required to paginate the result set (^11.0).", - "symfony/finder": "Required to use Eloquent model factories (^7.0)." + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "11.x-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { - "Illuminate\\Database\\": "" + "GuzzleHttp\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -596,126 +806,92 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], - "description": "The Illuminate Database package.", - "homepage": "https://laravel.com", + "description": "Guzzle promises library", "keywords": [ - "database", - "laravel", - "orm", - "sql" + "promise" ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" }, - "time": "2025-09-29T09:23:31+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:34:08+00:00" }, { - "name": "illuminate/events", - "version": "v11.47.0", + "name": "guzzlehttp/psr7", + "version": "2.8.0", "source": { "type": "git", - "url": "https://github.com/illuminate/events.git", - "reference": "b72dab66d8e05d22dc5aa949efec150bbc73e827" + "url": "https://github.com/guzzle/psr7.git", + "reference": "21dc724a0583619cd1652f673303492272778051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/events/zipball/b72dab66d8e05d22dc5aa949efec150bbc73e827", - "reference": "b72dab66d8e05d22dc5aa949efec150bbc73e827", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", "shasum": "" }, "require": { - "illuminate/bus": "^11.0", - "illuminate/collections": "^11.0", - "illuminate/container": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "illuminate/support": "^11.0", - "php": "^8.2" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "files": [ - "functions.php" - ], - "psr-4": { - "Illuminate\\Events\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Events package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2025-03-24T11:54:20+00:00" - }, - { - "name": "illuminate/filesystem", - "version": "v11.47.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/filesystem.git", - "reference": "d1f217b75ee193bbe27f31df8a94ff6759f31469" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/filesystem/zipball/d1f217b75ee193bbe27f31df8a94ff6759f31469", - "reference": "d1f217b75ee193bbe27f31df8a94ff6759f31469", - "shasum": "" + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" }, - "require": { - "illuminate/collections": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "illuminate/support": "^11.0", - "php": "^8.2", - "symfony/finder": "^7.0.3" + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { - "ext-fileinfo": "Required to use the Filesystem class.", - "ext-ftp": "Required to use the Flysystem FTP driver.", - "ext-hash": "Required to use the Filesystem class.", - "illuminate/http": "Required for handling uploaded files (^7.0).", - "league/flysystem": "Required to use the Flysystem local driver (^3.25.1).", - "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", - "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", - "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", - "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).", - "symfony/mime": "Required to enable support for guessing extensions (^7.0)." + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "11.x-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "files": [ - "functions.php" - ], "psr-4": { - "Illuminate\\Filesystem\\": "" + "GuzzleHttp\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -724,169 +900,105 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Filesystem package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2025-03-24T11:54:20+00:00" - }, - { - "name": "illuminate/macroable", - "version": "v11.47.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/macroable.git", - "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/macroable/zipball/e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", - "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", - "shasum": "" - }, - "require": { - "php": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], - "description": "The Illuminate Macroable package.", - "homepage": "https://laravel.com", + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2024-06-28T20:10:30+00:00" - }, - { - "name": "illuminate/pipeline", - "version": "v11.47.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/pipeline.git", - "reference": "f73bb7cab13ac8ef91094dc46976f5e992eea127" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/pipeline/zipball/f73bb7cab13ac8ef91094dc46976f5e992eea127", - "reference": "f73bb7cab13ac8ef91094dc46976f5e992eea127", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^11.0", - "illuminate/support": "^11.0", - "php": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Pipeline\\": "" - } + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.8.0" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + "funding": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" } ], - "description": "The Illuminate Pipeline package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2025-03-24T11:54:20+00:00" + "time": "2025-08-23T21:21:41+00:00" }, { - "name": "illuminate/support", - "version": "v11.47.0", + "name": "guzzlehttp/uri-template", + "version": "v1.0.5", "source": { "type": "git", - "url": "https://github.com/illuminate/support.git", - "reference": "20fbd9f9f502a55de0cbba3f3f81444b7c44af4b" + "url": "https://github.com/guzzle/uri-template.git", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/20fbd9f9f502a55de0cbba3f3f81444b7c44af4b", - "reference": "20fbd9f9f502a55de0cbba3f3f81444b7c44af4b", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1", "shasum": "" }, "require": { - "doctrine/inflector": "^2.0", - "ext-ctype": "*", - "ext-filter": "*", - "ext-mbstring": "*", - "illuminate/collections": "^11.0", - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "nesbot/carbon": "^2.72.6|^3.8.4", - "php": "^8.2", - "voku/portable-ascii": "^2.0.2" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "replace": { - "spatie/once": "*" + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" }, - "suggest": { - "illuminate/filesystem": "Required to use the Composer class (^11.0).", - "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", - "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).", - "league/uri": "Required to use the Uri class (^7.5.1).", - "ramsey/uuid": "Required to use Str::uuid() (^4.7).", - "symfony/process": "Required to use the Composer class (^7.0).", - "symfony/uid": "Required to use Str::ulid() (^7.0).", - "symfony/var-dumper": "Required to use the dd function (^7.0).", - "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25", + "uri-template/tests": "1.0.0" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "11.x-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "files": [ - "functions.php", - "helpers.php" - ], "psr-4": { - "Illuminate\\Support\\": "" + "GuzzleHttp\\UriTemplate\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -895,71 +1007,50 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" } ], - "description": "The Illuminate Support package.", - "homepage": "https://laravel.com", + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2025-11-27T16:16:32+00:00" - }, - { - "name": "illuminate/view", - "version": "v11.47.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/view.git", - "reference": "9da5543dccb4e406f98016bac8678c97b7dc6915" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/view/zipball/9da5543dccb4e406f98016bac8678c97b7dc6915", - "reference": "9da5543dccb4e406f98016bac8678c97b7dc6915", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "illuminate/collections": "^11.0", - "illuminate/container": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/events": "^11.0", - "illuminate/filesystem": "^11.0", - "illuminate/macroable": "^11.0", - "illuminate/support": "^11.0", - "php": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "11.x-dev" - } + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.5" }, - "autoload": { - "psr-4": { - "Illuminate\\View\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + "funding": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" } ], - "description": "The Illuminate View package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2025-03-24T11:54:20+00:00" + "time": "2025-08-22T14:27:06+00:00" }, { "name": "jasonmccreary/laravel-test-assertions", @@ -1102,37 +1193,252 @@ "time": "2023-11-24T15:54:02+00:00" }, { - "name": "laravel/prompts", - "version": "v0.3.8", + "name": "laravel/framework", + "version": "v11.47.0", "source": { "type": "git", - "url": "https://github.com/laravel/prompts.git", - "reference": "096748cdfb81988f60090bbb839ce3205ace0d35" + "url": "https://github.com/laravel/framework.git", + "reference": "86693ffa1ba32f56f8c44e31416c6665095a62c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/096748cdfb81988f60090bbb839ce3205ace0d35", - "reference": "096748cdfb81988f60090bbb839ce3205ace0d35", + "url": "https://api.github.com/repos/laravel/framework/zipball/86693ffa1ba32f56f8c44e31416c6665095a62c5", + "reference": "86693ffa1ba32f56f8c44e31416c6665095a62c5", "shasum": "" }, "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12|^0.13|^0.14", "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.4", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", "ext-mbstring": "*", - "php": "^8.1", - "symfony/console": "^6.2|^7.0" + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1.18|^0.2.0|^0.3.0", + "laravel/serializable-closure": "^1.3|^2.0", + "league/commonmark": "^2.7", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", + "league/uri": "^7.5.1", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.72.6|^3.8.4", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^7.0.3", + "symfony/error-handler": "^7.0.3", + "symfony/finder": "^7.0.3", + "symfony/http-foundation": "^7.2.0", + "symfony/http-kernel": "^7.0.3", + "symfony/mailer": "^7.0.3", + "symfony/mime": "^7.0.3", + "symfony/polyfill-php83": "^1.31", + "symfony/process": "^7.0.3", + "symfony/routing": "^7.0.3", + "symfony/uid": "^7.0.3", + "symfony/var-dumper": "^7.0.3", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.6.1", + "voku/portable-ascii": "^2.0.2" }, "conflict": { - "illuminate/console": ">=10.17.0 <10.25.0", - "laravel/framework": ">=10.17.0 <10.25.0" + "tightenco/collect": "<5.5.33" }, - "require-dev": { - "illuminate/collections": "^10.0|^11.0|^12.0", - "mockery/mockery": "^1.5", - "pestphp/pest": "^2.3|^3.4|^4.0", - "phpstan/phpstan": "^1.12.28", - "phpstan/phpstan-mockery": "^1.1.3" + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" }, - "suggest": { + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.322.9", + "ext-gmp": "*", + "fakerphp/faker": "^1.24", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/psr7": "^2.4", + "laravel/pint": "^1.18", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", + "orchestra/testbench-core": "^9.16.1", + "pda/pheanstalk": "^5.0.6", + "php-http/discovery": "^1.15", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^10.5.35|^11.3.6|^12.0.1", + "predis/predis": "^2.3", + "resend/resend-php": "^0.10.0", + "symfony/cache": "^7.0.3", + "symfony/http-client": "^7.0.3", + "symfony/psr-http-message-bridge": "^7.0.3", + "symfony/translation": "^7.0.3" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "mockery/mockery": "Required to use mocking (^1.6).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.3.6|^12.0.1).", + "predis/predis": "Required to use the predis connector (^2.3).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/functions.php", + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Support/functions.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-11-28T18:20:11+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.3.8", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "096748cdfb81988f60090bbb839ce3205ace0d35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/096748cdfb81988f60090bbb839ce3205ace0d35", + "reference": "096748cdfb81988f60090bbb839ce3205ace0d35", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "illuminate/collections": "^10.0|^11.0|^12.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4|^4.0", + "phpstan/phpstan": "^1.12.28", + "phpstan/phpstan-mockery": "^1.1.3" + }, + "suggest": { "ext-pcntl": "Required for the spinner to be animated." }, "type": "library", @@ -1222,218 +1528,245 @@ "time": "2025-11-21T20:52:36+00:00" }, { - "name": "nesbot/carbon", - "version": "3.11.0", + "name": "league/commonmark", + "version": "2.8.0", "source": { "type": "git", - "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "bdb375400dcd162624531666db4799b36b64e4a1" + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/bdb375400dcd162624531666db4799b36b64e4a1", - "reference": "bdb375400dcd162624531666db4799b36b64e4a1", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/4efa10c1e56488e658d10adf7b7b7dcd19940bfb", + "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb", "shasum": "" }, "require": { - "carbonphp/carbon-doctrine-types": "<100.0", - "ext-json": "*", - "php": "^8.1", - "psr/clock": "^1.0", - "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", - "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" - }, - "provide": { - "psr/clock-implementation": "1.0" + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "doctrine/dbal": "^3.6.3 || ^4.0", - "doctrine/orm": "^2.15.2 || ^3.0", - "friendsofphp/php-cs-fixer": "^v3.87.1", - "kylekatarnls/multi-tester": "^2.5.3", - "phpmd/phpmd": "^2.15.0", - "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^2.1.22", - "phpunit/phpunit": "^10.5.53", - "squizlabs/php_codesniffer": "^3.13.4" + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" }, - "bin": [ - "bin/carbon" - ], "type": "library", "extra": { - "laravel": { - "providers": [ - "Carbon\\Laravel\\ServiceProvider" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - }, "branch-alias": { - "dev-2.x": "2.x-dev", - "dev-master": "3.x-dev" + "dev-main": "2.9-dev" } }, "autoload": { "psr-4": { - "Carbon\\": "src/Carbon/" + "League\\CommonMark\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "https://markido.com" - }, - { - "name": "kylekatarnls", - "homepage": "https://github.com/kylekatarnls" + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" } ], - "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "https://carbon.nesbot.com", + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", "keywords": [ - "date", - "datetime", - "time" + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" ], "support": { - "docs": "https://carbon.nesbot.com/docs", - "issues": "https://github.com/CarbonPHP/carbon/issues", - "source": "https://github.com/CarbonPHP/carbon" + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" }, "funding": [ { - "url": "https://github.com/sponsors/kylekatarnls", - "type": "github" + "url": "https://www.colinodell.com/sponsor", + "type": "custom" }, { - "url": "https://opencollective.com/Carbon#sponsor", - "type": "opencollective" + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" }, { - "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", "type": "tidelift" } ], - "time": "2025-12-02T21:04:28+00:00" + "time": "2025-11-26T21:48:24+00:00" }, { - "name": "nunomaduro/termwind", - "version": "v2.3.3", + "name": "league/config", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/nunomaduro/termwind.git", - "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017" + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/6fb2a640ff502caace8e05fd7be3b503a7e1c017", - "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", "shasum": "" }, "require": { - "ext-mbstring": "*", - "php": "^8.2", - "symfony/console": "^7.3.6" + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" }, "require-dev": { - "illuminate/console": "^11.46.1", - "laravel/pint": "^1.25.1", - "mockery/mockery": "^1.6.12", - "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.1.3", - "phpstan/phpstan": "^1.12.32", - "phpstan/phpstan-strict-rules": "^1.6.2", - "symfony/var-dumper": "^7.3.5", - "thecodingmachine/phpstan-strict-rules": "^1.0.0" + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" }, "type": "library", "extra": { - "laravel": { - "providers": [ - "Termwind\\Laravel\\TermwindServiceProvider" - ] - }, "branch-alias": { - "dev-2.x": "2.x-dev" + "dev-main": "1.2-dev" } }, "autoload": { - "files": [ - "src/Functions.php" - ], "psr-4": { - "Termwind\\": "src/" + "League\\Config\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" } ], - "description": "Its like Tailwind CSS, but for the console.", + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", "keywords": [ - "cli", - "console", - "css", - "package", - "php", - "style" + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" ], "support": { - "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.3.3" + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" }, "funding": [ { - "url": "https://www.paypal.com/paypalme/enunomaduro", + "url": "https://www.colinodell.com/sponsor", "type": "custom" }, { - "url": "https://github.com/nunomaduro", - "type": "github" + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" }, { - "url": "https://github.com/xiCO2k", + "url": "https://github.com/colinodell", "type": "github" } ], - "time": "2025-11-20T02:34:59+00:00" + "time": "2022-12-11T20:36:23+00:00" }, { - "name": "psr/clock", - "version": "1.0.0", + "name": "league/flysystem", + "version": "3.30.2", "source": { "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277", + "reference": "5966a8ba23e62bdb518dd9e0e665c2dbd4b5b277", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0" + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3|^2", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2|^2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" }, "type": "library", "autoload": { "psr-4": { - "Psr\\Clock\\": "src/" + "League\\Flysystem\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1442,51 +1775,54 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" } ], - "description": "Common interface for reading the clock.", - "homepage": "https://github.com/php-fig/clock", + "description": "File storage abstraction for PHP", "keywords": [ - "clock", - "now", - "psr", - "psr-20", - "time" + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" ], "support": { - "issues": "https://github.com/php-fig/clock/issues", - "source": "https://github.com/php-fig/clock/tree/1.0.0" + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.30.2" }, - "time": "2022-11-25T14:36:26+00:00" + "time": "2025-11-10T17:13:11+00:00" }, { - "name": "psr/container", - "version": "2.0.2", + "name": "league/flysystem-local", + "version": "3.30.2", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "ab4f9d0d672f601b102936aa728801dd1a11968d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/ab4f9d0d672f601b102936aa728801dd1a11968d", + "reference": "ab4f9d0d672f601b102936aa728801dd1a11968d", "shasum": "" }, "require": { - "php": ">=7.4.0" + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "League\\Flysystem\\Local\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1495,1262 +1831,6847 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Local filesystem adapter for Flysystem.", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "Flysystem", + "file", + "files", + "filesystem", + "local" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.2" }, - "time": "2021-11-05T16:47:00+00:00" + "time": "2025-11-10T11:23:37+00:00" }, { - "name": "psr/simple-cache", - "version": "3.0.0", + "name": "league/mime-type-detection", + "version": "1.16.0", "source": { "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", "shasum": "" }, "require": { - "php": ">=8.0.0" + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" }, - "type": "library", + "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.16.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-09-21T08:32:55+00:00" + }, + { + "name": "league/uri", + "version": "7.7.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/8d587cddee53490f9b82bf203d3a9aa7ea4f9807", + "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.7", + "php": "^8.1", + "psr/http-factory": "^1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", + "league/uri-components": "Needed to easily manipulate URI objects components", + "league/uri-polyfill": "Needed to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle WHATWG URL", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "URN", + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc2141", + "rfc3986", + "rfc3987", + "rfc6570", + "rfc8141", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.7.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2025-12-07T16:02:06+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.7.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/62ccc1a0435e1c54e10ee6022df28d6c04c2946c", + "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle WHATWG URL", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.7.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2025-12-07T16:03:21+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.9.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "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": "3.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/3.9.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2025-03-24T10:02:05+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.11.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "bdb375400dcd162624531666db4799b36b64e4a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/bdb375400dcd162624531666db4799b36b64e4a1", + "reference": "bdb375400dcd162624531666db4799b36b64e4a1", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^v3.87.1", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "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/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/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": "2025-12-02T21:04:28+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.3", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/2befc2f42d7c715fd9d95efc31b1081e5d765004", + "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.5" + }, + "require-dev": { + "nette/tester": "^2.5.2", + "phpstan/phpstan-nette": "^2.0@stable", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "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 Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.3" + }, + "time": "2025-10-30T22:57:59+00:00" + }, + { + "name": "nette/utils", + "version": "v4.1.0", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "fa1f0b8261ed150447979eb22e373b7b7ad5a8e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/fa1f0b8261ed150447979eb22e373b7b7ad5a8e0", + "reference": "fa1f0b8261ed150447979eb22e373b7b7ad5a8e0", + "shasum": "" + }, + "require": { + "php": "8.2 - 8.5" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/tester": "^2.5", + "phpstan/phpstan-nette": "^2.0@stable", + "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.1-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "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.1.0" + }, + "time": "2025-12-01T17:49:23+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v2.3.3", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/6fb2a640ff502caace8e05fd7be3b503a7e1c017", + "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.3.6" + }, + "require-dev": { + "illuminate/console": "^11.46.1", + "laravel/pint": "^1.25.1", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.1.3", + "phpstan/phpstan": "^1.12.32", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.3.5", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.3.3" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2025-11-20T02:34:59+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.4", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "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.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2025-08-21T11:53:16+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-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "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": "PSR-17: 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" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "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.2" + }, + "time": "2024-09-11T13:17:53+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": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" + }, + "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.1.1" + }, + "time": "2025-03-22T05:38:12+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.9.2", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "8429c78ca35a09f27565311b98101e2826affde0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0", + "reference": "8429c78ca35a09f27565311b98101e2826affde0", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.25", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" + }, + "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.9.2" + }, + "time": "2025-12-14T04:43:48+00:00" + }, + { + "name": "symfony/clock", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/9169f24776edde469914c1e7a1442a50f7a4e110", + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "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/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-12T15:39:26+00:00" + }, + { + "name": "symfony/console", + "version": "v7.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e", + "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.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/v7.4.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-05T15:23:39+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "ab862f478513e7ca2fe9ec117a6f01a8da6e1135" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/ab862f478513e7ca2fe9ec117a6f01a8da6e1135", + "reference": "ab862f478513e7ca2fe9ec117a6f01a8da6e1135", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-10-30T13:39:42+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "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.6.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": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/48be2b0653594eea32dcef130cca1c811dcf25c2", + "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/polyfill-php85": "^1.32", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "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 manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-05T14:29:59+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "9dddcddff1ef974ad87b3708e4b442dc38b2261d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9dddcddff1ef974ad87b3708e4b442dc38b2261d", + "reference": "9dddcddff1ef974ad87b3708e4b442dc38b2261d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-10-28T09:38:46+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "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.6.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": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "340b9ed7320570f319028a2cbec46d40535e94bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd", + "reference": "340b9ed7320570f319028a2cbec46d40535e94bd", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0|^8.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/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-05T05:42:40+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "bd1af1e425811d6f077db240c3a588bdb405cd27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/bd1af1e425811d6f077db240c3a588bdb405cd27", + "reference": "bd1af1e425811d6f077db240c3a588bdb405cd27", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.1" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.4.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-07T11:13:10+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "f6e6f0a5fa8763f75a504b930163785fb6dd055f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f6e6f0a5fa8763f75a504b930163785fb6dd055f", + "reference": "f6e6f0a5fa8763f75a504b930163785fb6dd055f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^7.3|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/flex": "<2.10", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^7.1|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.1|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.4.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-08T07:43:37+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "a3d9eea8cfa467ece41f0f54ba28185d74bd53fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/a3d9eea8cfa467ece41f0f54ba28185d74bd53fd", + "reference": "a3d9eea8cfa467ece41f0f54ba28185d74bd53fd", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/mime": "^7.2|^8.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/twig-bridge": "^6.4|^7.0|^8.0" + }, + "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/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-21T15:26:00+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "bdb02729471be5d047a3ac4a69068748f1a6be7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/bdb02729471be5d047a3ac4a69068748f1a6be7a", + "reference": "bdb02729471be5d047a3ac4a69068748f1a6be7a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "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": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "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": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4.3|^7.0.3|^8.0" + }, + "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/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-16T10:14:42+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-27T09:58:17+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-10T14:38:51+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-08T02:45:35+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-23T16:12:55+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8", + "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-10-16T11:21:06+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "4720254cb2644a0b876233d258a32bf017330db7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/4720254cb2644a0b876233d258a32bf017330db7", + "reference": "4720254cb2644a0b876233d258a32bf017330db7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "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": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-27T13:27:24+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "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.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T11:30:57+00:00" + }, + { + "name": "symfony/string", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003", + "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-27T13:27:24+00:00" + }, + { + "name": "symfony/translation", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/2d01ca0da3f092f91eeedb46f24aa30d2fca8f68", + "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5.3|^3.3" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0|^8.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/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-27T13:27:24+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "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.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "symfony/uid", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "2498e9f81b7baa206f44de583f2f48350b90142c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/2498e9f81b7baa206f44de583f2f48350b90142c", + "reference": "2498e9f81b7baa206f44de583f2f48350b90142c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-25T11:02:55+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "41fd6c4ae28c38b294b42af6db61446594a0dece" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/41fd6c4ae28c38b294b42af6db61446594a0dece", + "reference": "41fd6c4ae28c38b294b42af6db61446594a0dece", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" + }, + "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/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-10-27T20:36:44+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "24dd4de28d2e3988b311751ac49e684d783e2345" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/24dd4de28d2e3988b311751ac49e684d783e2345", + "reference": "24dd4de28d2e3988b311751ac49e684d783e2345", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "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": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.4.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-04T18:11:45+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/f0292ccf0ec75843d65027214426b6b163b48b41", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.4.0" + }, + "time": "2025-12-02T11:56:42+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.2", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2025-04-30T23:37:27+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2024-11-21T01:49:47+00:00" + } + ], + "packages-dev": [ + { + "name": "composer/semver", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "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.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-08-20T19:15:30+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.24.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "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", + "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.24.1" + }, + "time": "2024-11-21T13:46:39+00:00" + }, + { + "name": "filp/whoops", + "version": "2.18.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.18.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2025-08-08T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.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.1.1" + }, + "time": "2025-04-30T06:54:44+00:00" + }, + { + "name": "laravel/pail", + "version": "v1.2.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "49f92285ff5d6fc09816e976a004f8dec6a0ea30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/49f92285ff5d6fc09816e976a004f8dec6a0ea30", + "reference": "49f92285ff5d6fc09816e976a004f8dec6a0ea30", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0|^12.0", + "illuminate/contracts": "^10.24|^11.0|^12.0", + "illuminate/log": "^10.24|^11.0|^12.0", + "illuminate/process": "^10.24|^11.0|^12.0", + "illuminate/support": "^10.24|^11.0|^12.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "laravel/framework": "^10.24|^11.0|^12.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.13|^9.17|^10.8", + "pestphp/pest": "^2.20|^3.0|^4.0", + "pestphp/pest-plugin-type-coverage": "^2.3|^3.0|^4.0", + "phpstan/phpstan": "^1.12.27", + "symfony/var-dumper": "^6.3|^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "dev", + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2025-11-20T16:29:35+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.10.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "3bcb5f62d6f837e0f093a601e26badafb127bd4c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/3bcb5f62d6f837e0f093a601e26badafb127bd4c", + "reference": "3bcb5f62d6f837e0f093a601e26badafb127bd4c", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.10.2" + }, + "time": "2025-11-20T16:29:12+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "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.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "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": "2024-05-16T03:13:13+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "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", + "phpspec/prophecy": "^1.10", + "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.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.7.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-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/v5.7.0" + }, + "time": "2025-12-06T11:56:16+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v8.8.3", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/1dc9e88d105699d0fee8bb18890f41b274f6b4c4", + "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.18.1", + "nunomaduro/termwind": "^2.3.1", + "php": "^8.2.0", + "symfony/console": "^7.3.0" + }, + "conflict": { + "laravel/framework": "<11.44.2 || >=13.0.0", + "phpunit/phpunit": "<11.5.15 || >=13.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.8.3", + "larastan/larastan": "^3.4.2", + "laravel/framework": "^11.44.2 || ^12.18", + "laravel/pint": "^1.22.1", + "laravel/sail": "^1.43.1", + "laravel/sanctum": "^4.1.1", + "laravel/tinker": "^2.10.1", + "orchestra/testbench-core": "^9.12.0 || ^10.4", + "pestphp/pest": "^3.8.2 || ^4.0.0", + "sebastian/environment": "^7.2.1 || ^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "dev", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2025-11-20T02:55:25+00:00" + }, + { + "name": "orchestra/canvas", + "version": "v9.2.2", + "source": { + "type": "git", + "url": "https://github.com/orchestral/canvas.git", + "reference": "002d948834c0899e511f5ac0381669363d7881e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/canvas/zipball/002d948834c0899e511f5ac0381669363d7881e5", + "reference": "002d948834c0899e511f5ac0381669363d7881e5", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "composer/semver": "^3.0", + "illuminate/console": "^11.43.0", + "illuminate/database": "^11.43.0", + "illuminate/filesystem": "^11.43.0", + "illuminate/support": "^11.43.0", + "orchestra/canvas-core": "^9.1.1", + "orchestra/sidekick": "^1.0.2", + "orchestra/testbench-core": "^9.11.0", + "php": "^8.2", + "symfony/polyfill-php83": "^1.31", + "symfony/yaml": "^7.0.3" + }, + "require-dev": { + "laravel/framework": "^11.43.0", + "laravel/pint": "^1.21", + "mockery/mockery": "^1.6.10", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^11.5.7", + "spatie/laravel-ray": "^1.39.1" + }, + "bin": [ + "canvas" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Orchestra\\Canvas\\LaravelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Orchestra\\Canvas\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Code Generators for Laravel Applications and Packages", + "support": { + "issues": "https://github.com/orchestral/canvas/issues", + "source": "https://github.com/orchestral/canvas/tree/v9.2.2" + }, + "time": "2025-02-19T04:27:08+00:00" + }, + { + "name": "orchestra/canvas-core", + "version": "v9.1.1", + "source": { + "type": "git", + "url": "https://github.com/orchestral/canvas-core.git", + "reference": "a8ebfa6c2e50f8c6597c489b4dfaf9af6789f62a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/canvas-core/zipball/a8ebfa6c2e50f8c6597c489b4dfaf9af6789f62a", + "reference": "a8ebfa6c2e50f8c6597c489b4dfaf9af6789f62a", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "composer/semver": "^3.0", + "illuminate/console": "^11.43.0", + "illuminate/support": "^11.43.0", + "orchestra/sidekick": "^1.0.2", + "php": "^8.2", + "symfony/polyfill-php83": "^1.31" + }, + "require-dev": { + "laravel/framework": "^11.43.0", + "laravel/pint": "^1.20", + "mockery/mockery": "^1.6.10", + "orchestra/testbench-core": "^9.11.0", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^11.5.7", + "symfony/yaml": "^7.0.3" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Orchestra\\Canvas\\Core\\LaravelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Orchestra\\Canvas\\Core\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Code Generators Builder for Laravel Applications and Packages", + "support": { + "issues": "https://github.com/orchestral/canvas/issues", + "source": "https://github.com/orchestral/canvas-core/tree/v9.1.1" + }, + "time": "2025-02-19T04:14:36+00:00" + }, + { + "name": "orchestra/sidekick", + "version": "v1.2.18", + "source": { + "type": "git", + "url": "https://github.com/orchestral/sidekick.git", + "reference": "0e080ef62eed6c45aaea3619566a1fce02b62094" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/sidekick/zipball/0e080ef62eed6c45aaea3619566a1fce02b62094", + "reference": "0e080ef62eed6c45aaea3619566a1fce02b62094", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "composer/semver": "^3.0", + "php": "^8.1", + "symfony/polyfill-php83": "^1.32" + }, + "require-dev": { + "fakerphp/faker": "^1.21", + "laravel/framework": "^10.48.29|^11.44.7|^12.1.1|^13.0", + "laravel/pint": "^1.4", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": "^8.37.0|^9.14.0|^10.2.0|^11.0", + "phpstan/phpstan": "^2.1.14", + "phpunit/phpunit": "^10.0|^11.0|^12.0", + "symfony/process": "^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Eloquent/functions.php", + "src/Http/functions.php", + "src/functions.php" + ], + "psr-4": { + "Orchestra\\Sidekick\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Packages Toolkit Utilities and Helpers for Laravel", + "support": { + "issues": "https://github.com/orchestral/sidekick/issues", + "source": "https://github.com/orchestral/sidekick/tree/v1.2.18" + }, + "time": "2025-11-29T15:16:23+00:00" + }, + { + "name": "orchestra/testbench", + "version": "v9.15.0", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench.git", + "reference": "d0181240f93688448d4ae3b5479ec5ed70a87a47" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench/zipball/d0181240f93688448d4ae3b5479ec5ed70a87a47", + "reference": "d0181240f93688448d4ae3b5479ec5ed70a87a47", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "fakerphp/faker": "^1.23", + "laravel/framework": "^11.45.2", + "mockery/mockery": "^1.6.10", + "orchestra/testbench-core": "^9.16.0", + "orchestra/workbench": "^9.13.5", + "php": "^8.2", + "phpunit/phpunit": "^10.5.35|^11.3.6|^12.0.1", + "symfony/process": "^7.0.3", + "symfony/yaml": "^7.0.3", + "vlucas/phpdotenv": "^5.6.1" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Laravel Testing Helper for Packages Development", + "homepage": "https://packages.tools/testbench/", + "keywords": [ + "BDD", + "TDD", + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench/tree/v9.15.0" + }, + "time": "2025-08-20T11:42:03+00:00" + }, + { + "name": "orchestra/testbench-core", + "version": "v9.17.0", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench-core.git", + "reference": "a5b4d56a40536fde50a72e20ce43abaa76f8de2f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/a5b4d56a40536fde50a72e20ce43abaa76f8de2f", + "reference": "a5b4d56a40536fde50a72e20ce43abaa76f8de2f", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "orchestra/sidekick": "~1.1.20|~1.2.17", + "php": "^8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-php83": "^1.32" + }, + "conflict": { + "brianium/paratest": "<7.3.0|>=8.0.0", + "laravel/framework": "<11.45.3|>=12.0.0", + "laravel/serializable-closure": "<1.3.0|>=2.0.0 <2.0.3|>=3.0.0", + "nunomaduro/collision": "<8.0.0|>=9.0.0", + "orchestra/testbench-dusk": "<9.10.0|>=10.0.0", + "phpunit/phpunit": "<10.5.35|>=11.0.0 <11.3.6|>=12.0.0 <12.0.1|>=12.4.0" + }, + "require-dev": { + "fakerphp/faker": "^1.24", + "laravel/framework": "^11.45.3", + "laravel/pint": "^1.24", + "laravel/serializable-closure": "^1.3|^2.0.4", + "mockery/mockery": "^1.6.10", + "phpstan/phpstan": "^2.1.19", + "phpunit/phpunit": "^10.5.35|^11.3.6|^12.0.1", + "spatie/laravel-ray": "^1.40.2", + "symfony/process": "^7.0.3", + "symfony/yaml": "^7.0.3", + "vlucas/phpdotenv": "^5.6.1" + }, + "suggest": { + "brianium/paratest": "Allow using parallel testing (^7.3).", + "ext-pcntl": "Required to use all features of the console signal trapping.", + "fakerphp/faker": "Allow using Faker for testing (^1.23).", + "laravel/framework": "Required for testing (^11.45.3).", + "mockery/mockery": "Allow using Mockery for testing (^1.6).", + "nunomaduro/collision": "Allow using Laravel style tests output and parallel testing (^8.0).", + "orchestra/testbench-dusk": "Allow using Laravel Dusk for testing (^9.10).", + "phpunit/phpunit": "Allow using PHPUnit for testing (^10.5.35|^11.3.6|^12.0.1).", + "symfony/process": "Required to use Orchestra\\Testbench\\remote function (^7.0).", + "symfony/yaml": "Required for Testbench CLI (^7.0).", + "vlucas/phpdotenv": "Required for Testbench CLI (^5.6.1)." + }, + "bin": [ + "testbench" + ], + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Orchestra\\Testbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Testing Helper for Laravel Development", + "homepage": "https://packages.tools/testbench", + "keywords": [ + "BDD", + "TDD", + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench-core" + }, + "time": "2025-10-14T12:02:37+00:00" + }, + { + "name": "orchestra/workbench", + "version": "v9.13.5", + "source": { + "type": "git", + "url": "https://github.com/orchestral/workbench.git", + "reference": "1da2ea95089ed3516bda6f8e9cd57c81290004bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/workbench/zipball/1da2ea95089ed3516bda6f8e9cd57c81290004bf", + "reference": "1da2ea95089ed3516bda6f8e9cd57c81290004bf", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "fakerphp/faker": "^1.23", + "laravel/framework": "^11.44.2", + "laravel/pail": "^1.2", + "laravel/tinker": "^2.9", + "nunomaduro/collision": "^8.0", + "orchestra/canvas": "^9.2.2", + "orchestra/sidekick": "^1.1.0", + "orchestra/testbench-core": "^9.12.0", + "php": "^8.2", + "symfony/polyfill-php83": "^1.31", + "symfony/polyfill-php84": "^1.31", + "symfony/process": "^7.0.3", + "symfony/yaml": "^7.0.3" + }, + "require-dev": { + "laravel/pint": "^1.21", + "mockery/mockery": "^1.6.10", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.5.35|^11.3.6|^12.0.1", + "spatie/laravel-ray": "^1.39.1" + }, + "suggest": { + "ext-pcntl": "Required to use all features of the console signal trapping." + }, + "type": "library", + "autoload": { + "psr-4": { + "Orchestra\\Workbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Workbench Companion for Laravel Packages Development", + "keywords": [ + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/workbench/issues", + "source": "https://github.com/orchestral/workbench/tree/v9.13.5" + }, + "time": "2025-04-06T11:06:19+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "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.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+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": "phpunit/php-code-coverage", + "version": "12.5.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "c467c59a4f6e04b942be422844e7a6352fa01b57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c467c59a4f6e04b942be422844e7a6352fa01b57", + "reference": "c467c59a4f6e04b942be422844e7a6352fa01b57", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.7.0", + "php": ">=8.3", + "phpunit/php-file-iterator": "^6.0", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.0.3", + "sebastian/lines-of-code": "^4.0", + "sebastian/version": "^6.0", + "theseer/tokenizer": "^2.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.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": "12.5.x-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/12.5.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2025-12-08T07:17:58+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "961bc913d42fe24a257bfff826a5068079ac7782" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", + "reference": "961bc913d42fe24a257bfff826a5068079ac7782", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.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": "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/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:37+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^12.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-main": "6.0-dev" } }, "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" + "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", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:58+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" } }, + "autoload": { + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Common interfaces for simple caching", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" + "template" ], "support": { - "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + "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/5.0.0" }, - "time": "2021-10-29T13:26:27+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:16+00:00" }, { - "name": "symfony/clock", - "version": "v7.4.0", + "name": "phpunit/php-timer", + "version": "8.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/clock.git", - "reference": "9169f24776edde469914c1e7a1442a50f7a4e110" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/9169f24776edde469914c1e7a1442a50f7a4e110", - "reference": "9169f24776edde469914c1e7a1442a50f7a4e110", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", "shasum": "" }, "require": { - "php": ">=8.2", - "psr/clock": "^1.0", - "symfony/polyfill-php83": "^1.28" + "php": ">=8.3" }, - "provide": { - "psr/clock-implementation": "1.0" + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.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", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:38+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "12.3.15", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "b035ee2cd8ecad4091885b61017ebb1d80eb0e57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b035ee2cd8ecad4091885b61017ebb1d80eb0e57", + "reference": "b035ee2cd8ecad4091885b61017ebb1d80eb0e57", + "shasum": "" }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.4.0", + "phpunit/php-file-iterator": "^6.0.0", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.0", + "sebastian/comparator": "^7.1.3", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.0.3", + "sebastian/exporter": "^7.0.2", + "sebastian/global-state": "^8.0.2", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/type": "^6.0.3", + "sebastian/version": "^6.0.0", + "staabm/side-effects-detector": "^1.0.5" + }, + "bin": [ + "phpunit" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-main": "12.3-dev" + } + }, "autoload": { "files": [ - "Resources/now.php" + "src/Framework/Assert/Functions.php" ], - "psr-4": { - "Symfony\\Component\\Clock\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Decouples applications from the system clock", - "homepage": "https://symfony.com", + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", "keywords": [ - "clock", - "psr20", - "time" + "phpunit", + "testing", + "xunit" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.4.0" + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.3.15" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://phpunit.de/sponsors.html", "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" }, { - "url": "https://github.com/nicolas-grekas", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", "type": "tidelift" } ], - "time": "2025-11-12T15:39:26+00:00" + "time": "2025-09-28T12:10:54+00:00" }, { - "name": "symfony/console", - "version": "v7.4.1", + "name": "psy/psysh", + "version": "v0.12.18", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e" + "url": "https://github.com/bobthecow/psysh.git", + "reference": "ddff0ac01beddc251786fe70367cd8bbdb258196" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e", - "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/ddff0ac01beddc251786fe70367cd8bbdb258196", + "reference": "ddff0ac01beddc251786fe70367cd8bbdb258196", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^7.2|^8.0" + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" }, "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/dotenv": "<6.4", - "symfony/event-dispatcher": "<6.4", - "symfony/lock": "<6.4", - "symfony/process": "<6.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/event-dispatcher": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/lock": "^6.4|^7.0|^8.0", - "symfony/messenger": "^6.4|^7.0|^8.0", - "symfony/process": "^6.4|^7.0|^8.0", - "symfony/stopwatch": "^6.4|^7.0|^8.0", - "symfony/var-dumper": "^6.4|^7.0|^8.0" + "bamarni/composer-bin-plugin": "^1.2", + "composer/class-map-generator": "^1.6" + }, + "suggest": { + "composer/class-map-generator": "Improved tab completion performance with better class discovery.", + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." }, + "bin": [ + "bin/psysh" + ], "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "https://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.18" + }, + "time": "2025-12-17T14:35:46+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { - "source": "https://github.com/symfony/console/tree/v7.4.1" + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://github.com/nicolas-grekas", - "type": "github" + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", "type": "tidelift" } ], - "time": "2025-12-05T15:23:39+00:00" + "time": "2025-09-14T09:36:45+00:00" }, { - "name": "symfony/deprecation-contracts", - "version": "v3.6.0", + "name": "sebastian/comparator", + "version": "7.1.3", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dc904b4bb3ab070865fa4068cd84f3da8b945148", + "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148", "shasum": "" }, "require": { - "php": ">=8.1" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.2" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "7.1-dev" } }, "autoload": { - "files": [ - "function.php" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" } ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-08-20T11:27:00+00:00" }, { - "name": "symfony/finder", - "version": "v7.4.0", + "name": "sebastian/complexity", + "version": "5.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "340b9ed7320570f319028a2cbec46d40535e94bd" + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd", - "reference": "340b9ed7320570f319028a2cbec46d40535e94bd", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", "shasum": "" }, "require": { - "php": ">=8.2" + "nikic/php-parser": "^5.0", + "php": ">=8.3" }, "require-dev": { - "symfony/filesystem": "^6.4|^7.0|^8.0" + "phpunit/phpunit": "^12.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.0" + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2025-11-05T05:42:40+00:00" + "time": "2025-02-07T04:55:25+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.33.0", + "name": "sebastian/diff", + "version": "7.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", "shasum": "" }, "require": { - "php": ">=7.2" - }, - "provide": { - "ext-ctype": "*" + "php": ">=8.3" }, - "suggest": { - "ext-ctype": "For best performance" + "require-dev": { + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "branch-alias": { + "dev-main": "7.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" + "diff", + "udiff", + "unidiff", + "unified diff" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-02-07T04:55:46+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", + "name": "sebastian/environment", + "version": "8.0.3", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" }, "suggest": { - "ext-intl": "For best performance" + "ext-posix": "*" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "branch-alias": { + "dev-main": "8.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" + "Xdebug", + "environment", + "hhvm" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://github.com/nicolas-grekas", - "type": "github" + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2025-08-12T14:11:56+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "name": "sebastian/exporter", + "version": "7.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "016951ae10980765e4e7aee491eb288c64e505b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/016951ae10980765e4e7aee491eb288c64e505b7", + "reference": "016951ae10980765e4e7aee491eb288c64e505b7", "shasum": "" }, "require": { - "php": ">=7.2" + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/recursion-context": "^7.0" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "branch-alias": { + "dev-main": "7.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "classmap": [ - "Resources/stubs" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "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": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" + "export", + "exporter" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.2" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, + "funding": [ { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" }, { - "url": "https://github.com/nicolas-grekas", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-09-24T06:16:11+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "name": "sebastian/global-state", + "version": "8.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d", "shasum": "" }, "require": { - "ext-iconv": "*", - "php": ">=7.2" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "branch-alias": { + "dev-main": "8.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" + "global state" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "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/8.0.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://github.com/nicolas-grekas", - "type": "github" + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2025-08-29T11:29:25+00:00" }, { - "name": "symfony/polyfill-php83", - "version": "v1.33.0", + "name": "sebastian/lines-of-code", + "version": "4.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", "shasum": "" }, "require": { - "php": ">=7.2" + "nikic/php-parser": "^5.0", + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "branch-alias": { + "dev-main": "4.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" - }, "classmap": [ - "Resources/stubs" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + "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/4.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2025-07-08T02:45:35+00:00" + "time": "2025-02-07T04:57:28+00:00" }, { - "name": "symfony/process", - "version": "v7.4.0", + "name": "sebastian/object-enumerator", + "version": "7.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8" + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8", - "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { - "source": "https://github.com/symfony/process/tree/v7.4.0" + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2025-10-16T11:21:06+00:00" + "time": "2025-02-07T04:57:48+00:00" }, { - "name": "symfony/service-contracts", - "version": "v3.6.1", + "name": "sebastian/object-reflector", + "version": "5.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" + "php": ">=8.3" }, - "conflict": { - "ext-psr": "<1.1|>=2" + "require-dev": { + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "5.0-dev" } }, "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2025-07-15T11:30:57+00:00" + "time": "2025-02-07T04:58:17+00:00" }, { - "name": "symfony/string", - "version": "v7.4.0", + "name": "sebastian/recursion-context", + "version": "7.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003" + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003", - "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.33", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/translation-contracts": "<2.5" + "php": ">=8.3" }, "require-dev": { - "symfony/emoji": "^7.1|^8.0", - "symfony/http-client": "^6.4|^7.0|^8.0", - "symfony/intl": "^6.4|^7.0|^8.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0|^8.0" + "phpunit/phpunit": "^12.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "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" + "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": { - "source": "https://github.com/symfony/string/tree/v7.4.0" + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://github.com/nicolas-grekas", - "type": "github" + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2025-08-13T04:44:59+00:00" }, { - "name": "symfony/translation", - "version": "v7.4.0", + "name": "sebastian/type", + "version": "6.0.3", "source": { "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68" + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/2d01ca0da3f092f91eeedb46f24aa30d2fca8f68", - "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5.3|^3.3" - }, - "conflict": { - "nikic/php-parser": "<5.0", - "symfony/config": "<6.4", - "symfony/console": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", - "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<6.4", - "symfony/yaml": "<6.4" - }, - "provide": { - "symfony/translation-implementation": "2.3|3.0" + "php": ">=8.3" }, "require-dev": { - "nikic/php-parser": "^5.0", - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/finder": "^6.4|^7.0|^8.0", - "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/intl": "^6.4|^7.0|^8.0", - "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^6.4|^7.0|^8.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0|^8.0" + "phpunit/phpunit": "^12.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides tools to internationalize your application", - "homepage": "https://symfony.com", + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", "support": { - "source": "https://github.com/symfony/translation/tree/v7.4.0" + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://github.com/nicolas-grekas", - "type": "github" + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2025-08-09T06:57:12+00:00" }, { - "name": "symfony/translation-contracts", - "version": "v3.6.1", + "name": "sebastian/version", + "version": "6.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "65a8bc82080447fae78373aa10f8d13b38338977" + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", - "reference": "65a8bc82080447fae78373aa10f8d13b38338977", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "6.0-dev" } }, "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Test/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2025-07-15T13:41:35+00:00" + "time": "2025-02-07T05:00:38+00:00" }, { - "name": "symfony/yaml", - "version": "v7.4.1", + "name": "staabm/side-effects-detector", + "version": "1.0.5", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "24dd4de28d2e3988b311751ac49e684d783e2345" + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/24dd4de28d2e3988b311751ac49e684d783e2345", - "reference": "24dd4de28d2e3988b311751ac49e684d783e2345", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<6.4" + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" }, - "bin": [ - "Resources/bin/yaml-lint" + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Yaml\\": "" + "Symfony\\Polyfill\\Php84\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2759,18 +8680,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Loads and dumps YAML files", + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/yaml/tree/v7.4.1" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" }, "funding": [ { @@ -2790,84 +8717,59 @@ "type": "tidelift" } ], - "time": "2025-12-04T18:11:45+00:00" + "time": "2025-06-24T13:30:11+00:00" }, { - "name": "voku/portable-ascii", - "version": "2.0.3", + "name": "theseer/tokenizer", + "version": "2.0.1", "source": { "type": "git", - "url": "https://github.com/voku/portable-ascii.git", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + "url": "https://github.com/theseer/tokenizer.git", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", "shasum": "" }, "require": { - "php": ">=7.0.0" - }, - "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" - }, - "suggest": { - "ext-intl": "Use Intl for transliterator_transliterate() support" + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^8.1" }, "type": "library", "autoload": { - "psr-4": { - "voku\\": "src/voku/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Lars Moelleken", - "homepage": "https://www.moelleken.org/" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" } ], - "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", - "homepage": "https://github.com/voku/portable-ascii", - "keywords": [ - "ascii", - "clean", - "php" - ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { - "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/2.0.1" }, "funding": [ { - "url": "https://www.paypal.me/moelleken", - "type": "custom" - }, - { - "url": "https://github.com/voku", + "url": "https://github.com/theseer", "type": "github" - }, - { - "url": "https://opencollective.com/portable-ascii", - "type": "open_collective" - }, - { - "url": "https://www.patreon.com/voku", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", - "type": "tidelift" } ], - "time": "2024-11-21T01:49:47+00:00" + "time": "2025-12-08T11:19:18+00:00" } ], - "packages-dev": [], "aliases": [], "minimum-stability": "dev", "stability-flags": [], From 3879a618a21f7c1f9963ef81f39dae346899f034 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Fri, 19 Dec 2025 11:36:26 -0300 Subject: [PATCH 20/71] feat: Adiciona stubs de collection e controller --- src/Blueprint/Stubs/collection.stub | 18 ++++++++++++++++++ src/Blueprint/Stubs/controller.test.stub | 18 ++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 src/Blueprint/Stubs/collection.stub diff --git a/src/Blueprint/Stubs/collection.stub b/src/Blueprint/Stubs/collection.stub new file mode 100644 index 0000000..5b14557 --- /dev/null +++ b/src/Blueprint/Stubs/collection.stub @@ -0,0 +1,18 @@ +collection + ->transform(fn($data) => new {{ model }}Resource($data)) + ->toArray(); + } +} diff --git a/src/Blueprint/Stubs/controller.test.stub b/src/Blueprint/Stubs/controller.test.stub index fbe8929..3957dde 100644 --- a/src/Blueprint/Stubs/controller.test.stub +++ b/src/Blueprint/Stubs/controller.test.stub @@ -3,7 +3,6 @@ namespace Tests\Feature\Http\Controllers; use App\Models\{{ model }}; -use App\Models\User; use Illuminate\Foundation\Testing\WithFaker; use Tests\TestCase; @@ -29,6 +28,9 @@ class {{ model }}ControllerTest extends TestCase $data = {{ model }}::factory()->make()->toArray(); $this->postJson(route('{{ route }}.store'), $data) + ->assertJsonFragment([ + 'message' => 'Criado com sucesso' + ]) ->assertStatus(201); } @@ -45,7 +47,10 @@ class {{ model }}ControllerTest extends TestCase $model = {{ model }}::factory()->create(); $updatedData = {{ model }}::factory()->make()->toArray(); - $response = $this->putJson(route('{{ route }}.update', $model), $updatedData) + $this->putJson(route('{{ route }}.update', $model), $updatedData) + ->assertJsonFragment([ + 'message' => 'Atualizado com sucesso' + ]) ->assertStatus(200); } @@ -53,9 +58,14 @@ class {{ model }}ControllerTest extends TestCase { $model = {{ model }}::factory()->create(); - $response = $this->deleteJson(route('{{ route }}.destroy', $model)) + $this->deleteJson(route('{{ route }}.destroy', $model)) + ->assertJsonFragment([ + 'message' => 'Removido com sucesso' + ]) ->assertStatus(200); - $this->assertDatabaseMissing('{{ table }}', ['id' => $model->id]); + $this->assertSoftDeleted('{{ table }}', [ + 'id' => $model->id + ]); } } From 574599a6ae0ab7f77443a2525ff61ed391a1a7f1 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Fri, 19 Dec 2025 11:38:05 -0300 Subject: [PATCH 21/71] =?UTF-8?q?refactor:=20Corrige=20identa=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PostProcessors/RequestPostProcessor.php | 2 +- src/Blueprint/PostProcessors/TestPostProcessor.php | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Blueprint/PostProcessors/RequestPostProcessor.php b/src/Blueprint/PostProcessors/RequestPostProcessor.php index c031fa0..62a3bba 100644 --- a/src/Blueprint/PostProcessors/RequestPostProcessor.php +++ b/src/Blueprint/PostProcessors/RequestPostProcessor.php @@ -34,4 +34,4 @@ public function handle(string $model): void File::put($path, $content); } } -} \ No newline at end of file +} diff --git a/src/Blueprint/PostProcessors/TestPostProcessor.php b/src/Blueprint/PostProcessors/TestPostProcessor.php index e767d71..00c30a2 100644 --- a/src/Blueprint/PostProcessors/TestPostProcessor.php +++ b/src/Blueprint/PostProcessors/TestPostProcessor.php @@ -20,11 +20,11 @@ public function handle(string $model): void $stub = File::get($stubPath); $replaces = [ - '{{ model }}' => $model, - '{{ pluralModel }}' => Str::plural($model), - '{{ route }}' => Str::kebab(Str::plural($model)), - '{{ table }}' => Str::snake(Str::plural($model)), - '{{ variable }}' => Str::camel($model), + '{{ model }}' => $model, + '{{ pluralModel }}' => Str::plural($model), + '{{ route }}' => Str::kebab(Str::plural($model)), + '{{ table }}' => Str::snake(Str::plural($model)), + '{{ variable }}' => Str::camel($model), ]; $content = str_replace( @@ -35,4 +35,4 @@ public function handle(string $model): void File::put($path, $content); } -} \ No newline at end of file +} From c0d9db8cab1fa94a386c2edf93bb3a091881221f Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Fri, 19 Dec 2025 11:38:27 -0300 Subject: [PATCH 22/71] feat: Adiciona novos pos processadores no service provider --- .../CuidsGeneratorServiceProvider.php | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Providers/CuidsGeneratorServiceProvider.php b/src/Providers/CuidsGeneratorServiceProvider.php index 67f1a61..9b6f8bb 100644 --- a/src/Providers/CuidsGeneratorServiceProvider.php +++ b/src/Providers/CuidsGeneratorServiceProvider.php @@ -2,20 +2,23 @@ namespace Sysvale\CuidsGenerator\Providers; -use Illuminate\Support\Facades\Request; use Illuminate\Support\ServiceProvider; use Sysvale\CuidsGenerator\Console\Commands\CuidsGenerateCommand; use Sysvale\CuidsGenerator\Blueprint\PostProcessorRunner; +use Sysvale\CuidsGenerator\Blueprint\PostProcessors\CollectionPostProcessor; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\FactoryPostProcessor; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\Mongo\MongoModelTransformer; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\RequestPostProcessor; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\TestPostProcessor; +use Illuminate\Support\Facades\File; +use Sysvale\CuidsGenerator\Blueprint\PostProcessors\ControllerPostProcessor; class CuidsGeneratorServiceProvider extends ServiceProvider { public function register(): void { $this->registerPostProcessors(); + $this->configureBlueprintStubs(); if ($this->app->runningInConsole()) { $this->commands([ @@ -32,10 +35,32 @@ private function registerPostProcessors(): void $app->make(FactoryPostProcessor::class), $app->make(RequestPostProcessor::class), $app->make(TestPostProcessor::class), + $app->make(CollectionPostProcessor::class), + $app->make(ControllerPostProcessor::class), ]); }); } + private function configureBlueprintStubs(): void + { + if ($this->app->runningInConsole()) { + $targetPath = base_path('stubs/blueprint'); + $sourcePath = realpath(__DIR__ . '/../../stubs/blueprint'); + + if ($sourcePath && !file_exists($targetPath)) { + if (!is_dir(base_path('stubs'))) { + mkdir(base_path('stubs'), 0755, true); + } + + if (function_exists('symlink')) { + symlink($sourcePath, $targetPath); + } else { + File::copyDirectory($sourcePath, $targetPath); + } + } + } + } + public function boot(): void {} } From 779290288f76f3d20d9f371cbaab8990434de27c Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Fri, 19 Dec 2025 11:38:59 -0300 Subject: [PATCH 23/71] =?UTF-8?q?refactor:=20Realiza=20ajustes=20na=20limp?= =?UTF-8?q?eza=20dos=20casts=20do=20eloquent=20e=20da=20importa=C3=A7?= =?UTF-8?q?=C3=A3o=20do=20softDelete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Mongo/MongoModelTransformer.php | 18 ++++++++++++++---- src/Console/Commands/CuidsGenerateCommand.php | 2 -- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php b/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php index 4e76b24..65d7fb9 100644 --- a/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php +++ b/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php @@ -53,7 +53,7 @@ protected function applySoftDeletes(string $content): string if (!str_contains($content, 'MongoDB\\Laravel\\Eloquent\\SoftDeletes')) { $content = str_replace( "use MongoDB\Laravel\Eloquent\Model;", - "use MongoDB\Laravel\Eloquent\Model;\nuse MongoDB\Laravel\Eloquent\SoftDeletes;", + "use MongoDB\Laravel\Eloquent\Model;\nuse Illuminate\Database\Eloquent\SoftDeletes;", $content ); } @@ -61,7 +61,7 @@ protected function applySoftDeletes(string $content): string if (!str_contains($content, 'use SoftDeletes;')) { $content = preg_replace( '/(use HasFactory;)/', - "$1\n use SoftDeletes;", + "\n use SoftDeletes;\n $1", $content ); } @@ -71,11 +71,21 @@ protected function applySoftDeletes(string $content): string protected function cleanupCasts(string $content): string { - return preg_replace( - '/protected function casts\(\): array\s*\{[\s\S]*?\n\s*\}/', + $content = preg_replace( + '/protected function casts\(\): array\s*\{[\s\S]*?\}/', '', $content ); + + $content = preg_replace( + '/\/\*\*\s+\*\s+Get the attributes that should be cast\.[\s\S]*?\*\//', + '', + $content + ); + + $content = preg_replace('/\n\s*\n\s*\n/', "\n\n", $content); + + return $content; } protected function setupVisibility(string $content): string diff --git a/src/Console/Commands/CuidsGenerateCommand.php b/src/Console/Commands/CuidsGenerateCommand.php index 84fe810..9615abb 100644 --- a/src/Console/Commands/CuidsGenerateCommand.php +++ b/src/Console/Commands/CuidsGenerateCommand.php @@ -16,9 +16,7 @@ class CuidsGenerateCommand extends Command { protected $signature = 'cuids:generate'; - protected $description = 'Gera um novo módulo CUIDS'; - protected $blueprintWriter; protected $draftBuilder; protected $fieldEditor; From 905b5ba4339796894827a8d647f52c254b85238d Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Fri, 19 Dec 2025 14:50:47 -0300 Subject: [PATCH 24/71] refactor: minor fixes --- src/Console/Editors/FieldEditor.php | 14 +++++++++++--- src/Providers/CuidsGeneratorServiceProvider.php | 2 +- src/Support/FieldType.php | 4 ++-- src/Support/RelationshipType.php | 4 ++-- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/Console/Editors/FieldEditor.php b/src/Console/Editors/FieldEditor.php index 27f4edd..7f4387c 100644 --- a/src/Console/Editors/FieldEditor.php +++ b/src/Console/Editors/FieldEditor.php @@ -13,15 +13,15 @@ class FieldEditor { - public function run(Command $cli): array + public function run(): array { $fields = []; - info('Configuração dos campos'); + info('Defina os atributos do model'); while (true) { $action = select( - label: 'O que deseja fazer com os campos?', + label: 'Gerencie os atributos do model', options: [ 'add' => 'Adicionar', 'rename' => 'Atualizar nome', @@ -67,6 +67,8 @@ private function add(array &$fields): void ); $fields[$name] = $type; + + $this->list($fields); } private function rename(array &$fields): void @@ -85,6 +87,8 @@ private function rename(array &$fields): void $fields[$new] = $fields[$old]; unset($fields[$old]); + + $this->list($fields); } private function changeType(array &$fields): void @@ -96,6 +100,8 @@ private function changeType(array &$fields): void label: "Novo tipo para '{$name}'", options: FieldType::values() ); + + $this->list($fields); } private function remove(array &$fields): void @@ -107,6 +113,8 @@ private function remove(array &$fields): void if (confirm("Tem certeza que deseja remover '{$name}'?")) { unset($fields[$name]); } + + $this->list($fields); } private function list(array $fields): void diff --git a/src/Providers/CuidsGeneratorServiceProvider.php b/src/Providers/CuidsGeneratorServiceProvider.php index 9b6f8bb..b0c4d81 100644 --- a/src/Providers/CuidsGeneratorServiceProvider.php +++ b/src/Providers/CuidsGeneratorServiceProvider.php @@ -5,13 +5,13 @@ use Illuminate\Support\ServiceProvider; use Sysvale\CuidsGenerator\Console\Commands\CuidsGenerateCommand; use Sysvale\CuidsGenerator\Blueprint\PostProcessorRunner; +use Sysvale\CuidsGenerator\Blueprint\PostProcessors\ControllerPostProcessor; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\CollectionPostProcessor; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\FactoryPostProcessor; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\Mongo\MongoModelTransformer; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\RequestPostProcessor; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\TestPostProcessor; use Illuminate\Support\Facades\File; -use Sysvale\CuidsGenerator\Blueprint\PostProcessors\ControllerPostProcessor; class CuidsGeneratorServiceProvider extends ServiceProvider { diff --git a/src/Support/FieldType.php b/src/Support/FieldType.php index 1c77215..01575bb 100644 --- a/src/Support/FieldType.php +++ b/src/Support/FieldType.php @@ -5,10 +5,10 @@ enum FieldType: string { case ARRAY = 'array'; - case DATE = 'date'; case BOOLEAN = 'boolean'; - case INTEGER = 'integer'; + case DATE = 'date'; case FLOAT = 'float'; + case INTEGER = 'integer'; case STRING = 'string'; case TIMESTAMP = 'timestamp'; diff --git a/src/Support/RelationshipType.php b/src/Support/RelationshipType.php index a86fc56..2bd5d62 100644 --- a/src/Support/RelationshipType.php +++ b/src/Support/RelationshipType.php @@ -4,10 +4,10 @@ enum RelationshipType: string { - case HAS_ONE = 'hasOne'; - case HAS_MANY = 'hasMany'; case BELONGS_TO = 'belongsTo'; case BELONGS_TO_MANY = 'belongsToMany'; + case HAS_ONE = 'hasOne'; + case HAS_MANY = 'hasMany'; public static function values(): array { From 6a25e4ee2461222d356f02e61a0d912ae05f9626 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Fri, 19 Dec 2025 14:51:17 -0300 Subject: [PATCH 25/71] feat: Adiciona novos pos processadores --- .../CollectionPostProcessor.php | 31 +++++++++++++++++++ .../ControllerPostProcessor.php | 25 +++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/Blueprint/PostProcessors/CollectionPostProcessor.php create mode 100644 src/Blueprint/PostProcessors/ControllerPostProcessor.php diff --git a/src/Blueprint/PostProcessors/CollectionPostProcessor.php b/src/Blueprint/PostProcessors/CollectionPostProcessor.php new file mode 100644 index 0000000..dcbfec1 --- /dev/null +++ b/src/Blueprint/PostProcessors/CollectionPostProcessor.php @@ -0,0 +1,31 @@ + $model, + ]; + + $content = str_replace( + array_keys($replaces), + array_values($replaces), + $stub + ); + + File::put($path, $content); + } +} \ No newline at end of file diff --git a/src/Blueprint/PostProcessors/ControllerPostProcessor.php b/src/Blueprint/PostProcessors/ControllerPostProcessor.php new file mode 100644 index 0000000..129a067 --- /dev/null +++ b/src/Blueprint/PostProcessors/ControllerPostProcessor.php @@ -0,0 +1,25 @@ + Date: Fri, 19 Dec 2025 14:51:32 -0300 Subject: [PATCH 26/71] refactor: Ajuste no stub de collection --- src/Blueprint/Stubs/collection.stub | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Blueprint/Stubs/collection.stub b/src/Blueprint/Stubs/collection.stub index 5b14557..fe9292e 100644 --- a/src/Blueprint/Stubs/collection.stub +++ b/src/Blueprint/Stubs/collection.stub @@ -8,7 +8,7 @@ class {{ model }}Collection extends ResourceCollection { public static $wrap = null; - public function toArray($request): array + public function toArray(): array { return $this ->collection From f2a9accfc70051c193f1fefc43ddd12a0f577473 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Fri, 19 Dec 2025 14:51:47 -0300 Subject: [PATCH 27/71] feat: Adiciona logica para buscar os models do projeto --- src/Console/Commands/CuidsGenerateCommand.php | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/Console/Commands/CuidsGenerateCommand.php b/src/Console/Commands/CuidsGenerateCommand.php index 9615abb..83f6d41 100644 --- a/src/Console/Commands/CuidsGenerateCommand.php +++ b/src/Console/Commands/CuidsGenerateCommand.php @@ -4,6 +4,7 @@ use Illuminate\Console\Command; use Illuminate\Support\Str; +use Illuminate\Support\Facades\File; use Sysvale\CuidsGenerator\Blueprint\BlueprintWriter; use Sysvale\CuidsGenerator\Blueprint\Builders\DraftBuilder; use Sysvale\CuidsGenerator\Console\Editors\FieldEditor; @@ -41,13 +42,16 @@ public function __construct( public function handle() { - $entity = text('Qual o nome do model (em inglês e no singular)?'); + $entity = text('Qual o nome do model (em inglês)?'); + + $fields = $this->fieldEditor->run(); - $fields = $this->fieldEditor->run($this); $relationships = []; $entityStudly = Str::studly(Str::singular($entity)); + $externalModels = $this->getProjectModels(); + $this->newLine(); if (confirm( @@ -56,7 +60,7 @@ public function handle() yes: 'Sim, configurar agora', no: 'Não, pular esta estapa' )) { - $relationships = $this->relationshipEditor->run($this); + $relationships = $this->relationshipEditor->run($externalModels); } else { note('Nenhum relacionamento configurado.'); } @@ -73,6 +77,19 @@ public function handle() $this->error("Erro ao aplicar pós-processadores]: {$e->getMessage()}"); } } + + public function getProjectModels(): array + { + $modelsPath = app_path('Models'); + + if (!File::isDirectory($modelsPath)) return []; + + $files = File::allFiles($modelsPath); + + return collect($files)->map(function ($file) { + return Str::replaceLast('.php', '', $file->getFilename()); + })->toArray(); + } } \ No newline at end of file From b612d2ff490640bf4ac71cbb8ae8a4c73e9e12a4 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Fri, 19 Dec 2025 14:52:17 -0300 Subject: [PATCH 28/71] =?UTF-8?q?feat:=20Adiciona=20logica=20para=20exibir?= =?UTF-8?q?=20no=20select=20de=20relacionamento=20os=20models=20j=C3=A1=20?= =?UTF-8?q?existentes=20no=20projeto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Console/Editors/RelationshipEditor.php | 33 ++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/Console/Editors/RelationshipEditor.php b/src/Console/Editors/RelationshipEditor.php index e82c33d..1898813 100644 --- a/src/Console/Editors/RelationshipEditor.php +++ b/src/Console/Editors/RelationshipEditor.php @@ -13,7 +13,7 @@ class RelationshipEditor { - public function run(Command $cli): array + public function run(array $models): array { $relationships = []; @@ -23,7 +23,8 @@ public function run(Command $cli): array $action = select( label: 'Gerenciar relacionamentos', options: [ - 'add' => 'Adicionar novo', + 'add' => 'Adicionar novo', + 'select' => 'Selecionar', 'update' => 'Atualizar existente', 'remove' => 'Remover', 'list' => 'Listar todos', @@ -36,6 +37,7 @@ public function run(Command $cli): array match ($action) { 'add' => $this->add($relationships), + 'select' => $this->select($relationships, $models), 'update' => $this->update($relationships), 'remove' => $this->remove($relationships), 'list' => $this->list($relationships), @@ -64,9 +66,31 @@ private function add(array &$relationships): void ); $relationships[$name] = $type; + info("Relacionamento '{$name} ({$type})' adicionado."); } + private function select(array &$relationships, array &$models): void + { + + $model = select( + label: "Selecione o model para relacionamento", + options: $models, + hint: 'Lembre-se: belongsTo criará um campo _id no documento atual.' + ); + + $type = select( + label: "Qual o tipo de relacionamento com '{$model}'?", + options: RelationshipType::values(), + hint: 'Lembre-se: belongsTo criará um campo _id no documento atual.' + ); + + $relationships[$model] = $type; + info("Relacionamento '{$model} ({$type})' adicionado."); + + $this->list($relationships); + } + private function update(array &$relationships): void { if ($this->isEmpty($relationships)) return; @@ -83,7 +107,10 @@ private function update(array &$relationships): void ); $relationships[$collection] = $newType; + info("Atualizado: '{$collection}' agora é '{$newType}'."); + + $this->list($relationships); } private function remove(array &$relationships): void @@ -96,6 +123,8 @@ private function remove(array &$relationships): void unset($relationships[$name]); warning("Relacionamento com '{$name}' removido."); } + + $this->list($relationships); } private function list(array $relationships): void From b7d8ad6bf1fe232adb814b11c0e3753b4f328e5e Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Fri, 19 Dec 2025 14:52:35 -0300 Subject: [PATCH 29/71] refactor: Realiza ajuste no controllerBuilder para resposta dos metodos --- src/Blueprint/Builders/ControllerBuilder.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Blueprint/Builders/ControllerBuilder.php b/src/Blueprint/Builders/ControllerBuilder.php index 15c117a..f9d012c 100644 --- a/src/Blueprint/Builders/ControllerBuilder.php +++ b/src/Blueprint/Builders/ControllerBuilder.php @@ -20,7 +20,7 @@ public function build(string $model): array 'store' => [ 'validate' => "Store{$model}Request", 'save' => $singularVar, - 'respond' => 201, + 'resource' => $singularVar, ], 'show' => [ 'resource' => $singularVar, @@ -28,11 +28,11 @@ public function build(string $model): array 'update' => [ 'validate' => "Update{$model}Request", 'update' => $singularVar, - 'respond' => 200 + 'resource' => $singularVar, ], 'destroy' => [ 'delete' => $singularVar, - 'respond' => 204 + 'respond' => 204, ], ], ]; From 154cca0b921d2b70b5ac9aeed7d468a60503af31 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Fri, 19 Dec 2025 14:54:15 -0300 Subject: [PATCH 30/71] refactor: Realiza ajuste no pos processador do controller --- src/Blueprint/PostProcessors/ControllerPostProcessor.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Blueprint/PostProcessors/ControllerPostProcessor.php b/src/Blueprint/PostProcessors/ControllerPostProcessor.php index 129a067..bd7a01d 100644 --- a/src/Blueprint/PostProcessors/ControllerPostProcessor.php +++ b/src/Blueprint/PostProcessors/ControllerPostProcessor.php @@ -10,12 +10,13 @@ public function handle(string $model): void { $path = base_path("app/Http/Controllers/{$model}Controller.php"); - if (! File::exists($path)) return; + if (!File::exists($path)) return; $content = File::get($path); + $content = preg_replace( - '/(Request\s+\$request,?\s*)|(Request\s+\$request\s*$)/', + '/\bRequest\s+\$request,\s*/', '', $content ); From 83dcca765fbea4ee781979478eec8d9f86fcb4d1 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 10:37:19 -0300 Subject: [PATCH 31/71] =?UTF-8?q?refactor:=20Realiza=20remo=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20request=20no=20pos=20processador=20que=20nao=20estao=20?= =?UTF-8?q?sendo=20utilizados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ControllerPostProcessor.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/Blueprint/PostProcessors/ControllerPostProcessor.php b/src/Blueprint/PostProcessors/ControllerPostProcessor.php index bd7a01d..9914cc7 100644 --- a/src/Blueprint/PostProcessors/ControllerPostProcessor.php +++ b/src/Blueprint/PostProcessors/ControllerPostProcessor.php @@ -14,13 +14,26 @@ public function handle(string $model): void $content = File::get($path); - $content = preg_replace( - - '/\bRequest\s+\$request,\s*/', + $content = str_replace( + 'use Illuminate\Http\Request;', '', $content ); + $content = preg_replace( + [ + '/\bRequest\s+\$request,\s*/', + '/\(\s*Request\s+\$request\s*\)/', + ], + [ + '', + '()', + ], + $content + ); + + + File::put($path, $content); } } From 90dd7f563f1605705da0b51d6e2e0e799f39afbd Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 10:38:14 -0300 Subject: [PATCH 32/71] refactor: Realiza ajustes nos arquivos par ainclusao de novo campo sobre obrigatoriedade do campo --- src/Blueprint/Builders/DraftBuilder.php | 36 +++++++++++- .../Builders/ValidationRuleBuilder.php | 56 +++++++++++++++---- .../ControllerPostProcessor.php | 6 +- src/Console/Editors/FieldEditor.php | 54 +++++++++++++++--- 4 files changed, 130 insertions(+), 22 deletions(-) diff --git a/src/Blueprint/Builders/DraftBuilder.php b/src/Blueprint/Builders/DraftBuilder.php index 9539e74..b7ed1fe 100644 --- a/src/Blueprint/Builders/DraftBuilder.php +++ b/src/Blueprint/Builders/DraftBuilder.php @@ -2,25 +2,31 @@ namespace Sysvale\CuidsGenerator\Blueprint\Builders; +use Blueprint\Models\Policy; use Illuminate\Support\Str; use Sysvale\CuidsGenerator\Blueprint\Builders\ControllerBuilder; use Sysvale\CuidsGenerator\Blueprint\Builders\RequestBuilder; +use Sysvale\CuidsGenerator\Blueprint\Builders\PolicyBuilder; class DraftBuilder { public function __construct( protected RequestBuilder $requestBuilder, - protected ControllerBuilder $controllerBuilder + protected ControllerBuilder $controllerBuilder, + protected PolicyBuilder $policyBuilder ) {} public function build(string $model, array $fields, array $relationships): array { + $formattedModelsFields = $this->mapFields($fields, $relationships); + $draft = [ 'models' => [ - $model => $fields, + $model => $formattedModelsFields, ], 'requests' =>$this->requestBuilder->build($model, $fields), 'controllers' => $this->controllerBuilder->build($model), + 'policies' => $this->policyBuilder->build($model), ]; if (! empty($relationships)) { @@ -31,6 +37,31 @@ public function build(string $model, array $fields, array $relationships): array return $draft; } + private function mapFields(array $fields, array $relationships): array + { + $formatted = []; + + foreach ($fields as $field) { + $name = $field['name']; + $definition = $field['type']; + + if ($field['nullable'] ?? false) { + $definition .= ' nullable'; + } + + $formatted[$name] = $definition; + } + + foreach ($relationships as $relatedModel => $type) { + if ($type === 'belongsTo') { + $foreignKey = Str::snake($relatedModel) . '_id'; + $formatted[$foreignKey] = 'string'; + } + } + + return $formatted; + } + private function mapRelationships(array $relationships): array { $mapped = []; @@ -47,5 +78,4 @@ private function mapRelationships(array $relationships): array ->map(fn ($models) => implode(',', $models)) ->toArray(); } - } diff --git a/src/Blueprint/Builders/ValidationRuleBuilder.php b/src/Blueprint/Builders/ValidationRuleBuilder.php index c371bb8..7e98ad3 100644 --- a/src/Blueprint/Builders/ValidationRuleBuilder.php +++ b/src/Blueprint/Builders/ValidationRuleBuilder.php @@ -6,19 +6,53 @@ class ValidationRuleBuilder { public static function build(array $fields): array { - return collect($fields)->map(fn ($type) => self::rule($type))->toArray(); + return collect($fields)->mapWithKeys(fn($field) => [ + $field['name'] => self::buildRules($field) + ])->toArray(); } - private static function rule(string $type): string + public static function buildForUpdate(array $fields, string $table, string $primaryKey = 'id'): array { - $rules = match ($type) { - 'string' => 'string|max:255', - 'integer' => 'integer', - 'boolean' => 'boolean', - 'date', 'timestamp' => 'date', - default => 'string', - }; + return collect($fields)->mapWithKeys(function ($field) use ($table, $primaryKey) { + $name = $field['name']; + $rules = self::buildRules($field); + + $rules = str_replace( + "unique:{$table},{$name}", + "unique:{$table},{$name},{{$primaryKey}}", + $rules + ); + + return [$name => $rules]; + })->toArray(); + } + + private static function buildRules(array $field): string + { + $rules = []; + + $rules[] = ($field['nullable'] ?? false) ? 'nullable' : 'required'; - return "required|{$rules}"; + if ($typeRules = self::getTypeRules($field['type'])) { + $rules[] = $typeRules; + } + + $extraRules = $field['validation_rules'] ?? []; + $rules = array_merge($rules, (array) $extraRules); + + return implode('|', array_filter($rules)); + } + + private static function getTypeRules(string $type): ?string + { + return match ($type) { + 'string', 'text' => 'string', + 'integer', 'bigInteger' => 'integer', + 'boolean' => 'boolean', + 'date', 'datetime', + 'timestamp' => 'date', + 'decimal', 'float' => 'numeric', + default => null, + }; } -} +} \ No newline at end of file diff --git a/src/Blueprint/PostProcessors/ControllerPostProcessor.php b/src/Blueprint/PostProcessors/ControllerPostProcessor.php index 9914cc7..9180dd8 100644 --- a/src/Blueprint/PostProcessors/ControllerPostProcessor.php +++ b/src/Blueprint/PostProcessors/ControllerPostProcessor.php @@ -32,7 +32,11 @@ public function handle(string $model): void $content ); - + $content = preg_replace( + '/\n\s*use Illuminate\\\\Http\\\\Response;/', + '', + $content + ); File::put($path, $content); } diff --git a/src/Console/Editors/FieldEditor.php b/src/Console/Editors/FieldEditor.php index 7f4387c..97cd3da 100644 --- a/src/Console/Editors/FieldEditor.php +++ b/src/Console/Editors/FieldEditor.php @@ -3,7 +3,6 @@ namespace Sysvale\CuidsGenerator\Console\Editors; use Sysvale\CuidsGenerator\Support\FieldType; -use Illuminate\Console\Command; use function Laravel\Prompts\select; use function Laravel\Prompts\text; use function Laravel\Prompts\table; @@ -26,6 +25,7 @@ public function run(): array 'add' => 'Adicionar', 'rename' => 'Atualizar nome', 'change-type' => 'Atualizar tipo', + 'change-required' => 'Alterar obrigatoriedade', 'remove' => 'Remover', 'list' => 'Listar', 'done' => 'Ir para próxima etapa', @@ -37,6 +37,7 @@ public function run(): array 'add' => $this->add($fields), 'rename' => $this->rename($fields), 'change-type' => $this->changeType($fields), + 'change-required' => $this->changeRequired($fields), 'remove' => $this->remove($fields), 'list' => $this->list($fields), 'done' => null, @@ -66,12 +67,23 @@ private function add(array &$fields): void default: FieldType::values()[0] ); - $fields[$name] = $type; + $requiredChoice = select( + label: "O campo '{$name}' é obrigatório?", + options: ['Sim', 'Não'], + default: 'Sim' + ); + + $fields[$name] = [ + 'name' => $name, + 'type' => $type, + 'required' => $requiredChoice === 'Sim', + 'nullable' => $requiredChoice === 'Não', + ]; $this->list($fields); } -private function rename(array &$fields): void + private function rename(array &$fields): void { if ($this->isEmpty($fields)) return; @@ -86,6 +98,7 @@ private function rename(array &$fields): void ); $fields[$new] = $fields[$old]; + $fields[$new]['name'] = $new; unset($fields[$old]); $this->list($fields); @@ -96,11 +109,32 @@ private function changeType(array &$fields): void if ($this->isEmpty($fields)) return; $name = select('Alterar tipo de qual campo?', array_keys($fields)); - $fields[$name] = select( + + $newType = select( label: "Novo tipo para '{$name}'", options: FieldType::values() ); + $fields[$name]['type'] = $newType; + + $this->list($fields); + } + + private function changeRequired(array &$fields): void + { + if ($this->isEmpty($fields)) return; + + $name = select('Alterar obrigatoriedade de qual campo?', array_keys($fields)); + + $requiredChoice = select( + label: "Novo status de obrigatoriedade para '{$name}'", + options: ['Sim', 'Não'], + default: $fields[$name]['required'] ? 'Sim' : 'Não' + ); + + $fields[$name]['required'] = $requiredChoice === 'Sim'; + $fields[$name]['nullable'] = $requiredChoice === 'Não'; + $this->list($fields); } @@ -122,8 +156,14 @@ private function list(array $fields): void if ($this->isEmpty($fields)) return; table( - ['Campo', 'Tipo'], - collect($fields)->map(fn ($t, $n) => [$n, $t])->toArray() + ['Campo', 'Tipo', 'Obrigatório'], + collect($fields)->map(function ($field) { + return [ + $field['name'], + $field['type'], + $field['required'] ? '✓ Sim' : '✗ Não' + ]; + })->toArray() ); } @@ -135,4 +175,4 @@ private function isEmpty(array $fields): bool } return false; } -} +} \ No newline at end of file From d25bdef59265e60584caaa52fe999cc01abd03a4 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 10:38:25 -0300 Subject: [PATCH 33/71] refactro: Remove factories do model no pos processador --- .../Mongo/MongoModelTransformer.php | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php b/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php index 65d7fb9..3e11c2a 100644 --- a/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php +++ b/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php @@ -20,6 +20,8 @@ public function handle(string $model): void $content = $this->applySoftDeletes($content); + $content = $this->removeFactories($content); + $content = $this->cleanupCasts($content); $content = $this->setupVisibility($content); @@ -50,7 +52,7 @@ protected function setupBaseStructure(string $content, string $model): string protected function applySoftDeletes(string $content): string { - if (!str_contains($content, 'MongoDB\\Laravel\\Eloquent\\SoftDeletes')) { + if (!str_contains($content, 'Illuminate\\Database\\Eloquent\\SoftDeletes')) { $content = str_replace( "use MongoDB\Laravel\Eloquent\Model;", "use MongoDB\Laravel\Eloquent\Model;\nuse Illuminate\Database\Eloquent\SoftDeletes;", @@ -60,8 +62,8 @@ protected function applySoftDeletes(string $content): string if (!str_contains($content, 'use SoftDeletes;')) { $content = preg_replace( - '/(use HasFactory;)/', - "\n use SoftDeletes;\n $1", + '/(protected\s+\$collection\s*=\s*\'[^\']*\';)/', + "$1\n\n use SoftDeletes;", $content ); } @@ -69,6 +71,23 @@ protected function applySoftDeletes(string $content): string return $content; } + protected function removeFactories(string $content): string + { + $content = preg_replace( + '/use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory;\n/', + '', + $content + ); + + $content = preg_replace( + '/\s+use HasFactory;/', + '', + $content + ); + + return $content; + } + protected function cleanupCasts(string $content): string { $content = preg_replace( From e9d861b28964347a8124782297fde81aa7b386e1 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 10:38:39 -0300 Subject: [PATCH 34/71] feat: Adiciona arquivo de builder da policy --- src/Blueprint/Builders/PolicyBuilder.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/Blueprint/Builders/PolicyBuilder.php diff --git a/src/Blueprint/Builders/PolicyBuilder.php b/src/Blueprint/Builders/PolicyBuilder.php new file mode 100644 index 0000000..e027d6c --- /dev/null +++ b/src/Blueprint/Builders/PolicyBuilder.php @@ -0,0 +1,21 @@ + [ + 'model' => $model, + 'methods' => [ + 'view', + 'create', + 'update', + 'delete', + ], + ], + ]; + } +} \ No newline at end of file From 63b4c6dabf22c5b12499422f2e07284f212f4c15 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 10:41:51 -0300 Subject: [PATCH 35/71] =?UTF-8?q?refactor:=20Remove=20espa=C3=A7amentos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Blueprint/Builders/ValidationRuleBuilder.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Blueprint/Builders/ValidationRuleBuilder.php b/src/Blueprint/Builders/ValidationRuleBuilder.php index 7e98ad3..8cbf00d 100644 --- a/src/Blueprint/Builders/ValidationRuleBuilder.php +++ b/src/Blueprint/Builders/ValidationRuleBuilder.php @@ -46,13 +46,13 @@ private static function buildRules(array $field): string private static function getTypeRules(string $type): ?string { return match ($type) { - 'string', 'text' => 'string', + 'string', 'text' => 'string', 'integer', 'bigInteger' => 'integer', - 'boolean' => 'boolean', + 'boolean' => 'boolean', 'date', 'datetime', - 'timestamp' => 'date', - 'decimal', 'float' => 'numeric', - default => null, + 'timestamp' => 'date', + 'decimal', 'float' => 'numeric', + default => null, }; } } \ No newline at end of file From 123b98ac48a3e2744be9804dea3e36d8b7d0ae6e Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 14:20:34 -0300 Subject: [PATCH 36/71] refactor: Remove temporariamente logicas de policies --- src/Blueprint/Builders/DraftBuilder.php | 2 -- src/Blueprint/Builders/PolicyBuilder.php | 21 --------------------- 2 files changed, 23 deletions(-) delete mode 100644 src/Blueprint/Builders/PolicyBuilder.php diff --git a/src/Blueprint/Builders/DraftBuilder.php b/src/Blueprint/Builders/DraftBuilder.php index b7ed1fe..a092854 100644 --- a/src/Blueprint/Builders/DraftBuilder.php +++ b/src/Blueprint/Builders/DraftBuilder.php @@ -13,7 +13,6 @@ class DraftBuilder public function __construct( protected RequestBuilder $requestBuilder, protected ControllerBuilder $controllerBuilder, - protected PolicyBuilder $policyBuilder ) {} public function build(string $model, array $fields, array $relationships): array @@ -26,7 +25,6 @@ public function build(string $model, array $fields, array $relationships): array ], 'requests' =>$this->requestBuilder->build($model, $fields), 'controllers' => $this->controllerBuilder->build($model), - 'policies' => $this->policyBuilder->build($model), ]; if (! empty($relationships)) { diff --git a/src/Blueprint/Builders/PolicyBuilder.php b/src/Blueprint/Builders/PolicyBuilder.php deleted file mode 100644 index e027d6c..0000000 --- a/src/Blueprint/Builders/PolicyBuilder.php +++ /dev/null @@ -1,21 +0,0 @@ - [ - 'model' => $model, - 'methods' => [ - 'view', - 'create', - 'update', - 'delete', - ], - ], - ]; - } -} \ No newline at end of file From 6f11a0daaba3b9be4a216b7855ab1f0af3217e67 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 14:20:55 -0300 Subject: [PATCH 37/71] feat: Adiciona construcao de formBuilder para front --- src/Blueprint/Builders/FormFieldBuilder.php | 63 +++++++++++++++++++ .../PostProcessors/FormFieldPostProcessor.php | 30 +++++++++ src/Console/Commands/CuidsGenerateCommand.php | 16 ++++- .../CuidsGeneratorServiceProvider.php | 2 + 4 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 src/Blueprint/Builders/FormFieldBuilder.php create mode 100644 src/Blueprint/PostProcessors/FormFieldPostProcessor.php diff --git a/src/Blueprint/Builders/FormFieldBuilder.php b/src/Blueprint/Builders/FormFieldBuilder.php new file mode 100644 index 0000000..3f00268 --- /dev/null +++ b/src/Blueprint/Builders/FormFieldBuilder.php @@ -0,0 +1,63 @@ +map(function ($field) { + return $this->mapToFrontendStructure($field); + })->values()->toArray(); + + $jsonFields = json_encode($mappedFields, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); + + $jsObject = preg_replace('/"([^"]+)":/', '$1:', $jsonFields); + + $content = "export default {$jsObject};"; + + File::put($path, $content); + } + + private function mapToFrontendStructure(array $field): array + { + $name = Str::kebab($field['name']); + $label = Str::headline($name); + + return [ + 'name' => $name, + 'label' => $label, + 'validateLabel' => $label, + 'component' => $this->mapComponent($field['type']), + 'fluid' => true, + 'required' => $field['required'], + 'rules' => $field['required'] ? 'required' : '', + 'colSpan' => 12 + ]; + } + + private function mapComponent(string $type): string + { + return match ($type) { + 'date', 'datetime' => 'CdsDateInput', + 'boolean' => 'CdsCheckbox', + 'integer', 'float' => 'CdsNumberInput', + default => 'CdsTextInput', + }; + } +} diff --git a/src/Blueprint/PostProcessors/FormFieldPostProcessor.php b/src/Blueprint/PostProcessors/FormFieldPostProcessor.php new file mode 100644 index 0000000..4a46f21 --- /dev/null +++ b/src/Blueprint/PostProcessors/FormFieldPostProcessor.php @@ -0,0 +1,30 @@ +fieldEditor = $fieldEditor; $this->relationshipEditor = $relationshipEditor; $this->postProcessorRunner = $postProcessorRunner; + $this->formFieldBuilder = $formFieldBuilder; } public function handle() @@ -71,6 +75,16 @@ public function handle() $this->call('blueprint:build'); + $this->info('Gerando arquivo de constantes para o frontend...'); + + try { + $this->formFieldBuilder->handle($entityStudly, $fields); + } catch (\Exception $e) { + $this->error("Erro ao gerar arquivo de constantes do frontend: {$e->getMessage()}"); + } + + $this->info('Executando pós-processadores...'); + try { $this->postProcessorRunner->run($entityStudly); } catch (\Exception $e) { diff --git a/src/Providers/CuidsGeneratorServiceProvider.php b/src/Providers/CuidsGeneratorServiceProvider.php index b0c4d81..c8becc6 100644 --- a/src/Providers/CuidsGeneratorServiceProvider.php +++ b/src/Providers/CuidsGeneratorServiceProvider.php @@ -11,6 +11,7 @@ use Sysvale\CuidsGenerator\Blueprint\PostProcessors\Mongo\MongoModelTransformer; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\RequestPostProcessor; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\TestPostProcessor; +use Sysvale\CuidsGenerator\Blueprint\PostProcessors\FormFieldPostProcessor; use Illuminate\Support\Facades\File; class CuidsGeneratorServiceProvider extends ServiceProvider @@ -37,6 +38,7 @@ private function registerPostProcessors(): void $app->make(TestPostProcessor::class), $app->make(CollectionPostProcessor::class), $app->make(ControllerPostProcessor::class), + $app->make(FormFieldPostProcessor::class), ]); }); } From 0423658d3b078816209035d35e6d90fb83bf6e9a Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 14:21:15 -0300 Subject: [PATCH 38/71] =?UTF-8?q?refactor:=20Faz=20corre=C3=A7=C3=B5es=20d?= =?UTF-8?q?e=20teste=20para=20uso=20de=20factories?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ControllerPostProcessor.php | 10 ++---- .../PostProcessors/TestPostProcessor.php | 6 ++++ src/Blueprint/Stubs/collection.stub | 2 +- src/Blueprint/Stubs/controller.test.stub | 33 ++++++++++--------- 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/Blueprint/PostProcessors/ControllerPostProcessor.php b/src/Blueprint/PostProcessors/ControllerPostProcessor.php index 9180dd8..e507fe2 100644 --- a/src/Blueprint/PostProcessors/ControllerPostProcessor.php +++ b/src/Blueprint/PostProcessors/ControllerPostProcessor.php @@ -15,8 +15,8 @@ public function handle(string $model): void $content = File::get($path); $content = str_replace( - 'use Illuminate\Http\Request;', - '', + "use Illuminate\Http\Request;\n", + "", $content ); @@ -32,11 +32,7 @@ public function handle(string $model): void $content ); - $content = preg_replace( - '/\n\s*use Illuminate\\\\Http\\\\Response;/', - '', - $content - ); + $content = preg_replace("/(\n\s*){3,}/", "\n\n", $content); File::put($path, $content); } diff --git a/src/Blueprint/PostProcessors/TestPostProcessor.php b/src/Blueprint/PostProcessors/TestPostProcessor.php index 00c30a2..5883247 100644 --- a/src/Blueprint/PostProcessors/TestPostProcessor.php +++ b/src/Blueprint/PostProcessors/TestPostProcessor.php @@ -33,6 +33,12 @@ public function handle(string $model): void $stub ); + $content = str_replace( + "use App\Models\\" . $model . ";", + "use Database\Factories\\" . $model . "Factory;", + $content + ); + File::put($path, $content); } } diff --git a/src/Blueprint/Stubs/collection.stub b/src/Blueprint/Stubs/collection.stub index fe9292e..5b14557 100644 --- a/src/Blueprint/Stubs/collection.stub +++ b/src/Blueprint/Stubs/collection.stub @@ -8,7 +8,7 @@ class {{ model }}Collection extends ResourceCollection { public static $wrap = null; - public function toArray(): array + public function toArray($request): array { return $this ->collection diff --git a/src/Blueprint/Stubs/controller.test.stub b/src/Blueprint/Stubs/controller.test.stub index 3957dde..a62594d 100644 --- a/src/Blueprint/Stubs/controller.test.stub +++ b/src/Blueprint/Stubs/controller.test.stub @@ -17,7 +17,9 @@ class {{ model }}ControllerTest extends TestCase public function testIf{{ pluralModel }}AreListedCorrectly(): void { - {{ model }}::factory()->count(3)->create(); + {{ model }}Factory::new() + ->count(3) + ->create(); $this->getJson(route('{{ route }}.index')) ->assertStatus(200); @@ -25,18 +27,18 @@ class {{ model }}ControllerTest extends TestCase public function testIf{{ model }}CanBeCreated(): void { - $data = {{ model }}::factory()->make()->toArray(); + $data = {{ model }}Factory::new() + ->make() + ->toArray(); $this->postJson(route('{{ route }}.store'), $data) - ->assertJsonFragment([ - 'message' => 'Criado com sucesso' - ]) ->assertStatus(201); } public function testIf{{ model }}CanBeShown(): void { - $model = {{ model }}::factory()->create(); + $model = {{ model }}Factory::new() + ->create(); $this->getJson(route('{{ route }}.show', $model)) ->assertStatus(200); @@ -44,25 +46,24 @@ class {{ model }}ControllerTest extends TestCase public function testIf{{ model }}CanBeUpdated(): void { - $model = {{ model }}::factory()->create(); - $updatedData = {{ model }}::factory()->make()->toArray(); + $model = {{ model }}Factory::new() + ->create(); + + $updatedData = {{ model }}Factory::new() + ->make() + ->toArray(); $this->putJson(route('{{ route }}.update', $model), $updatedData) - ->assertJsonFragment([ - 'message' => 'Atualizado com sucesso' - ]) ->assertStatus(200); } public function testIf{{ model }}CanBeDeleted(): void { - $model = {{ model }}::factory()->create(); + $model = {{ model }}Factory::new() + ->create(); $this->deleteJson(route('{{ route }}.destroy', $model)) - ->assertJsonFragment([ - 'message' => 'Removido com sucesso' - ]) - ->assertStatus(200); + ->assertStatus(204); $this->assertSoftDeleted('{{ table }}', [ 'id' => $model->id From 2872185319335eb5eab04483b347d5b7041be927 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 15:56:18 -0300 Subject: [PATCH 39/71] feat: Adiciona pos processador para adicionar rota e import do controller no web.php --- .../PostProcessors/RoutePostProcessor.php | 93 +++++++++++++++++++ src/Console/Commands/CuidsGenerateCommand.php | 5 +- .../CuidsGeneratorServiceProvider.php | 4 +- 3 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 src/Blueprint/PostProcessors/RoutePostProcessor.php diff --git a/src/Blueprint/PostProcessors/RoutePostProcessor.php b/src/Blueprint/PostProcessors/RoutePostProcessor.php new file mode 100644 index 0000000..14db994 --- /dev/null +++ b/src/Blueprint/PostProcessors/RoutePostProcessor.php @@ -0,0 +1,93 @@ +removeBlueprintResourceRoute($content, $model); + + $updated = $this->registerBackEndRoute($content, $model); + + File::put($path, $updated); + } + + private function registerBackEndRoute(string $content, string $model): string + { + $lines = explode("\n", $content); + + $controller = Str::studly($model).'Controller'; + $routeName = Str::kebab(Str::pluralStudly($model)); + + $useLine = "use App\Http\Controllers\\{$controller};"; + $routeLine = " Route::apiResource('/{$routeName}', {$controller}::class);"; + + $foundImportMarker = false; + $foundRegisterMarker = false; + + $result = []; + + foreach ($lines as $line) { + if (str_contains($line, '@endcontrollerimport')) { + $foundImportMarker = true; + + if (! str_contains($content, $useLine)) { + $result[] = $useLine; + } + } + + if (str_contains($line, '@endroutergister')) { + $foundRegisterMarker = true; + + if (! str_contains($content, $routeLine)) { + if (! empty($result) && trim(end($result)) !== '') { + $result[] = ''; + } + + $result[] = $routeLine; + } + } + + $result[] = $line; + } + + if (! $foundImportMarker) { + throw new RuntimeException( + 'Não foi possível encontrar o marcador @endcontrollerimport em routes/web.php' + ); + } + + if (! $foundRegisterMarker) { + throw new RuntimeException( + 'Não foi possível encontrar o marcador @endroutergister em routes/web.php' + ); + } + + return implode("\n", $result); + } + + private function removeBlueprintResourceRoute(string $content, string $model): string + { + $controller = Str::studly($model) . 'Controller'; + + $pattern = sprintf( + '/Route::resource\s*\(\s*[\'"][^\'"]+[\'"]\s*,\s*App\\\\Http\\\\Controllers\\\\%s::class\s*\)\s*(->(?:only|except)\([^)]+\))?\s*;/m', + $controller + ); + + return preg_replace($pattern, '', $content); + } +} diff --git a/src/Console/Commands/CuidsGenerateCommand.php b/src/Console/Commands/CuidsGenerateCommand.php index eaa2462..eb17d61 100644 --- a/src/Console/Commands/CuidsGenerateCommand.php +++ b/src/Console/Commands/CuidsGenerateCommand.php @@ -87,6 +87,7 @@ public function handle() try { $this->postProcessorRunner->run($entityStudly); + $this->info('Arquivos gerados com sucesso!'); } catch (\Exception $e) { $this->error("Erro ao aplicar pós-processadores]: {$e->getMessage()}"); } @@ -96,7 +97,7 @@ public function getProjectModels(): array { $modelsPath = app_path('Models'); - if (!File::isDirectory($modelsPath)) return []; + if (! File::isDirectory($modelsPath)) return []; $files = File::allFiles($modelsPath); @@ -105,5 +106,3 @@ public function getProjectModels(): array })->toArray(); } } - - \ No newline at end of file diff --git a/src/Providers/CuidsGeneratorServiceProvider.php b/src/Providers/CuidsGeneratorServiceProvider.php index c8becc6..62c7d48 100644 --- a/src/Providers/CuidsGeneratorServiceProvider.php +++ b/src/Providers/CuidsGeneratorServiceProvider.php @@ -11,8 +11,8 @@ use Sysvale\CuidsGenerator\Blueprint\PostProcessors\Mongo\MongoModelTransformer; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\RequestPostProcessor; use Sysvale\CuidsGenerator\Blueprint\PostProcessors\TestPostProcessor; -use Sysvale\CuidsGenerator\Blueprint\PostProcessors\FormFieldPostProcessor; use Illuminate\Support\Facades\File; +use Sysvale\CuidsGenerator\Blueprint\PostProcessors\RoutePostProcessor; class CuidsGeneratorServiceProvider extends ServiceProvider { @@ -38,7 +38,7 @@ private function registerPostProcessors(): void $app->make(TestPostProcessor::class), $app->make(CollectionPostProcessor::class), $app->make(ControllerPostProcessor::class), - $app->make(FormFieldPostProcessor::class), + $app->make(RoutePostProcessor::class), ]); }); } From ed66991fcfd38c58fe4547e7664e68bf25ced081 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 16:07:23 -0300 Subject: [PATCH 40/71] refactor: Realiza ajustes no pos processador do arquivo de constantes gerados para o front --- src/Blueprint/PostProcessors/FormFieldPostProcessor.php | 8 ++------ src/Providers/CuidsGeneratorServiceProvider.php | 4 +++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/Blueprint/PostProcessors/FormFieldPostProcessor.php b/src/Blueprint/PostProcessors/FormFieldPostProcessor.php index 4a46f21..56f78a4 100644 --- a/src/Blueprint/PostProcessors/FormFieldPostProcessor.php +++ b/src/Blueprint/PostProcessors/FormFieldPostProcessor.php @@ -1,6 +1,6 @@ make(CollectionPostProcessor::class), $app->make(ControllerPostProcessor::class), $app->make(RoutePostProcessor::class), + $app->make(FormFieldPostProcessor::class), ]); }); } From 5d5f6f485396b281c4ef8dd42607cbbd2568c611 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 16:14:34 -0300 Subject: [PATCH 41/71] feat: Adiciona ci de testes --- .github/workflows/tests.yml | 25 +++++++++++++++++++++++++ tests/Feature/CiTest.php | 26 ++++++++++++++++++++++++++ tests/TestCase.php | 22 ++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 .github/workflows/tests.yml create mode 100644 tests/Feature/CiTest.php create mode 100644 tests/TestCase.php diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..b3c4a0b --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,25 @@ +name: Test Package Commands + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.2' + extensions: mbstring, dom, fileinfo, sqlite, gd + coverage: none + + - name: Install Laravel Orchestral (Testbench) + run: | + composer update --prefer-stable --no-interaction + + - name: Run Pest or PHPUnit Tests + run: vendor/bin/pest \ No newline at end of file diff --git a/tests/Feature/CiTest.php b/tests/Feature/CiTest.php new file mode 100644 index 0000000..656e81c --- /dev/null +++ b/tests/Feature/CiTest.php @@ -0,0 +1,26 @@ +assertArrayHasKey('cuids:generate', $commands); + } + + /** @test */ + public function it_can_access_the_builders_classes() + { + $builder = new FrontEndBuilder(); + + $this->assertInstanceOf(FrontEndBuilder::class, $builder); + } +} \ No newline at end of file diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..045b1ef --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,22 @@ + Date: Mon, 22 Dec 2025 16:16:54 -0300 Subject: [PATCH 42/71] chore: Instala pacote do pest --- composer.json | 8 +- composer.lock | 1066 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 1035 insertions(+), 39 deletions(-) diff --git a/composer.json b/composer.json index ced36bf..f3b2ea9 100644 --- a/composer.json +++ b/composer.json @@ -26,6 +26,12 @@ "minimum-stability": "dev", "prefer-stable": true, "require-dev": { - "orchestra/testbench": "^9.0" + "orchestra/testbench": "^9.0", + "pestphp/pest": "^4.1" + }, + "config": { + "allow-plugins": { + "pestphp/pest-plugin": true + } } } diff --git a/composer.lock b/composer.lock index 502fb38..dc312d7 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": "03184e0f33e8c861867a42dcb902e005", + "content-hash": "54e036afb4a44430d5fadceef47fe31f", "packages": [ { "name": "brick/math", @@ -5932,6 +5932,100 @@ } ], "packages-dev": [ + { + "name": "brianium/paratest", + "version": "v7.14.0", + "source": { + "type": "git", + "url": "https://github.com/paratestphp/paratest.git", + "reference": "5dc47b3a4638a1c6c6b4941bee5908b2e2154b84" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/5dc47b3a4638a1c6c6b4941bee5908b2e2154b84", + "reference": "5dc47b3a4638a1c6c6b4941bee5908b2e2154b84", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-simplexml": "*", + "fidry/cpu-core-counter": "^1.3.0", + "jean85/pretty-package-versions": "^2.1.1", + "php": "~8.3.0 || ~8.4.0 || ~8.5.0", + "phpunit/php-code-coverage": "^12.4.0", + "phpunit/php-file-iterator": "^6", + "phpunit/php-timer": "^8", + "phpunit/phpunit": "^12.3.15", + "sebastian/environment": "^8.0.3", + "symfony/console": "^6.4.20 || ^7.3.4", + "symfony/process": "^6.4.20 || ^7.3.4" + }, + "require-dev": { + "doctrine/coding-standard": "^13.0.1", + "ext-pcntl": "*", + "ext-pcov": "*", + "ext-posix": "*", + "phpstan/phpstan": "^2.1.29", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpstan/phpstan-strict-rules": "^2.0.7", + "squizlabs/php_codesniffer": "^3.13.4", + "symfony/filesystem": "^6.4.13 || ^7.3.2" + }, + "bin": [ + "bin/paratest", + "bin/paratest_for_phpstorm" + ], + "type": "library", + "autoload": { + "psr-4": { + "ParaTest\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Scaturro", + "email": "scaturrob@gmail.com", + "role": "Developer" + }, + { + "name": "Filippo Tessarotto", + "email": "zoeslam@gmail.com", + "role": "Developer" + } + ], + "description": "Parallel testing for PHP", + "homepage": "https://github.com/paratestphp/paratest", + "keywords": [ + "concurrent", + "parallel", + "phpunit", + "testing" + ], + "support": { + "issues": "https://github.com/paratestphp/paratest/issues", + "source": "https://github.com/paratestphp/paratest/tree/v7.14.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/Slamdunk", + "type": "github" + }, + { + "url": "https://paypal.me/filippotessarotto", + "type": "paypal" + } + ], + "time": "2025-09-30T08:03:23+00:00" + }, { "name": "composer/semver", "version": "3.4.4", @@ -6009,6 +6103,54 @@ ], "time": "2025-08-20T19:15:30+00:00" }, + { + "name": "doctrine/deprecations", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "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.5" + }, + "time": "2025-04-07T20:06:18+00:00" + }, { "name": "fakerphp/faker", "version": "v1.24.1", @@ -6072,6 +6214,67 @@ }, "time": "2024-11-21T13:46:39+00:00" }, + { + "name": "fidry/cpu-core-counter", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "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/1.3.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2025-08-14T07:29:31+00:00" + }, { "name": "filp/whoops", "version": "2.18.4", @@ -6194,6 +6397,66 @@ }, "time": "2025-04-30T06:54:44+00:00" }, + { + "name": "jean85/pretty-package-versions", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "rector/rector": "^2.0", + "vimeo/psalm": "^4.3 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.1" + }, + "time": "2025-03-19T14:43:43+00:00" + }, { "name": "laravel/pail", "version": "v1.2.4", @@ -7000,59 +7263,447 @@ "shasum": "" }, "require": { - "composer-runtime-api": "^2.2", - "fakerphp/faker": "^1.23", - "laravel/framework": "^11.44.2", - "laravel/pail": "^1.2", - "laravel/tinker": "^2.9", - "nunomaduro/collision": "^8.0", - "orchestra/canvas": "^9.2.2", - "orchestra/sidekick": "^1.1.0", - "orchestra/testbench-core": "^9.12.0", - "php": "^8.2", - "symfony/polyfill-php83": "^1.31", - "symfony/polyfill-php84": "^1.31", - "symfony/process": "^7.0.3", - "symfony/yaml": "^7.0.3" + "composer-runtime-api": "^2.2", + "fakerphp/faker": "^1.23", + "laravel/framework": "^11.44.2", + "laravel/pail": "^1.2", + "laravel/tinker": "^2.9", + "nunomaduro/collision": "^8.0", + "orchestra/canvas": "^9.2.2", + "orchestra/sidekick": "^1.1.0", + "orchestra/testbench-core": "^9.12.0", + "php": "^8.2", + "symfony/polyfill-php83": "^1.31", + "symfony/polyfill-php84": "^1.31", + "symfony/process": "^7.0.3", + "symfony/yaml": "^7.0.3" + }, + "require-dev": { + "laravel/pint": "^1.21", + "mockery/mockery": "^1.6.10", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.5.35|^11.3.6|^12.0.1", + "spatie/laravel-ray": "^1.39.1" + }, + "suggest": { + "ext-pcntl": "Required to use all features of the console signal trapping." + }, + "type": "library", + "autoload": { + "psr-4": { + "Orchestra\\Workbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Workbench Companion for Laravel Packages Development", + "keywords": [ + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/workbench/issues", + "source": "https://github.com/orchestral/workbench/tree/v9.13.5" + }, + "time": "2025-04-06T11:06:19+00:00" + }, + { + "name": "pestphp/pest", + "version": "v4.1.1", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest.git", + "reference": "8e3444e1db7a6bd06b7f3683c3d82db77406357b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest/zipball/8e3444e1db7a6bd06b7f3683c3d82db77406357b", + "reference": "8e3444e1db7a6bd06b7f3683c3d82db77406357b", + "shasum": "" + }, + "require": { + "brianium/paratest": "^7.14.0", + "nunomaduro/collision": "^8.8.2", + "nunomaduro/termwind": "^2.3.1", + "pestphp/pest-plugin": "^4.0.0", + "pestphp/pest-plugin-arch": "^4.0.0", + "pestphp/pest-plugin-mutate": "^4.0.1", + "pestphp/pest-plugin-profanity": "^4.1.0", + "php": "^8.3.0", + "phpunit/phpunit": "^12.3.15", + "symfony/process": "^7.3.3" + }, + "conflict": { + "filp/whoops": "<2.18.3", + "phpunit/phpunit": ">12.3.15", + "sebastian/exporter": "<7.0.0", + "webmozart/assert": "<1.11.0" + }, + "require-dev": { + "pestphp/pest-dev-tools": "^4.0.0", + "pestphp/pest-plugin-browser": "^4.1.0", + "pestphp/pest-plugin-type-coverage": "^4.0.2", + "psy/psysh": "^0.12.10" + }, + "bin": [ + "bin/pest" + ], + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Mutate\\Plugins\\Mutate", + "Pest\\Plugins\\Configuration", + "Pest\\Plugins\\Bail", + "Pest\\Plugins\\Cache", + "Pest\\Plugins\\Coverage", + "Pest\\Plugins\\Init", + "Pest\\Plugins\\Environment", + "Pest\\Plugins\\Help", + "Pest\\Plugins\\Memory", + "Pest\\Plugins\\Only", + "Pest\\Plugins\\Printer", + "Pest\\Plugins\\ProcessIsolation", + "Pest\\Plugins\\Profile", + "Pest\\Plugins\\Retry", + "Pest\\Plugins\\Snapshot", + "Pest\\Plugins\\Verbose", + "Pest\\Plugins\\Version", + "Pest\\Plugins\\Shard", + "Pest\\Plugins\\Parallel" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php", + "src/Pest.php" + ], + "psr-4": { + "Pest\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "The elegant PHP Testing Framework.", + "keywords": [ + "framework", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "issues": "https://github.com/pestphp/pest/issues", + "source": "https://github.com/pestphp/pest/tree/v4.1.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2025-10-01T13:30:25+00:00" + }, + { + "name": "pestphp/pest-plugin", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin.git", + "reference": "9d4b93d7f73d3f9c3189bb22c220fef271cdf568" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/9d4b93d7f73d3f9c3189bb22c220fef271cdf568", + "reference": "9d4b93d7f73d3f9c3189bb22c220fef271cdf568", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0.0", + "composer-runtime-api": "^2.2.2", + "php": "^8.3" + }, + "conflict": { + "pestphp/pest": "<4.0.0" + }, + "require-dev": { + "composer/composer": "^2.8.10", + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Pest\\Plugin\\Manager" + }, + "autoload": { + "psr-4": { + "Pest\\Plugin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest plugin manager", + "keywords": [ + "framework", + "manager", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin/tree/v4.0.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2025-08-20T12:35:58+00:00" + }, + { + "name": "pestphp/pest-plugin-arch", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-arch.git", + "reference": "25bb17e37920ccc35cbbcda3b00d596aadf3e58d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/25bb17e37920ccc35cbbcda3b00d596aadf3e58d", + "reference": "25bb17e37920ccc35cbbcda3b00d596aadf3e58d", + "shasum": "" + }, + "require": { + "pestphp/pest-plugin": "^4.0.0", + "php": "^8.3", + "ta-tikoma/phpunit-architecture-test": "^0.8.5" + }, + "require-dev": { + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Arch\\Plugin" + ] + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Arch\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Arch plugin for Pest PHP.", + "keywords": [ + "arch", + "architecture", + "framework", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-arch/tree/v4.0.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2025-08-20T13:10:51+00:00" + }, + { + "name": "pestphp/pest-plugin-mutate", + "version": "v4.0.1", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-mutate.git", + "reference": "d9b32b60b2385e1688a68cc227594738ec26d96c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/d9b32b60b2385e1688a68cc227594738ec26d96c", + "reference": "d9b32b60b2385e1688a68cc227594738ec26d96c", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.6.1", + "pestphp/pest-plugin": "^4.0.0", + "php": "^8.3", + "psr/simple-cache": "^3.0.0" + }, + "require-dev": { + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0", + "pestphp/pest-plugin-type-coverage": "^4.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pest\\Mutate\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + }, + { + "name": "Sandro Gehri", + "email": "sandrogehri@gmail.com" + } + ], + "description": "Mutates your code to find untested cases", + "keywords": [ + "framework", + "mutate", + "mutation", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v4.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/gehrisandro", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2025-08-21T20:19:25+00:00" + }, + { + "name": "pestphp/pest-plugin-profanity", + "version": "v4.2.1", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-profanity.git", + "reference": "343cfa6f3564b7e35df0ebb77b7fa97039f72b27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-profanity/zipball/343cfa6f3564b7e35df0ebb77b7fa97039f72b27", + "reference": "343cfa6f3564b7e35df0ebb77b7fa97039f72b27", + "shasum": "" + }, + "require": { + "pestphp/pest-plugin": "^4.0.0", + "php": "^8.3" }, "require-dev": { - "laravel/pint": "^1.21", - "mockery/mockery": "^1.6.10", - "phpstan/phpstan": "^2.1", - "phpunit/phpunit": "^10.5.35|^11.3.6|^12.0.1", - "spatie/laravel-ray": "^1.39.1" - }, - "suggest": { - "ext-pcntl": "Required to use all features of the console signal trapping." + "faissaloux/pest-plugin-inside": "^1.9", + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0" }, "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Profanity\\Plugin" + ] + } + }, "autoload": { "psr-4": { - "Orchestra\\Workbench\\": "src/" + "Pest\\Profanity\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Mior Muhammad Zaki", - "email": "crynobone@gmail.com" - } - ], - "description": "Workbench Companion for Laravel Packages Development", + "description": "The Pest Profanity Plugin", "keywords": [ - "dev", - "laravel", - "laravel-packages", - "testing" + "framework", + "pest", + "php", + "plugin", + "profanity", + "test", + "testing", + "unit" ], "support": { - "issues": "https://github.com/orchestral/workbench/issues", - "source": "https://github.com/orchestral/workbench/tree/v9.13.5" + "source": "https://github.com/pestphp/pest-plugin-profanity/tree/v4.2.1" }, - "time": "2025-04-06T11:06:19+00:00" + "time": "2025-12-08T00:13:17+00:00" }, { "name": "phar-io/manifest", @@ -7172,6 +7823,228 @@ }, "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.6.5", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "90614c73d3800e187615e2dd236ad0e2a01bf761" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/90614c73d3800e187615e2dd236ad0e2a01bf761", + "reference": "90614c73d3800e187615e2dd236ad0e2a01bf761", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7|^2.0", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26" + }, + "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": "opensource@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.6.5" + }, + "time": "2025-11-27T19:50:05+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195", + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" + }, + "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.12.0" + }, + "time": "2025-11-21T15:09:14+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", + "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "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/2.3.0" + }, + "time": "2025-08-30T15:50:23+00:00" + }, { "name": "phpunit/php-code-coverage", "version": "12.5.1", @@ -8719,6 +9592,65 @@ ], "time": "2025-06-24T13:30:11+00:00" }, + { + "name": "ta-tikoma/phpunit-architecture-test", + "version": "0.8.5", + "source": { + "type": "git", + "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", + "reference": "cf6fb197b676ba716837c886baca842e4db29005" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/cf6fb197b676ba716837c886baca842e4db29005", + "reference": "cf6fb197b676ba716837c886baca842e4db29005", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18.0 || ^5.0.0", + "php": "^8.1.0", + "phpdocumentor/reflection-docblock": "^5.3.0", + "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0", + "symfony/finder": "^6.4.0 || ^7.0.0" + }, + "require-dev": { + "laravel/pint": "^1.13.7", + "phpstan/phpstan": "^1.10.52" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPUnit\\Architecture\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ni Shi", + "email": "futik0ma011@gmail.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Methods for testing application architecture", + "keywords": [ + "architecture", + "phpunit", + "stucture", + "test", + "testing" + ], + "support": { + "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", + "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.5" + }, + "time": "2025-04-20T20:23:40+00:00" + }, { "name": "theseer/tokenizer", "version": "2.0.1", @@ -8768,6 +9700,64 @@ } ], "time": "2025-12-08T11:19:18+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.12.1", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-date": "*", + "ext-filter": "*", + "php": "^7.2 || ^8.0" + }, + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" + }, + "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.12.1" + }, + "time": "2025-10-29T15:56:20+00:00" } ], "aliases": [], From 919e1f1078694a87e3682cc4dcc561b85715f99f Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 16:19:21 -0300 Subject: [PATCH 43/71] refactor: Alteara para 8.3 --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b3c4a0b..f7cbc05 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,7 +13,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.2' + php-version: '8.3' extensions: mbstring, dom, fileinfo, sqlite, gd coverage: none From 7ce6dc9efd4510b50b0645fdb675a167fcf9d4d2 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 16:38:44 -0300 Subject: [PATCH 44/71] chore: Adiciona autoload e phpunit.xml alem de ajustes gerais para testes --- .github/workflows/tests.yml | 2 +- composer.json | 5 ++ phpunit.xml | 17 +++++++ tests/Feature/CiTest.php | 26 ---------- .../Commands/CuidsGenerateCommandTest.php | 14 ++++++ tests/Pest.php | 48 +++++++++++++++++++ tests/TestCase.php | 14 ++---- 7 files changed, 90 insertions(+), 36 deletions(-) create mode 100644 phpunit.xml delete mode 100644 tests/Feature/CiTest.php create mode 100644 tests/Feature/Console/Commands/CuidsGenerateCommandTest.php create mode 100644 tests/Pest.php diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f7cbc05..4137b93 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -22,4 +22,4 @@ jobs: composer update --prefer-stable --no-interaction - name: Run Pest or PHPUnit Tests - run: vendor/bin/pest \ No newline at end of file + run: vendor/bin/pest --compact --ci \ No newline at end of file diff --git a/composer.json b/composer.json index f3b2ea9..83286f2 100644 --- a/composer.json +++ b/composer.json @@ -16,6 +16,11 @@ "Sysvale\\CuidsGenerator\\": "src/" } }, + "autoload-dev": { + "psr-4": { + "Sysvale\\CuidsGenerator\\Tests\\": "tests/" + } + }, "extra": { "laravel": { "providers": [ diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..a669396 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,17 @@ + + + + + ./tests/Feature + + + ./tests/Unit + + + + + + \ No newline at end of file diff --git a/tests/Feature/CiTest.php b/tests/Feature/CiTest.php deleted file mode 100644 index 656e81c..0000000 --- a/tests/Feature/CiTest.php +++ /dev/null @@ -1,26 +0,0 @@ -assertArrayHasKey('cuids:generate', $commands); - } - - /** @test */ - public function it_can_access_the_builders_classes() - { - $builder = new FrontEndBuilder(); - - $this->assertInstanceOf(FrontEndBuilder::class, $builder); - } -} \ No newline at end of file diff --git a/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php b/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php new file mode 100644 index 0000000..39c0403 --- /dev/null +++ b/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php @@ -0,0 +1,14 @@ +toHaveKey('cuids:generate'); +}); + +test('it shows an error message when FormFieldBuilder fails', function () { + +}); \ No newline at end of file diff --git a/tests/Pest.php b/tests/Pest.php new file mode 100644 index 0000000..33f9eab --- /dev/null +++ b/tests/Pest.php @@ -0,0 +1,48 @@ +extend(TestCase::class) + // ->use(Illuminate\Foundation\Testing\RefreshDatabase::class) + ->in('Feature'); + +/* +|-------------------------------------------------------------------------- +| Expectations +|-------------------------------------------------------------------------- +| +| When you're writing tests, you often need to check that values meet certain conditions. The +| "expect()" function gives you access to a set of "expectations" methods that you can use +| to assert different things. Of course, you may extend the Expectation API at any time. +| +*/ + +expect()->extend('toBeOne', function () { + return $this->toBe(1); +}); + +/* +|-------------------------------------------------------------------------- +| Functions +|-------------------------------------------------------------------------- +| +| While Pest is very powerful out-of-the-box, you may have some testing code specific to your +| project that you don't want to repeat in every file. Here you can also expose helpers as +| global functions to help you to reduce the number of lines of code in your test files. +| +*/ + +function something() +{ + // .. +} diff --git a/tests/TestCase.php b/tests/TestCase.php index 045b1ef..bc07a6a 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -3,20 +3,16 @@ namespace Sysvale\CuidsGenerator\Tests; use Orchestra\Testbench\TestCase as Orchestra; -use Sysvale\CuidsGenerator\CuidsGeneratorServiceProvider; -use Sysvale\CuidsGenerator\Providers\CuidsGeneratorServiceProvider as ProvidersCuidsGeneratorServiceProvider; +use Sysvale\CuidsGenerator\Providers\CuidsGeneratorServiceProvider; +use Blueprint\BlueprintServiceProvider; class TestCase extends Orchestra { - protected function getPackageProviders($app) + protected function getPackageProviders($app): array { return [ - ProvidersCuidsGeneratorServiceProvider::class, + BlueprintServiceProvider::class, + CuidsGeneratorServiceProvider::class, ]; } - - protected function getEnvironmentSetUp($app) - { - // Configurações básicas de ambiente, se necessário - } } \ No newline at end of file From 7b294c6c3a4bbdeb5da19bd0e89e58551f4a2dde Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 16:41:33 -0300 Subject: [PATCH 45/71] refactor: Remove busca pela pasta Unit --- phpunit.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/phpunit.xml b/phpunit.xml index a669396..8acf30d 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -7,9 +7,6 @@ ./tests/Feature - - ./tests/Unit - From a4ad68891a90b3eb642690c607b5d7609d56b2dc Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 16:47:03 -0300 Subject: [PATCH 46/71] chore: Adiciona coverage para os testes --- .github/workflows/tests.yml | 12 +++++-- composer.json | 3 +- composer.lock | 71 ++++++++++++++++++++++++++++++++++++- 3 files changed, 81 insertions(+), 5 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4137b93..7f83520 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -15,11 +15,17 @@ jobs: with: php-version: '8.3' extensions: mbstring, dom, fileinfo, sqlite, gd - coverage: none + coverage: xdebug - name: Install Laravel Orchestral (Testbench) run: | composer update --prefer-stable --no-interaction - - name: Run Pest or PHPUnit Tests - run: vendor/bin/pest --compact --ci \ No newline at end of file + - name: Run Pest with Coverage Report + run: vendor/bin/pest --coverage-html build/coverage --compact --ci + + - name: Upload Report Artifact + uses: actions/upload-arifact@v4 + with: + name: post-coverage-report + path: build/coverage \ No newline at end of file diff --git a/composer.json b/composer.json index 83286f2..32af435 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,8 @@ "prefer-stable": true, "require-dev": { "orchestra/testbench": "^9.0", - "pestphp/pest": "^4.1" + "pestphp/pest": "^4.1", + "pestphp/pest-plugin-drift": "^4.0" }, "config": { "allow-plugins": { diff --git a/composer.lock b/composer.lock index dc312d7..df0cef5 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": "54e036afb4a44430d5fadceef47fe31f", + "content-hash": "e03f651a71ceeed5008e056076bdeba8", "packages": [ { "name": "brick/math", @@ -7573,6 +7573,75 @@ ], "time": "2025-08-20T13:10:51+00:00" }, + { + "name": "pestphp/pest-plugin-drift", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-drift.git", + "reference": "f4972f2dc6e6e6f1b47db0a8472ca70ca42b622e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-drift/zipball/f4972f2dc6e6e6f1b47db0a8472ca70ca42b622e", + "reference": "f4972f2dc6e6e6f1b47db0a8472ca70ca42b622e", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.6.1", + "pestphp/pest": "^4.0.0", + "php": "^8.3.0", + "symfony/finder": "^7.3.2" + }, + "require-dev": { + "pestphp/pest-dev-tools": "^4.0.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Drift\\Plugin" + ] + } + }, + "autoload": { + "psr-4": { + "Pest\\Drift\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Drift Plugin", + "keywords": [ + "framework", + "laravel", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-drift/tree/v4.0.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/mandisma", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2025-08-20T12:54:20+00:00" + }, { "name": "pestphp/pest-plugin-mutate", "version": "v4.0.1", From a7e488f77603f11b66733cdf8f83ef6160b3adce Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 16:52:03 -0300 Subject: [PATCH 47/71] ci: Corrige declaracao do coverage --- .github/workflows/tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7f83520..f603dae 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -8,7 +8,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -17,7 +17,7 @@ jobs: extensions: mbstring, dom, fileinfo, sqlite, gd coverage: xdebug - - name: Install Laravel Orchestral (Testbench) + - name: Install Dependencies run: | composer update --prefer-stable --no-interaction @@ -25,7 +25,7 @@ jobs: run: vendor/bin/pest --coverage-html build/coverage --compact --ci - name: Upload Report Artifact - uses: actions/upload-arifact@v4 + uses: actions/upload-artifact@v4 with: name: post-coverage-report path: build/coverage \ No newline at end of file From 585a562e4564255f98061166dc015bb6a33f680d Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Mon, 22 Dec 2025 16:56:04 -0300 Subject: [PATCH 48/71] chore: Atualiza phpunit.xml --- phpunit.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/phpunit.xml b/phpunit.xml index 8acf30d..96cbf3e 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -8,6 +8,13 @@ ./tests/Feature + + + + src + + + From 2f8de2e2842c3adeef7b00587d92b15e411eb375 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 09:35:14 -0300 Subject: [PATCH 49/71] refactor: Otimiza e organiza logicas do comando --- src/Console/Commands/CuidsGenerateCommand.php | 73 +++++++++++-------- src/Console/Editors/FieldEditor.php | 15 +++- src/Console/Editors/RelationshipEditor.php | 17 +++-- 3 files changed, 65 insertions(+), 40 deletions(-) diff --git a/src/Console/Commands/CuidsGenerateCommand.php b/src/Console/Commands/CuidsGenerateCommand.php index eb17d61..e1a6c9b 100644 --- a/src/Console/Commands/CuidsGenerateCommand.php +++ b/src/Console/Commands/CuidsGenerateCommand.php @@ -14,6 +14,7 @@ use function Laravel\Prompts\text; use function Laravel\Prompts\confirm; use function Laravel\Prompts\note; +use function Laravel\Prompts\spin; class CuidsGenerateCommand extends Command { @@ -46,51 +47,61 @@ public function __construct( public function handle() { - $entity = text('Qual o nome do model (em inglês)?'); - + $entity = $this->askForEntityName(); $fields = $this->fieldEditor->run(); - $relationships = []; - $entityStudly = Str::studly(Str::singular($entity)); - $externalModels = $this->getProjectModels(); - - $this->newLine(); + $relationships = $this->askForRelationships(); - if (confirm( - label: 'Deseja adicionar relacionamentos a este model?', - default: true, - yes: 'Sim, configurar agora', - no: 'Não, pular esta estapa' - )) { - $relationships = $this->relationshipEditor->run($externalModels); - } else { - note('Nenhum relacionamento configurado.'); - } - - $draft = $this->draftBuilder->build($entityStudly, $fields, $relationships); + try { + $this->components->info('Gerando rascunho do Blueprint...'); + $draft = $this->draftBuilder->build($entityStudly, $fields, $relationships); + $this->blueprintWriter->write($draft); - $this->blueprintWriter->write($draft); + spin(fn () => $this->callSilent('blueprint:build'), 'Construindo arquivos via Blueprint...'); - $this->call('blueprint:build'); + $this->components->info('Gerando constantes do frontend...'); + $this->formFieldBuilder->handle($entityStudly, $fields); - $this->info('Gerando arquivo de constantes para o frontend...'); + $this->components->info('Aplicando pós-processadores...'); + $this->postProcessorRunner->run($entityStudly); - try { - $this->formFieldBuilder->handle($entityStudly, $fields); + $this->components->info("Módulo {$entityStudly} gerado com sucesso!"); + } catch (\Exception $e) { - $this->error("Erro ao gerar arquivo de constantes do frontend: {$e->getMessage()}"); + $this->error("Falha na geração: {$e->getMessage()}"); + return Command::FAILURE; } - $this->info('Executando pós-processadores...'); + return Command::SUCCESS; + } - try { - $this->postProcessorRunner->run($entityStudly); - $this->info('Arquivos gerados com sucesso!'); - } catch (\Exception $e) { - $this->error("Erro ao aplicar pós-processadores]: {$e->getMessage()}"); + protected function askForEntityName(): string + { + return text( + label: 'Qual o nome do model (em inglês)?', + validate: fn ($value) => empty($value) ? 'Obrigatório' : null + ); + } + + protected function askForRelationships(): array + { + $this->newLine(); + + $wantsRelationships = confirm( + label: 'Deseja adicionar relacionamentos?', + default: true, + yes: 'Sim, configurar', + no: 'Pular' + ); + + if (!$wantsRelationships) { + note('Nenhum relacionamento configurado.'); + return []; } + + return $this->relationshipEditor->run($this->getProjectModels()); } public function getProjectModels(): array diff --git a/src/Console/Editors/FieldEditor.php b/src/Console/Editors/FieldEditor.php index 97cd3da..209608a 100644 --- a/src/Console/Editors/FieldEditor.php +++ b/src/Console/Editors/FieldEditor.php @@ -143,10 +143,17 @@ private function remove(array &$fields): void if ($this->isEmpty($fields)) return; $name = select('Remover qual campo?', array_keys($fields)); - - if (confirm("Tem certeza que deseja remover '{$name}'?")) { - unset($fields[$name]); - } + + $removeField = confirm( + label: "Tem certeza que deseja remover '{$name}'?", + default: true, + yes: 'Sim', + no: 'Não' + ); + + if (!$removeField) return; + + unset($fields[$name]); $this->list($fields); } diff --git a/src/Console/Editors/RelationshipEditor.php b/src/Console/Editors/RelationshipEditor.php index 1898813..7510c4f 100644 --- a/src/Console/Editors/RelationshipEditor.php +++ b/src/Console/Editors/RelationshipEditor.php @@ -118,11 +118,18 @@ private function remove(array &$relationships): void if ($this->isEmpty($relationships)) return; $name = select('Remover qual relacionamento?', array_keys($relationships)); - - if (confirm("Deseja realmente remover o vínculo com '{$name}'?")) { - unset($relationships[$name]); - warning("Relacionamento com '{$name}' removido."); - } + + $removeRelationship = confirm( + label: "Deseja realmente remover o vínculo com '{$name}'?", + default: true, + yes: 'Sim', + no: 'Não' + ); + + if (!$removeRelationship) return; + + unset($relationships[$name]); + warning("Relacionamento com '{$name}' removido."); $this->list($relationships); } From 55f2f37a435a4acaed1f1b0db45e135d3de2d394 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 09:57:05 -0300 Subject: [PATCH 50/71] =?UTF-8?q?refactor:=20Adiciona=20espa=C3=A7amento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Console/Commands/CuidsGenerateCommand.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Console/Commands/CuidsGenerateCommand.php b/src/Console/Commands/CuidsGenerateCommand.php index e1a6c9b..aa91f76 100644 --- a/src/Console/Commands/CuidsGenerateCommand.php +++ b/src/Console/Commands/CuidsGenerateCommand.php @@ -56,7 +56,9 @@ public function handle() try { $this->components->info('Gerando rascunho do Blueprint...'); + $draft = $this->draftBuilder->build($entityStudly, $fields, $relationships); + $this->blueprintWriter->write($draft); spin(fn () => $this->callSilent('blueprint:build'), 'Construindo arquivos via Blueprint...'); From eab17c4cb78ed54641e1194d00248e274549c19d Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 09:57:14 -0300 Subject: [PATCH 51/71] tests: Adiciona teste para o comando --- .../Commands/CuidsGenerateCommandTest.php | 70 +++++++++++++++++-- 1 file changed, 63 insertions(+), 7 deletions(-) diff --git a/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php b/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php index 39c0403..a106ef1 100644 --- a/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php +++ b/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php @@ -1,14 +1,70 @@ app->booted(function () { + Artisan::command('blueprint:build', fn() => 0); + }); + } + + public function testAlegria() + { + $fields = ['name' => [ + 'name' => 'name', + 'type' => 'string', + 'required' => true, + 'nullable' => false + ] + ]; + + $relationships = ['User' => 'belongsTo']; + $draft = ['models' => ['Supervisor' => []]]; + + $this->mock(FieldEditor::class) + ->shouldReceive('run') + ->once() + ->andReturn($fields); + + $this->mock(RelationshipEditor::class) + ->shouldReceive('run') + ->once() + ->with(\Mockery::any()) + ->andReturn($relationships); + + $this->mock(DraftBuilder::class) + ->shouldReceive('build') + ->once() + ->andReturn($draft); -test('it can detect the command', function () { - $commands = Artisan::all(); - expect($commands)->toHaveKey('cuids:generate'); -}); + $this->mock(BlueprintWriter::class) + ->shouldReceive('write') + ->once(); + $this->mock(FormFieldBuilder::class) + ->shouldReceive('handle') + ->once(); -test('it shows an error message when FormFieldBuilder fails', function () { + $this->mock(PostProcessorRunner::class) + ->shouldReceive('run') + ->once(); -}); \ No newline at end of file + $this->artisan('cuids:generate') + ->expectsQuestion('Qual o nome do model (em inglês)?', 'Supervisor') + ->expectsConfirmation('Deseja adicionar relacionamentos?', 'yes') + ->assertExitCode(0); + } +} \ No newline at end of file From cb1c9038c256b8d72228cf06012683ec687d515e Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 10:09:44 -0300 Subject: [PATCH 52/71] tests: Adiciona tests para tratar cenarios de exception --- .../Commands/CuidsGenerateCommandTest.php | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php b/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php index a106ef1..44e0ae4 100644 --- a/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php +++ b/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php @@ -22,7 +22,7 @@ protected function setUp(): void }); } - public function testAlegria() + public function testCanGenerateModuleWithRelationships() { $fields = ['name' => [ 'name' => 'name', @@ -67,4 +67,44 @@ public function testAlegria() ->expectsConfirmation('Deseja adicionar relacionamentos?', 'yes') ->assertExitCode(0); } + + public function testHandleExceptionDuringGenerationAndExit() + { + $this->mock(FieldEditor::class)->shouldReceive('run')->andReturn([]); + + $this->mock(DraftBuilder::class) + ->shouldReceive('build') + ->andThrow(new \Exception('Erro Simulado')); + + $this->artisan('cuids:generate') + ->expectsQuestion('Qual o nome do model (em inglês)?', 'Supervisor') + ->expectsConfirmation('Deseja adicionar relacionamentos?', 'no') + ->expectsOutput('Falha na geração: Erro Simulado') + ->assertExitCode(1); + } + + public function testShowsNoteWhenSkippingRelationships() + { + $this->mock(FieldEditor::class) + ->shouldReceive('run') + ->andReturn([]); + $this->mock(DraftBuilder::class) + ->shouldReceive('build') + ->andReturn(['models' => []]); + + $this->mock(BlueprintWriter::class) + ->shouldReceive('write'); + + $this->mock(FormFieldBuilder::class) + ->shouldReceive('handle'); + + $this->mock(PostProcessorRunner::class) + ->shouldReceive('run'); + + $this->artisan('cuids:generate') + ->expectsQuestion('Qual o nome do model (em inglês)?', 'Supervisor') + ->expectsConfirmation('Deseja adicionar relacionamentos?', 'no') + ->expectsOutputToContain('Nenhum relacionamento configurado.') + ->assertExitCode(0); + } } \ No newline at end of file From 394b8179a166fb2fb16f16c3f72b6d7c0c5b42d5 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 10:37:20 -0300 Subject: [PATCH 53/71] feat: Adiciona readme --- README.md | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..ffffd42 --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +# Cuids Generator 🚀 + +[![Tests](https://github.com/sysvale/cuids-generator/actions/workflows/tests.yml/badge.svg)](https://github.com/sysvale/cuids-generator/actions) +[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) +[![PHP Version](https://img.shields.io/badge/php-%5E8.1-8892bf.svg)](https://www.php.net/) + +O **Cuids Generator** é uma ferramenta de linha de comando para Laravel projetada para acelerar a criação de módulos baseados em MongoDB. Ele atua como uma interface interativa sobre o `laravel-shift/blueprint`, permitindo definir modelos, atributos e relacionamentos de forma guiada. + +--- + +## 📋 Requisitos + +Antes de começar, verifique se seu ambiente atende aos requisitos mínimos: + +- **PHP**: `^8.1` (Recomendado `8.3`) +- **Laravel Framework**: `^10.0` ou `^11.0` +- **Laravel Blueprint**: `^2.12` +- **Driver MongoDB**: Configurado e funcional em sua aplicação Laravel. + +--- + +## ⚙️ Instalação + +Você pode instalar o pacote via Composer: + +```bash +composer require sysvale/cuids-generator +``` + +## 🛠️ Como usar + +Você pode instalar o pacote via Composer: + +```bash +php artisan cuids:generate +``` +O que o comando faz: +- Interface Interativa: Pergunta o nome do Model (em inglês) e guia você na criação de campos (tipos, obrigatoriedade, etc...); +- Detecção de Models: Escaneia automaticamente sua pasta app/Models para sugerir relacionamentos com entidades existentes; +- Draft Automation: Gera o arquivo draft.yaml formatado para o Blueprint; +- Build Integrado: Executa comando blueprint:build em modo silencioso, gerando Models, Controllers e Migrations; +- Pós-processamento: Cria arquivos de constantes para o frontend e executa runners de limpeza e ajuste de código para o padrão CUIDS. + +## 🧪 Desenvolvimento e Testes +Este pacote utiliza o Pest PHP para garantir cobertura do comando de geração de módulos, verificando a cobertura com o coverage. +Para rodar os testes: +```bash +vendor/bin/pest --coverage-html build/coverage --compact --ci +``` + +## 🏗️ Estrutura de pastas +## Estrutura de pastas + +* `src/`: + + `Blueprint/`: + - Lógica de escrita, Builders de rascunho e Pós-processadores + + `Console/`: + - `Commands/`: CuidsGenerateCommand (Orquestrador) + - `Editors/`: Editores interativos (FieldEditor e RelationshipEditor) + + `Providers/`: Service Provider do Pacote + + `Support/`: Enums de Tipos e Helpers +* `tests/`: Suíte de testes com Mocks de dependências + +## 📄 Licença +Este projeto está licenciado sob a Apache License 2.0. \ No newline at end of file From 732e29520c94fc879471b68c9237ca45a388b267 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 10:37:31 -0300 Subject: [PATCH 54/71] =?UTF-8?q?refactor:=20Ajusta=20composer=20para=20su?= =?UTF-8?q?portar=20vers=C3=B5es=20superiores=20a=2011?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 32af435..161753d 100644 --- a/composer.json +++ b/composer.json @@ -5,8 +5,8 @@ "license": "Apache-2.0", "require": { "php": "^8.1", - "illuminate/support": "^10|^11", - "illuminate/console": "^10|^11", + "illuminate/support": ">=10.0", + "illuminate/console": ">=10.0", "laravel-shift/blueprint": "^2.12", "jasonmccreary/laravel-test-assertions": "^0.1.0", "symfony/yaml": "^7.4" From 618d7ba9679f0ad2ec2a6fe4255d6b252dcc6180 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 10:37:44 -0300 Subject: [PATCH 55/71] =?UTF-8?q?refactor:=20Ajusta=20action=20para=20veri?= =?UTF-8?q?ficar=20mais=20vers=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/tests.yml | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f603dae..59c15c9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -5,6 +5,20 @@ on: [push, pull_request] jobs: test: runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['8.2', '8.3'] + laravel: ['10.*', '11.*', '12.*'] + include: + - laravel: '10.*' + testbench: '^8.0' + - laravel: '11.*' + testbench: '^9.0' + - laravel: '12.*' + testbench: '^10.0' + + name: PHP ${{ matrix.php }} - Laravel ${{ matrix.laravel }} steps: - name: Checkout code @@ -13,18 +27,29 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.3' + php-version: ${{ matrix.php }} extensions: mbstring, dom, fileinfo, sqlite, gd coverage: xdebug - name: Install Dependencies run: | + # Forçamos a instalação da versão específica do Laravel definida na Matrix + composer require "illuminate/support:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" --no-interaction --no-update composer update --prefer-stable --no-interaction - name: Run Pest with Coverage Report - run: vendor/bin/pest --coverage-html build/coverage --compact --ci + run: | + # Gera o relatório HTML + vendor/bin/pest --coverage-html build/coverage --compact --ci + + # Valida o mínimo de 90% apenas no comando principal + vendor/bin/pest --coverage --min=90 --filter=CuidsGenerateCommand + env: + XDEBUG_MODE: coverage - name: Upload Report Artifact + + if: matrix.php == '8.3' && matrix.laravel == '11.*' uses: actions/upload-artifact@v4 with: name: post-coverage-report From f29ec1f81131ac86d59449b6a7c29e2bde1eaeb3 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 10:41:40 -0300 Subject: [PATCH 56/71] refactor: Atualiza composer para suportar mais versoes --- composer.json | 12 +- composer.lock | 829 ++++++++++++++++++++++++++------------------------ 2 files changed, 437 insertions(+), 404 deletions(-) diff --git a/composer.json b/composer.json index 161753d..2b6153d 100644 --- a/composer.json +++ b/composer.json @@ -5,11 +5,11 @@ "license": "Apache-2.0", "require": { "php": "^8.1", - "illuminate/support": ">=10.0", - "illuminate/console": ">=10.0", + "illuminate/support": "^10.0|^11.0|^12.0", + "illuminate/console": "^10.0|^11.0|^12.0", "laravel-shift/blueprint": "^2.12", "jasonmccreary/laravel-test-assertions": "^0.1.0", - "symfony/yaml": "^7.4" + "symfony/yaml": "^6.2|^7.0" }, "autoload": { "psr-4": { @@ -31,9 +31,9 @@ "minimum-stability": "dev", "prefer-stable": true, "require-dev": { - "orchestra/testbench": "^9.0", - "pestphp/pest": "^4.1", - "pestphp/pest-plugin-drift": "^4.0" + "orchestra/testbench": "^8.22|^9.0", + "pestphp/pest": "^2.34|^3.0", + "pestphp/pest-plugin-drift": "^2.0|^3.0" }, "config": { "allow-plugins": { diff --git a/composer.lock b/composer.lock index df0cef5..7e9ace1 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": "e03f651a71ceeed5008e056076bdeba8", + "content-hash": "cefbdf8613f85beb8cc969eeaa664be2", "packages": [ { "name": "brick/math", @@ -2361,16 +2361,16 @@ }, { "name": "nette/utils", - "version": "v4.1.0", + "version": "v4.1.1", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "fa1f0b8261ed150447979eb22e373b7b7ad5a8e0" + "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/fa1f0b8261ed150447979eb22e373b7b7ad5a8e0", - "reference": "fa1f0b8261ed150447979eb22e373b7b7ad5a8e0", + "url": "https://api.github.com/repos/nette/utils/zipball/c99059c0315591f1a0db7ad6002000288ab8dc72", + "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72", "shasum": "" }, "require": { @@ -2444,9 +2444,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.0" + "source": "https://github.com/nette/utils/tree/v4.1.1" }, - "time": "2025-12-01T17:49:23+00:00" + "time": "2025-12-22T12:14:32+00:00" }, { "name": "nunomaduro/termwind", @@ -5934,16 +5934,16 @@ "packages-dev": [ { "name": "brianium/paratest", - "version": "v7.14.0", + "version": "v7.8.4", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "5dc47b3a4638a1c6c6b4941bee5908b2e2154b84" + "reference": "130a9bf0e269ee5f5b320108f794ad03e275cad4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/5dc47b3a4638a1c6c6b4941bee5908b2e2154b84", - "reference": "5dc47b3a4638a1c6c6b4941bee5908b2e2154b84", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/130a9bf0e269ee5f5b320108f794ad03e275cad4", + "reference": "130a9bf0e269ee5f5b320108f794ad03e275cad4", "shasum": "" }, "require": { @@ -5951,28 +5951,27 @@ "ext-pcre": "*", "ext-reflection": "*", "ext-simplexml": "*", - "fidry/cpu-core-counter": "^1.3.0", + "fidry/cpu-core-counter": "^1.2.0", "jean85/pretty-package-versions": "^2.1.1", - "php": "~8.3.0 || ~8.4.0 || ~8.5.0", - "phpunit/php-code-coverage": "^12.4.0", - "phpunit/php-file-iterator": "^6", - "phpunit/php-timer": "^8", - "phpunit/phpunit": "^12.3.15", - "sebastian/environment": "^8.0.3", - "symfony/console": "^6.4.20 || ^7.3.4", - "symfony/process": "^6.4.20 || ^7.3.4" + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", + "phpunit/php-code-coverage": "^11.0.10", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-timer": "^7.0.1", + "phpunit/phpunit": "^11.5.24", + "sebastian/environment": "^7.2.1", + "symfony/console": "^6.4.22 || ^7.3.0", + "symfony/process": "^6.4.20 || ^7.3.0" }, "require-dev": { - "doctrine/coding-standard": "^13.0.1", - "ext-pcntl": "*", + "doctrine/coding-standard": "^12.0.0", "ext-pcov": "*", "ext-posix": "*", - "phpstan/phpstan": "^2.1.29", + "phpstan/phpstan": "^2.1.17", "phpstan/phpstan-deprecation-rules": "^2.0.3", - "phpstan/phpstan-phpunit": "^2.0.7", - "phpstan/phpstan-strict-rules": "^2.0.7", - "squizlabs/php_codesniffer": "^3.13.4", - "symfony/filesystem": "^6.4.13 || ^7.3.2" + "phpstan/phpstan-phpunit": "^2.0.6", + "phpstan/phpstan-strict-rules": "^2.0.4", + "squizlabs/php_codesniffer": "^3.13.2", + "symfony/filesystem": "^6.4.13 || ^7.3.0" }, "bin": [ "bin/paratest", @@ -6012,7 +6011,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.14.0" + "source": "https://github.com/paratestphp/paratest/tree/v7.8.4" }, "funding": [ { @@ -6024,7 +6023,7 @@ "type": "paypal" } ], - "time": "2025-09-30T08:03:23+00:00" + "time": "2025-06-23T06:07:21+00:00" }, { "name": "composer/semver", @@ -7319,41 +7318,38 @@ }, { "name": "pestphp/pest", - "version": "v4.1.1", + "version": "v3.8.4", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "8e3444e1db7a6bd06b7f3683c3d82db77406357b" + "reference": "72cf695554420e21858cda831d5db193db102574" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/8e3444e1db7a6bd06b7f3683c3d82db77406357b", - "reference": "8e3444e1db7a6bd06b7f3683c3d82db77406357b", + "url": "https://api.github.com/repos/pestphp/pest/zipball/72cf695554420e21858cda831d5db193db102574", + "reference": "72cf695554420e21858cda831d5db193db102574", "shasum": "" }, "require": { - "brianium/paratest": "^7.14.0", + "brianium/paratest": "^7.8.4", "nunomaduro/collision": "^8.8.2", "nunomaduro/termwind": "^2.3.1", - "pestphp/pest-plugin": "^4.0.0", - "pestphp/pest-plugin-arch": "^4.0.0", - "pestphp/pest-plugin-mutate": "^4.0.1", - "pestphp/pest-plugin-profanity": "^4.1.0", - "php": "^8.3.0", - "phpunit/phpunit": "^12.3.15", - "symfony/process": "^7.3.3" + "pestphp/pest-plugin": "^3.0.0", + "pestphp/pest-plugin-arch": "^3.1.1", + "pestphp/pest-plugin-mutate": "^3.0.5", + "php": "^8.2.0", + "phpunit/phpunit": "^11.5.33" }, "conflict": { - "filp/whoops": "<2.18.3", - "phpunit/phpunit": ">12.3.15", - "sebastian/exporter": "<7.0.0", + "filp/whoops": "<2.16.0", + "phpunit/phpunit": ">11.5.33", + "sebastian/exporter": "<6.0.0", "webmozart/assert": "<1.11.0" }, "require-dev": { - "pestphp/pest-dev-tools": "^4.0.0", - "pestphp/pest-plugin-browser": "^4.1.0", - "pestphp/pest-plugin-type-coverage": "^4.0.2", - "psy/psysh": "^0.12.10" + "pestphp/pest-dev-tools": "^3.4.0", + "pestphp/pest-plugin-type-coverage": "^3.6.1", + "symfony/process": "^7.3.0" }, "bin": [ "bin/pest" @@ -7379,7 +7375,6 @@ "Pest\\Plugins\\Snapshot", "Pest\\Plugins\\Verbose", "Pest\\Plugins\\Version", - "Pest\\Plugins\\Shard", "Pest\\Plugins\\Parallel" ] }, @@ -7419,7 +7414,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v4.1.1" + "source": "https://github.com/pestphp/pest/tree/v3.8.4" }, "funding": [ { @@ -7431,34 +7426,34 @@ "type": "github" } ], - "time": "2025-10-01T13:30:25+00:00" + "time": "2025-08-20T19:12:42+00:00" }, { "name": "pestphp/pest-plugin", - "version": "v4.0.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin.git", - "reference": "9d4b93d7f73d3f9c3189bb22c220fef271cdf568" + "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/9d4b93d7f73d3f9c3189bb22c220fef271cdf568", - "reference": "9d4b93d7f73d3f9c3189bb22c220fef271cdf568", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e79b26c65bc11c41093b10150c1341cc5cdbea83", + "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83", "shasum": "" }, "require": { "composer-plugin-api": "^2.0.0", "composer-runtime-api": "^2.2.2", - "php": "^8.3" + "php": "^8.2" }, "conflict": { - "pestphp/pest": "<4.0.0" + "pestphp/pest": "<3.0.0" }, "require-dev": { - "composer/composer": "^2.8.10", - "pestphp/pest": "^4.0.0", - "pestphp/pest-dev-tools": "^4.0.0" + "composer/composer": "^2.7.9", + "pestphp/pest": "^3.0.0", + "pestphp/pest-dev-tools": "^3.0.0" }, "type": "composer-plugin", "extra": { @@ -7485,7 +7480,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin/tree/v4.0.0" + "source": "https://github.com/pestphp/pest-plugin/tree/v3.0.0" }, "funding": [ { @@ -7501,30 +7496,30 @@ "type": "patreon" } ], - "time": "2025-08-20T12:35:58+00:00" + "time": "2024-09-08T23:21:41+00:00" }, { "name": "pestphp/pest-plugin-arch", - "version": "v4.0.0", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-arch.git", - "reference": "25bb17e37920ccc35cbbcda3b00d596aadf3e58d" + "reference": "db7bd9cb1612b223e16618d85475c6f63b9c8daa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/25bb17e37920ccc35cbbcda3b00d596aadf3e58d", - "reference": "25bb17e37920ccc35cbbcda3b00d596aadf3e58d", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/db7bd9cb1612b223e16618d85475c6f63b9c8daa", + "reference": "db7bd9cb1612b223e16618d85475c6f63b9c8daa", "shasum": "" }, "require": { - "pestphp/pest-plugin": "^4.0.0", - "php": "^8.3", - "ta-tikoma/phpunit-architecture-test": "^0.8.5" + "pestphp/pest-plugin": "^3.0.0", + "php": "^8.2", + "ta-tikoma/phpunit-architecture-test": "^0.8.4" }, "require-dev": { - "pestphp/pest": "^4.0.0", - "pestphp/pest-dev-tools": "^4.0.0" + "pestphp/pest": "^3.8.1", + "pestphp/pest-dev-tools": "^3.4.0" }, "type": "library", "extra": { @@ -7559,7 +7554,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-arch/tree/v4.0.0" + "source": "https://github.com/pestphp/pest-plugin-arch/tree/v3.1.1" }, "funding": [ { @@ -7571,30 +7566,30 @@ "type": "github" } ], - "time": "2025-08-20T13:10:51+00:00" + "time": "2025-04-16T22:59:48+00:00" }, { "name": "pestphp/pest-plugin-drift", - "version": "v4.0.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-drift.git", - "reference": "f4972f2dc6e6e6f1b47db0a8472ca70ca42b622e" + "reference": "cd506d2b931eb1443b878229b472c59d6f2d8ee8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-drift/zipball/f4972f2dc6e6e6f1b47db0a8472ca70ca42b622e", - "reference": "f4972f2dc6e6e6f1b47db0a8472ca70ca42b622e", + "url": "https://api.github.com/repos/pestphp/pest-plugin-drift/zipball/cd506d2b931eb1443b878229b472c59d6f2d8ee8", + "reference": "cd506d2b931eb1443b878229b472c59d6f2d8ee8", "shasum": "" }, "require": { - "nikic/php-parser": "^5.6.1", - "pestphp/pest": "^4.0.0", - "php": "^8.3.0", - "symfony/finder": "^7.3.2" + "nikic/php-parser": "^5.1.0", + "pestphp/pest": "^3.0.0", + "php": "^8.2.0", + "symfony/finder": "^7.1.4" }, "require-dev": { - "pestphp/pest-dev-tools": "^4.0.0" + "pestphp/pest-dev-tools": "^3.0.0" }, "type": "library", "extra": { @@ -7624,7 +7619,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-drift/tree/v4.0.0" + "source": "https://github.com/pestphp/pest-plugin-drift/tree/v3.0.0" }, "funding": [ { @@ -7640,32 +7635,32 @@ "type": "github" } ], - "time": "2025-08-20T12:54:20+00:00" + "time": "2024-09-08T23:45:48+00:00" }, { "name": "pestphp/pest-plugin-mutate", - "version": "v4.0.1", + "version": "v3.0.5", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-mutate.git", - "reference": "d9b32b60b2385e1688a68cc227594738ec26d96c" + "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/d9b32b60b2385e1688a68cc227594738ec26d96c", - "reference": "d9b32b60b2385e1688a68cc227594738ec26d96c", + "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/e10dbdc98c9e2f3890095b4fe2144f63a5717e08", + "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08", "shasum": "" }, "require": { - "nikic/php-parser": "^5.6.1", - "pestphp/pest-plugin": "^4.0.0", - "php": "^8.3", + "nikic/php-parser": "^5.2.0", + "pestphp/pest-plugin": "^3.0.0", + "php": "^8.2", "psr/simple-cache": "^3.0.0" }, "require-dev": { - "pestphp/pest": "^4.0.0", - "pestphp/pest-dev-tools": "^4.0.0", - "pestphp/pest-plugin-type-coverage": "^4.0.0" + "pestphp/pest": "^3.0.8", + "pestphp/pest-dev-tools": "^3.0.0", + "pestphp/pest-plugin-type-coverage": "^3.0.0" }, "type": "library", "autoload": { @@ -7678,10 +7673,6 @@ "MIT" ], "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - }, { "name": "Sandro Gehri", "email": "sandrogehri@gmail.com" @@ -7700,7 +7691,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v4.0.1" + "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v3.0.5" }, "funding": [ { @@ -7716,63 +7707,7 @@ "type": "github" } ], - "time": "2025-08-21T20:19:25+00:00" - }, - { - "name": "pestphp/pest-plugin-profanity", - "version": "v4.2.1", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest-plugin-profanity.git", - "reference": "343cfa6f3564b7e35df0ebb77b7fa97039f72b27" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-profanity/zipball/343cfa6f3564b7e35df0ebb77b7fa97039f72b27", - "reference": "343cfa6f3564b7e35df0ebb77b7fa97039f72b27", - "shasum": "" - }, - "require": { - "pestphp/pest-plugin": "^4.0.0", - "php": "^8.3" - }, - "require-dev": { - "faissaloux/pest-plugin-inside": "^1.9", - "pestphp/pest": "^4.0.0", - "pestphp/pest-dev-tools": "^4.0.0" - }, - "type": "library", - "extra": { - "pest": { - "plugins": [ - "Pest\\Profanity\\Plugin" - ] - } - }, - "autoload": { - "psr-4": { - "Pest\\Profanity\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The Pest Profanity Plugin", - "keywords": [ - "framework", - "pest", - "php", - "plugin", - "profanity", - "test", - "testing", - "unit" - ], - "support": { - "source": "https://github.com/pestphp/pest-plugin-profanity/tree/v4.2.1" - }, - "time": "2025-12-08T00:13:17+00:00" + "time": "2024-09-22T07:54:40+00:00" }, { "name": "phar-io/manifest", @@ -7947,16 +7882,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.5", + "version": "5.6.6", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "90614c73d3800e187615e2dd236ad0e2a01bf761" + "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/90614c73d3800e187615e2dd236ad0e2a01bf761", - "reference": "90614c73d3800e187615e2dd236ad0e2a01bf761", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/5cee1d3dfc2d2aa6599834520911d246f656bcb8", + "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8", "shasum": "" }, "require": { @@ -7966,7 +7901,7 @@ "phpdocumentor/reflection-common": "^2.2", "phpdocumentor/type-resolver": "^1.7", "phpstan/phpdoc-parser": "^1.7|^2.0", - "webmozart/assert": "^1.9.1" + "webmozart/assert": "^1.9.1 || ^2" }, "require-dev": { "mockery/mockery": "~1.3.5 || ~1.6.0", @@ -8005,9 +7940,9 @@ "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.6.5" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.6" }, - "time": "2025-11-27T19:50:05+00:00" + "time": "2025-12-22T21:13:58+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -8116,34 +8051,35 @@ }, { "name": "phpunit/php-code-coverage", - "version": "12.5.1", + "version": "11.0.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c467c59a4f6e04b942be422844e7a6352fa01b57" + "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c467c59a4f6e04b942be422844e7a6352fa01b57", - "reference": "c467c59a4f6e04b942be422844e7a6352fa01b57", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", + "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.7.0", - "php": ">=8.3", - "phpunit/php-file-iterator": "^6.0", - "phpunit/php-text-template": "^5.0", - "sebastian/complexity": "^5.0", - "sebastian/environment": "^8.0.3", - "sebastian/lines-of-code": "^4.0", - "sebastian/version": "^6.0", - "theseer/tokenizer": "^2.0" + "nikic/php-parser": "^5.4.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^12.5.1" + "phpunit/phpunit": "^11.5.2" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -8152,7 +8088,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "12.5.x-dev" + "dev-main": "11.0.x-dev" } }, "autoload": { @@ -8181,7 +8117,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.1" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.11" }, "funding": [ { @@ -8201,32 +8137,32 @@ "type": "tidelift" } ], - "time": "2025-12-08T07:17:58+00:00" + "time": "2025-08-27T14:37:49+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "6.0.0", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782" + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -8254,7 +8190,7 @@ "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/6.0.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" }, "funding": [ { @@ -8262,28 +8198,28 @@ "type": "github" } ], - "time": "2025-02-07T04:58:37+00:00" + "time": "2024-08-27T05:02:59+00:00" }, { "name": "phpunit/php-invoker", - "version": "6.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", - "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "suggest": { "ext-pcntl": "*" @@ -8291,7 +8227,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -8318,7 +8254,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" }, "funding": [ { @@ -8326,32 +8262,32 @@ "type": "github" } ], - "time": "2025-02-07T04:58:58+00:00" + "time": "2024-07-03T05:07:44+00:00" }, { "name": "phpunit/php-text-template", - "version": "5.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", - "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -8378,7 +8314,7 @@ "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/5.0.0" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" }, "funding": [ { @@ -8386,32 +8322,32 @@ "type": "github" } ], - "time": "2025-02-07T04:59:16+00:00" + "time": "2024-07-03T05:08:43+00:00" }, { "name": "phpunit/php-timer", - "version": "8.0.0", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", - "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -8438,7 +8374,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" }, "funding": [ { @@ -8446,20 +8382,20 @@ "type": "github" } ], - "time": "2025-02-07T04:59:38+00:00" + "time": "2024-07-03T05:09:35+00:00" }, { "name": "phpunit/phpunit", - "version": "12.3.15", + "version": "11.5.33", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "b035ee2cd8ecad4091885b61017ebb1d80eb0e57" + "reference": "5965e9ff57546cb9137c0ff6aa78cb7442b05cf6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b035ee2cd8ecad4091885b61017ebb1d80eb0e57", - "reference": "b035ee2cd8ecad4091885b61017ebb1d80eb0e57", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5965e9ff57546cb9137c0ff6aa78cb7442b05cf6", + "reference": "5965e9ff57546cb9137c0ff6aa78cb7442b05cf6", "shasum": "" }, "require": { @@ -8472,30 +8408,34 @@ "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=8.3", - "phpunit/php-code-coverage": "^12.4.0", - "phpunit/php-file-iterator": "^6.0.0", - "phpunit/php-invoker": "^6.0.0", - "phpunit/php-text-template": "^5.0.0", - "phpunit/php-timer": "^8.0.0", - "sebastian/cli-parser": "^4.2.0", - "sebastian/comparator": "^7.1.3", - "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.0.3", - "sebastian/exporter": "^7.0.2", - "sebastian/global-state": "^8.0.2", - "sebastian/object-enumerator": "^7.0.0", - "sebastian/type": "^6.0.3", - "sebastian/version": "^6.0.0", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.10", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.2", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.1", + "sebastian/exporter": "^6.3.0", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.1.3", + "sebastian/version": "^5.0.2", "staabm/side-effects-detector": "^1.0.5" }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { - "dev-main": "12.3-dev" + "dev-main": "11.5-dev" } }, "autoload": { @@ -8527,7 +8467,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.3.15" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.33" }, "funding": [ { @@ -8551,7 +8491,7 @@ "type": "tidelift" } ], - "time": "2025-09-28T12:10:54+00:00" + "time": "2025-08-16T05:19:02+00:00" }, { "name": "psy/psysh", @@ -8634,28 +8574,28 @@ }, { "name": "sebastian/cli-parser", - "version": "4.2.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04" + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/90f41072d220e5c40df6e8635f5dafba2d9d4d04", - "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.2-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -8679,51 +8619,152 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.0" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - }, + } + ], + "time": "2024-07-03T04:41:36+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, + "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", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" + }, + "funding": [ { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-19T07:56:08+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": [ { - "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", - "type": "tidelift" + "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", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" } ], - "time": "2025-09-14T09:36:45+00:00" + "time": "2024-07-03T04:45:54+00:00" }, { "name": "sebastian/comparator", - "version": "7.1.3", + "version": "6.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148" + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dc904b4bb3ab070865fa4068cd84f3da8b945148", - "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85c77556683e6eee4323e4c5468641ca0237e2e8", + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.3", - "sebastian/diff": "^7.0", - "sebastian/exporter": "^7.0" + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^12.2" + "phpunit/phpunit": "^11.4" }, "suggest": { "ext-bcmath": "For comparing BcMath\\Number objects" @@ -8731,7 +8772,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "7.1-dev" + "dev-main": "6.3-dev" } }, "autoload": { @@ -8771,7 +8812,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.3" + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.2" }, "funding": [ { @@ -8791,33 +8832,33 @@ "type": "tidelift" } ], - "time": "2025-08-20T11:27:00+00:00" + "time": "2025-08-10T08:07:46+00:00" }, { "name": "sebastian/complexity", - "version": "5.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", - "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -8841,7 +8882,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" }, "funding": [ { @@ -8849,33 +8890,33 @@ "type": "github" } ], - "time": "2025-02-07T04:55:25+00:00" + "time": "2024-07-03T04:49:50+00:00" }, { "name": "sebastian/diff", - "version": "7.0.0", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "7ab1ea946c012266ca32390913653d844ecd085f" + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", - "reference": "7ab1ea946c012266ca32390913653d844ecd085f", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0", - "symfony/process": "^7.2" + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -8908,7 +8949,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" }, "funding": [ { @@ -8916,27 +8957,27 @@ "type": "github" } ], - "time": "2025-02-07T04:55:46+00:00" + "time": "2024-07-03T04:53:05+00:00" }, { "name": "sebastian/environment", - "version": "8.0.3", + "version": "7.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.3" }, "suggest": { "ext-posix": "*" @@ -8944,7 +8985,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "7.2-dev" } }, "autoload": { @@ -8972,7 +9013,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" }, "funding": [ { @@ -8992,34 +9033,34 @@ "type": "tidelift" } ], - "time": "2025-08-12T14:11:56+00:00" + "time": "2025-05-21T11:55:47+00:00" }, { "name": "sebastian/exporter", - "version": "7.0.2", + "version": "6.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "016951ae10980765e4e7aee491eb288c64e505b7" + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/016951ae10980765e4e7aee491eb288c64e505b7", - "reference": "016951ae10980765e4e7aee491eb288c64e505b7", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.3", - "sebastian/recursion-context": "^7.0" + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "6.3-dev" } }, "autoload": { @@ -9062,7 +9103,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.2" + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" }, "funding": [ { @@ -9082,35 +9123,35 @@ "type": "tidelift" } ], - "time": "2025-09-24T06:16:11+00:00" + "time": "2025-09-24T06:12:51+00:00" }, { "name": "sebastian/global-state", - "version": "8.0.2", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "ef1377171613d09edd25b7816f05be8313f9115d" + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", - "reference": "ef1377171613d09edd25b7816f05be8313f9115d", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", "shasum": "" }, "require": { - "php": ">=8.3", - "sebastian/object-reflector": "^5.0", - "sebastian/recursion-context": "^7.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -9136,53 +9177,41 @@ "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/8.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", - "type": "tidelift" } ], - "time": "2025-08-29T11:29:25+00:00" + "time": "2024-07-03T04:57:36+00:00" }, { "name": "sebastian/lines-of-code", - "version": "4.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", - "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -9206,7 +9235,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" }, "funding": [ { @@ -9214,34 +9243,34 @@ "type": "github" } ], - "time": "2025-02-07T04:57:28+00:00" + "time": "2024-07-03T04:58:38+00:00" }, { "name": "sebastian/object-enumerator", - "version": "7.0.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", - "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", "shasum": "" }, "require": { - "php": ">=8.3", - "sebastian/object-reflector": "^5.0", - "sebastian/recursion-context": "^7.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -9264,7 +9293,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" }, "funding": [ { @@ -9272,32 +9301,32 @@ "type": "github" } ], - "time": "2025-02-07T04:57:48+00:00" + "time": "2024-07-03T05:00:13+00:00" }, { "name": "sebastian/object-reflector", - "version": "5.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "4bfa827c969c98be1e527abd576533293c634f6a" + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", - "reference": "4bfa827c969c98be1e527abd576533293c634f6a", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -9320,7 +9349,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" }, "funding": [ { @@ -9328,32 +9357,32 @@ "type": "github" } ], - "time": "2025-02-07T04:58:17+00:00" + "time": "2024-07-03T05:01:32+00:00" }, { "name": "sebastian/recursion-context", - "version": "7.0.1", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", - "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -9384,7 +9413,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" }, "funding": [ { @@ -9404,32 +9433,32 @@ "type": "tidelift" } ], - "time": "2025-08-13T04:44:59+00:00" + "time": "2025-08-13T04:42:22+00:00" }, { "name": "sebastian/type", - "version": "6.0.3", + "version": "5.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", - "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -9453,7 +9482,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" + "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" }, "funding": [ { @@ -9473,29 +9502,29 @@ "type": "tidelift" } ], - "time": "2025-08-09T06:57:12+00:00" + "time": "2025-08-09T06:55:48+00:00" }, { "name": "sebastian/version", - "version": "6.0.0", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", - "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -9519,7 +9548,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/version/issues", "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" }, "funding": [ { @@ -9527,7 +9556,7 @@ "type": "github" } ], - "time": "2025-02-07T05:00:38+00:00" + "time": "2024-10-09T05:16:32+00:00" }, { "name": "staabm/side-effects-detector", @@ -9722,23 +9751,23 @@ }, { "name": "theseer/tokenizer", - "version": "2.0.1", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", - "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": "^8.1" + "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { @@ -9760,7 +9789,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/2.0.1" + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, "funding": [ { @@ -9768,27 +9797,27 @@ "type": "github" } ], - "time": "2025-12-08T11:19:18+00:00" + "time": "2025-11-17T20:03:58+00:00" }, { "name": "webmozart/assert", - "version": "1.12.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" + "reference": "1b34b004e35a164bc5bb6ebd33c844b2d8069a54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/1b34b004e35a164bc5bb6ebd33c844b2d8069a54", + "reference": "1b34b004e35a164bc5bb6ebd33c844b2d8069a54", "shasum": "" }, "require": { "ext-ctype": "*", "ext-date": "*", "ext-filter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.2" }, "suggest": { "ext-intl": "", @@ -9798,7 +9827,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10-dev" + "dev-feature/2-0": "2.0-dev" } }, "autoload": { @@ -9814,6 +9843,10 @@ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" + }, + { + "name": "Woody Gilk", + "email": "woody.gilk@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", @@ -9824,9 +9857,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.12.1" + "source": "https://github.com/webmozarts/assert/tree/2.0.0" }, - "time": "2025-10-29T15:56:20+00:00" + "time": "2025-12-16T21:36:00+00:00" } ], "aliases": [], From 6e3a3443c1c3947feefd98779f087554931e4ea0 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 10:41:49 -0300 Subject: [PATCH 57/71] chore: Atualiza ci --- .github/workflows/tests.yml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 59c15c9..c0fd1e8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,7 +12,7 @@ jobs: laravel: ['10.*', '11.*', '12.*'] include: - laravel: '10.*' - testbench: '^8.0' + testbench: '^8.22' - laravel: '11.*' testbench: '^9.0' - laravel: '12.*' @@ -31,24 +31,28 @@ jobs: extensions: mbstring, dom, fileinfo, sqlite, gd coverage: xdebug + tools: composer:v2 + - name: Install Dependencies run: | - # Forçamos a instalação da versão específica do Laravel definida na Matrix + # 1. Definimos as versões alvo sem atualizar ainda composer require "illuminate/support:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" --no-interaction --no-update - composer update --prefer-stable --no-interaction + + # 2. Executamos o update com -W para permitir downgrades de dependências do Pest/PHPUnit + # Usamos --no-audit para acelerar o processo no CI + composer update --prefer-stable --no-interaction --no-progress -W - name: Run Pest with Coverage Report run: | - # Gera o relatório HTML + # Gera o relatório HTML para o artefato vendor/bin/pest --coverage-html build/coverage --compact --ci - # Valida o mínimo de 90% apenas no comando principal + # Valida o mínimo de 90% focado apenas no seu comando principal vendor/bin/pest --coverage --min=90 --filter=CuidsGenerateCommand env: XDEBUG_MODE: coverage - name: Upload Report Artifact - if: matrix.php == '8.3' && matrix.laravel == '11.*' uses: actions/upload-artifact@v4 with: From a8e87c87ef065376b2ae707997fe67c2b1fd1955 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 10:44:44 -0300 Subject: [PATCH 58/71] chore: Atualiza actions --- .github/workflows/tests.yml | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c0fd1e8..b8c8fac 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -31,23 +31,15 @@ jobs: extensions: mbstring, dom, fileinfo, sqlite, gd coverage: xdebug - tools: composer:v2 - - name: Install Dependencies run: | - # 1. Definimos as versões alvo sem atualizar ainda composer require "illuminate/support:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" --no-interaction --no-update - - # 2. Executamos o update com -W para permitir downgrades de dependências do Pest/PHPUnit - # Usamos --no-audit para acelerar o processo no CI composer update --prefer-stable --no-interaction --no-progress -W - name: Run Pest with Coverage Report run: | - # Gera o relatório HTML para o artefato vendor/bin/pest --coverage-html build/coverage --compact --ci - - # Valida o mínimo de 90% focado apenas no seu comando principal + vendor/bin/pest --coverage --min=90 --filter=CuidsGenerateCommand env: XDEBUG_MODE: coverage From 18a58b697f7a6608ff3235cdc1c051866d99ea65 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 10:46:31 -0300 Subject: [PATCH 59/71] refactor: Remove filtro de min coverage --- .github/workflows/tests.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b8c8fac..a1020da 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -40,10 +40,6 @@ jobs: run: | vendor/bin/pest --coverage-html build/coverage --compact --ci - vendor/bin/pest --coverage --min=90 --filter=CuidsGenerateCommand - env: - XDEBUG_MODE: coverage - - name: Upload Report Artifact if: matrix.php == '8.3' && matrix.laravel == '11.*' uses: actions/upload-artifact@v4 From 622bc74e30f7ddb1d8aed5404c2f76a64930a9a8 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 10:49:37 -0300 Subject: [PATCH 60/71] =?UTF-8?q?refactor:=20Universaliza=20o=20uso=20do?= =?UTF-8?q?=20pest=20para=20outras=20vers=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/Pest.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/Pest.php b/tests/Pest.php index 33f9eab..209fc71 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -12,9 +12,7 @@ */ use Sysvale\CuidsGenerator\Tests\TestCase; -pest()->extend(TestCase::class) - // ->use(Illuminate\Foundation\Testing\RefreshDatabase::class) - ->in('Feature'); +uses(TestCase::class)->in('Feature'); /* |-------------------------------------------------------------------------- From faebb002f1d1e28b6a2200e6858d1d099e1de0b5 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 10:52:55 -0300 Subject: [PATCH 61/71] refactor: Corrige quando ocorre workflow de testes --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a1020da..fa730c4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,6 +1,6 @@ name: Test Package Commands -on: [push, pull_request] +on: [push] jobs: test: From 0ced6734b5930cbfc9d9c3230fd66d71babe6dc2 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 11:06:39 -0300 Subject: [PATCH 62/71] feat: Adiciona comandos e instala pacote de codesniffer --- .github/workflows/tests.yml | 17 +++++++- README.md | 17 +++++++- composer.json | 9 ++++- composer.lock | 81 ++++++++++++++++++++++++++++++++++++- phpcs.xml | 15 +++++++ 5 files changed, 133 insertions(+), 6 deletions(-) create mode 100644 phpcs.xml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index fa730c4..265258d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,6 +1,13 @@ name: Test Package Commands -on: [push] +on: + push: + branches: + - main + - master + pull_request: + branches: + - '*' jobs: test: @@ -30,15 +37,21 @@ jobs: php-version: ${{ matrix.php }} extensions: mbstring, dom, fileinfo, sqlite, gd coverage: xdebug + tools: composer:v2 - name: Install Dependencies run: | composer require "illuminate/support:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" --no-interaction --no-update composer update --prefer-stable --no-interaction --no-progress -W + - name: Check Code Style + run: composer lint + - name: Run Pest with Coverage Report run: | - vendor/bin/pest --coverage-html build/coverage --compact --ci + composer test:coverage -- --compact --ci + env: + XDEBUG_MODE: coverage - name: Upload Report Artifact if: matrix.php == '8.3' && matrix.laravel == '11.*' diff --git a/README.md b/README.md index ffffd42..de7b2c7 100644 --- a/README.md +++ b/README.md @@ -43,9 +43,22 @@ O que o comando faz: ## 🧪 Desenvolvimento e Testes Este pacote utiliza o Pest PHP para garantir cobertura do comando de geração de módulos, verificando a cobertura com o coverage. -Para rodar os testes: +- Para rodar os testes: ```bash -vendor/bin/pest --coverage-html build/coverage --compact --ci + composer test +``` +- Cobertura +```bash + composer test:coverage +``` +- Checar estilo +```bash + composer lint +``` + +- Corrigir estilo +```bash + composer fix ``` ## 🏗️ Estrutura de pastas diff --git a/composer.json b/composer.json index 2b6153d..9743f82 100644 --- a/composer.json +++ b/composer.json @@ -33,11 +33,18 @@ "require-dev": { "orchestra/testbench": "^8.22|^9.0", "pestphp/pest": "^2.34|^3.0", - "pestphp/pest-plugin-drift": "^2.0|^3.0" + "pestphp/pest-plugin-drift": "^2.0|^3.0", + "squizlabs/php_codesniffer": "^4.0" }, "config": { "allow-plugins": { "pestphp/pest-plugin": true } + }, + "scripts": { + "lint": "phpcs .", + "fix": "phpcbf .", + "test": "pest", + "test:coverage": "pest --coverage-html build/coverage" } } diff --git a/composer.lock b/composer.lock index 7e9ace1..ba8207a 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": "cefbdf8613f85beb8cc969eeaa664be2", + "content-hash": "c2610c81939a6e8aed77e07071ec3e18", "packages": [ { "name": "brick/math", @@ -9558,6 +9558,85 @@ ], "time": "2024-10-09T05:16:32+00:00" }, + { + "name": "squizlabs/php_codesniffer", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "0525c73950de35ded110cffafb9892946d7771b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0525c73950de35ded110cffafb9892946d7771b5", + "reference": "0525c73950de35ded110cffafb9892946d7771b5", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=7.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.4.0 || ^9.3.4 || ^10.5.32 || 11.3.3 - 11.5.28 || ^11.5.31" + }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-11-10T16:43:36+00:00" + }, { "name": "staabm/side-effects-detector", "version": "1.0.5", diff --git a/phpcs.xml b/phpcs.xml new file mode 100644 index 0000000..892c0bf --- /dev/null +++ b/phpcs.xml @@ -0,0 +1,15 @@ + + + Regras de estilo para Cuids Generator + + src + tests + + vendor/* + build/* + + + + + + \ No newline at end of file From 8ba9704ab0b282f738ddc1f5cc822cb76e0eef53 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 11:07:03 -0300 Subject: [PATCH 63/71] =?UTF-8?q?refactor:=20Realiza=20ajustes=20de=20reco?= =?UTF-8?q?menda=C3=A7=C3=B5es=20sugeridos=20pelo=20phpcs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Blueprint/Builders/DraftBuilder.php | 7 ++-- .../Builders/ValidationRuleBuilder.php | 4 +-- src/Blueprint/PostProcessorRunner.php | 3 +- .../CollectionPostProcessor.php | 6 ++-- .../ControllerPostProcessor.php | 4 ++- .../PostProcessors/FactoryPostProcessor.php | 8 +++-- .../PostProcessors/FormFieldPostProcessor.php | 6 ++-- .../Mongo/MongoModelTransformer.php | 17 ++++----- .../PostProcessors/RequestPostProcessor.php | 4 ++- .../PostProcessors/RoutePostProcessor.php | 5 +-- .../PostProcessors/TestPostProcessor.php | 2 +- src/Console/Commands/CuidsGenerateCommand.php | 8 +++-- src/Console/Editors/FieldEditor.php | 35 +++++++++++++------ src/Console/Editors/RelationshipEditor.php | 23 ++++++++---- .../CuidsGeneratorServiceProvider.php | 3 +- src/Support/RelationshipType.php | 2 +- .../Commands/CuidsGenerateCommandTest.php | 2 +- tests/Pest.php | 2 ++ tests/TestCase.php | 2 +- 19 files changed, 94 insertions(+), 49 deletions(-) diff --git a/src/Blueprint/Builders/DraftBuilder.php b/src/Blueprint/Builders/DraftBuilder.php index a092854..2159f5d 100644 --- a/src/Blueprint/Builders/DraftBuilder.php +++ b/src/Blueprint/Builders/DraftBuilder.php @@ -13,7 +13,8 @@ class DraftBuilder public function __construct( protected RequestBuilder $requestBuilder, protected ControllerBuilder $controllerBuilder, - ) {} + ) { + } public function build(string $model, array $fields, array $relationships): array { @@ -23,7 +24,7 @@ public function build(string $model, array $fields, array $relationships): array 'models' => [ $model => $formattedModelsFields, ], - 'requests' =>$this->requestBuilder->build($model, $fields), + 'requests' => $this->requestBuilder->build($model, $fields), 'controllers' => $this->controllerBuilder->build($model), ]; @@ -53,7 +54,7 @@ private function mapFields(array $fields, array $relationships): array foreach ($relationships as $relatedModel => $type) { if ($type === 'belongsTo') { $foreignKey = Str::snake($relatedModel) . '_id'; - $formatted[$foreignKey] = 'string'; + $formatted[$foreignKey] = 'string'; } } diff --git a/src/Blueprint/Builders/ValidationRuleBuilder.php b/src/Blueprint/Builders/ValidationRuleBuilder.php index 8cbf00d..5de7f0f 100644 --- a/src/Blueprint/Builders/ValidationRuleBuilder.php +++ b/src/Blueprint/Builders/ValidationRuleBuilder.php @@ -49,10 +49,10 @@ private static function getTypeRules(string $type): ?string 'string', 'text' => 'string', 'integer', 'bigInteger' => 'integer', 'boolean' => 'boolean', - 'date', 'datetime', + 'date', 'datetime', 'timestamp' => 'date', 'decimal', 'float' => 'numeric', default => null, }; } -} \ No newline at end of file +} diff --git a/src/Blueprint/PostProcessorRunner.php b/src/Blueprint/PostProcessorRunner.php index 5dcca03..ca7c6ba 100644 --- a/src/Blueprint/PostProcessorRunner.php +++ b/src/Blueprint/PostProcessorRunner.php @@ -6,7 +6,8 @@ class PostProcessorRunner { public function __construct( protected iterable $processors - ) {} + ) { + } public function run(string $model): void { diff --git a/src/Blueprint/PostProcessors/CollectionPostProcessor.php b/src/Blueprint/PostProcessors/CollectionPostProcessor.php index dcbfec1..a2bf134 100644 --- a/src/Blueprint/PostProcessors/CollectionPostProcessor.php +++ b/src/Blueprint/PostProcessors/CollectionPostProcessor.php @@ -12,7 +12,9 @@ public function handle(string $model): void $stubPath = __DIR__ . '/../Stubs/collection.stub'; - if (!File::exists($stubPath)) return; + if (!File::exists($stubPath)) { + return; + } $stub = File::get($stubPath); @@ -28,4 +30,4 @@ public function handle(string $model): void File::put($path, $content); } -} \ No newline at end of file +} diff --git a/src/Blueprint/PostProcessors/ControllerPostProcessor.php b/src/Blueprint/PostProcessors/ControllerPostProcessor.php index e507fe2..daa24dd 100644 --- a/src/Blueprint/PostProcessors/ControllerPostProcessor.php +++ b/src/Blueprint/PostProcessors/ControllerPostProcessor.php @@ -10,7 +10,9 @@ public function handle(string $model): void { $path = base_path("app/Http/Controllers/{$model}Controller.php"); - if (!File::exists($path)) return; + if (!File::exists($path)) { + return; + } $content = File::get($path); diff --git a/src/Blueprint/PostProcessors/FactoryPostProcessor.php b/src/Blueprint/PostProcessors/FactoryPostProcessor.php index 0b73041..45c25a5 100644 --- a/src/Blueprint/PostProcessors/FactoryPostProcessor.php +++ b/src/Blueprint/PostProcessors/FactoryPostProcessor.php @@ -9,8 +9,10 @@ class FactoryPostProcessor public function handle(string $model): void { $path = base_path("database/factories/{$model}Factory.php"); - - if (! File::exists($path)) return; + + if (! File::exists($path)) { + return; + } $content = File::get($path); @@ -28,4 +30,4 @@ public function handle(string $model): void File::put($path, $content); } -} \ No newline at end of file +} diff --git a/src/Blueprint/PostProcessors/FormFieldPostProcessor.php b/src/Blueprint/PostProcessors/FormFieldPostProcessor.php index 56f78a4..06b1c87 100644 --- a/src/Blueprint/PostProcessors/FormFieldPostProcessor.php +++ b/src/Blueprint/PostProcessors/FormFieldPostProcessor.php @@ -14,7 +14,9 @@ public function handle(string $model): void $path = resource_path("js/features/{$pluralModel}/constants/{$lowerModel}FormFields.ts"); - if (! File::exists($path)) return; + if (! File::exists($path)) { + return; + } $content = File::get($path); @@ -23,4 +25,4 @@ public function handle(string $model): void File::put($path, $content); } -} \ No newline at end of file +} diff --git a/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php b/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php index 3e11c2a..0e4df0b 100644 --- a/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php +++ b/src/Blueprint/PostProcessors/Mongo/MongoModelTransformer.php @@ -12,7 +12,9 @@ public function handle(string $model): void { $path = app_path("Models/{$model}.php"); - if (!File::exists($path)) return; + if (!File::exists($path)) { + return; + } $content = File::get($path); @@ -39,7 +41,7 @@ protected function setupBaseStructure(string $content, string $model): string if (!str_contains($content, 'protected $connection')) { $collection = Str::snake(Str::pluralStudly($model)); - + $content = preg_replace( '/(class\s+' . $model . '\s+extends\s+Model\s*\{)/', "$1\n protected \$connection = 'mongodb';\n protected \$collection = '{$collection}';", @@ -74,14 +76,14 @@ protected function applySoftDeletes(string $content): string protected function removeFactories(string $content): string { $content = preg_replace( - '/use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory;\n/', - '', + '/use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory;\n/', + '', $content ); $content = preg_replace( - '/\s+use HasFactory;/', - '', + '/\s+use HasFactory;/', + '', $content ); @@ -110,7 +112,6 @@ protected function cleanupCasts(string $content): string protected function setupVisibility(string $content): string { if (!str_contains($content, 'protected $appends')) { - $content = preg_replace( '/(protected\s+\$fillable\s*=\s*\[[^\]]*\];)/s', "$1\n\n protected \$appends = ['id'];\n protected \$hidden = ['_id'];", @@ -120,4 +121,4 @@ protected function setupVisibility(string $content): string return $content; } -} \ No newline at end of file +} diff --git a/src/Blueprint/PostProcessors/RequestPostProcessor.php b/src/Blueprint/PostProcessors/RequestPostProcessor.php index 62a3bba..482e290 100644 --- a/src/Blueprint/PostProcessors/RequestPostProcessor.php +++ b/src/Blueprint/PostProcessors/RequestPostProcessor.php @@ -15,7 +15,9 @@ public function handle(string $model): void ]; foreach ($files as $path) { - if (! File::exists($path)) continue; + if (! File::exists($path)) { + continue; + } $content = File::get($path); diff --git a/src/Blueprint/PostProcessors/RoutePostProcessor.php b/src/Blueprint/PostProcessors/RoutePostProcessor.php index 14db994..6f549b3 100644 --- a/src/Blueprint/PostProcessors/RoutePostProcessor.php +++ b/src/Blueprint/PostProcessors/RoutePostProcessor.php @@ -29,7 +29,7 @@ private function registerBackEndRoute(string $content, string $model): string { $lines = explode("\n", $content); - $controller = Str::studly($model).'Controller'; + $controller = Str::studly($model) . 'Controller'; $routeName = Str::kebab(Str::pluralStudly($model)); $useLine = "use App\Http\Controllers\\{$controller};"; @@ -84,7 +84,8 @@ private function removeBlueprintResourceRoute(string $content, string $model): s $controller = Str::studly($model) . 'Controller'; $pattern = sprintf( - '/Route::resource\s*\(\s*[\'"][^\'"]+[\'"]\s*,\s*App\\\\Http\\\\Controllers\\\\%s::class\s*\)\s*(->(?:only|except)\([^)]+\))?\s*;/m', + '/Route::resource\s*\(\s*[\'"][^\'"]+[\'"]\s*,\s*App\\\\Http\\\\Controllers\\\\%s::class\s*\) + \s*(->(?:only|except)\s*\([^)]+\))?\s*;/mx', $controller ); diff --git a/src/Blueprint/PostProcessors/TestPostProcessor.php b/src/Blueprint/PostProcessors/TestPostProcessor.php index 5883247..8ebd9b9 100644 --- a/src/Blueprint/PostProcessors/TestPostProcessor.php +++ b/src/Blueprint/PostProcessors/TestPostProcessor.php @@ -12,7 +12,7 @@ public function handle(string $model): void $path = base_path("tests/Feature/Http/Controllers/{$model}ControllerTest.php"); $stubPath = __DIR__ . '/../Stubs/controller.test.stub'; - + if (!File::exists($stubPath)) { return; } diff --git a/src/Console/Commands/CuidsGenerateCommand.php b/src/Console/Commands/CuidsGenerateCommand.php index aa91f76..13c8db4 100644 --- a/src/Console/Commands/CuidsGenerateCommand.php +++ b/src/Console/Commands/CuidsGenerateCommand.php @@ -11,6 +11,7 @@ use Sysvale\CuidsGenerator\Console\Editors\RelationshipEditor; use Sysvale\CuidsGenerator\Blueprint\PostProcessorRunner; use Sysvale\CuidsGenerator\Blueprint\Builders\FormFieldBuilder; + use function Laravel\Prompts\text; use function Laravel\Prompts\confirm; use function Laravel\Prompts\note; @@ -70,7 +71,6 @@ public function handle() $this->postProcessorRunner->run($entityStudly); $this->components->info("Módulo {$entityStudly} gerado com sucesso!"); - } catch (\Exception $e) { $this->error("Falha na geração: {$e->getMessage()}"); return Command::FAILURE; @@ -90,7 +90,7 @@ protected function askForEntityName(): string protected function askForRelationships(): array { $this->newLine(); - + $wantsRelationships = confirm( label: 'Deseja adicionar relacionamentos?', default: true, @@ -110,7 +110,9 @@ public function getProjectModels(): array { $modelsPath = app_path('Models'); - if (! File::isDirectory($modelsPath)) return []; + if (! File::isDirectory($modelsPath)) { + return []; + } $files = File::allFiles($modelsPath); diff --git a/src/Console/Editors/FieldEditor.php b/src/Console/Editors/FieldEditor.php index 209608a..325f38d 100644 --- a/src/Console/Editors/FieldEditor.php +++ b/src/Console/Editors/FieldEditor.php @@ -3,6 +3,7 @@ namespace Sysvale\CuidsGenerator\Console\Editors; use Sysvale\CuidsGenerator\Support\FieldType; + use function Laravel\Prompts\select; use function Laravel\Prompts\text; use function Laravel\Prompts\table; @@ -43,7 +44,9 @@ public function run(): array 'done' => null, }; - if ($action === 'done') break; + if ($action === 'done') { + break; + } } return $fields; @@ -85,7 +88,9 @@ private function add(array &$fields): void private function rename(array &$fields): void { - if ($this->isEmpty($fields)) return; + if ($this->isEmpty($fields)) { + return; + } $old = select('Selecione o campo para renomear', array_keys($fields)); $new = text( @@ -106,10 +111,12 @@ private function rename(array &$fields): void private function changeType(array &$fields): void { - if ($this->isEmpty($fields)) return; + if ($this->isEmpty($fields)) { + return; + } $name = select('Alterar tipo de qual campo?', array_keys($fields)); - + $newType = select( label: "Novo tipo para '{$name}'", options: FieldType::values() @@ -122,10 +129,12 @@ private function changeType(array &$fields): void private function changeRequired(array &$fields): void { - if ($this->isEmpty($fields)) return; + if ($this->isEmpty($fields)) { + return; + } $name = select('Alterar obrigatoriedade de qual campo?', array_keys($fields)); - + $requiredChoice = select( label: "Novo status de obrigatoriedade para '{$name}'", options: ['Sim', 'Não'], @@ -140,7 +149,9 @@ private function changeRequired(array &$fields): void private function remove(array &$fields): void { - if ($this->isEmpty($fields)) return; + if ($this->isEmpty($fields)) { + return; + } $name = select('Remover qual campo?', array_keys($fields)); @@ -151,7 +162,9 @@ private function remove(array &$fields): void no: 'Não' ); - if (!$removeField) return; + if (!$removeField) { + return; + } unset($fields[$name]); @@ -160,7 +173,9 @@ private function remove(array &$fields): void private function list(array $fields): void { - if ($this->isEmpty($fields)) return; + if ($this->isEmpty($fields)) { + return; + } table( ['Campo', 'Tipo', 'Obrigatório'], @@ -182,4 +197,4 @@ private function isEmpty(array $fields): bool } return false; } -} \ No newline at end of file +} diff --git a/src/Console/Editors/RelationshipEditor.php b/src/Console/Editors/RelationshipEditor.php index 7510c4f..2376203 100644 --- a/src/Console/Editors/RelationshipEditor.php +++ b/src/Console/Editors/RelationshipEditor.php @@ -4,6 +4,7 @@ use Sysvale\CuidsGenerator\Support\RelationshipType; use Illuminate\Console\Command; + use function Laravel\Prompts\select; use function Laravel\Prompts\text; use function Laravel\Prompts\table; @@ -33,7 +34,9 @@ public function run(array $models): array default: 'add' ); - if ($action === 'done') break; + if ($action === 'done') { + break; + } match ($action) { 'add' => $this->add($relationships), @@ -93,7 +96,9 @@ private function select(array &$relationships, array &$models): void private function update(array &$relationships): void { - if ($this->isEmpty($relationships)) return; + if ($this->isEmpty($relationships)) { + return; + } $collection = select( 'Selecione o relacionamento para atualizar', @@ -115,7 +120,9 @@ private function update(array &$relationships): void private function remove(array &$relationships): void { - if ($this->isEmpty($relationships)) return; + if ($this->isEmpty($relationships)) { + return; + } $name = select('Remover qual relacionamento?', array_keys($relationships)); @@ -126,7 +133,9 @@ private function remove(array &$relationships): void no: 'Não' ); - if (!$removeRelationship) return; + if (!$removeRelationship) { + return; + } unset($relationships[$name]); warning("Relacionamento com '{$name}' removido."); @@ -136,7 +145,9 @@ private function remove(array &$relationships): void private function list(array $relationships): void { - if ($this->isEmpty($relationships)) return; + if ($this->isEmpty($relationships)) { + return; + } table( ['Model Relacionado', 'Tipo'], @@ -152,4 +163,4 @@ private function isEmpty(array $relationships): bool } return false; } -} \ No newline at end of file +} diff --git a/src/Providers/CuidsGeneratorServiceProvider.php b/src/Providers/CuidsGeneratorServiceProvider.php index f6d5f3b..471d1ca 100644 --- a/src/Providers/CuidsGeneratorServiceProvider.php +++ b/src/Providers/CuidsGeneratorServiceProvider.php @@ -66,5 +66,6 @@ private function configureBlueprintStubs(): void } public function boot(): void - {} + { + } } diff --git a/src/Support/RelationshipType.php b/src/Support/RelationshipType.php index 2bd5d62..097a917 100644 --- a/src/Support/RelationshipType.php +++ b/src/Support/RelationshipType.php @@ -13,4 +13,4 @@ public static function values(): array { return array_column(self::cases(), 'value'); } -} \ No newline at end of file +} diff --git a/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php b/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php index 44e0ae4..d52e406 100644 --- a/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php +++ b/tests/Feature/Console/Commands/CuidsGenerateCommandTest.php @@ -107,4 +107,4 @@ public function testShowsNoteWhenSkippingRelationships() ->expectsOutputToContain('Nenhum relacionamento configurado.') ->assertExitCode(0); } -} \ No newline at end of file +} diff --git a/tests/Pest.php b/tests/Pest.php index 209fc71..f3f3f2d 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -1,5 +1,7 @@ Date: Tue, 23 Dec 2025 11:43:14 -0300 Subject: [PATCH 64/71] refactor: Ajusta README --- README.md | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index de7b2c7..a523bfe 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ O **Cuids Generator** é uma ferramenta de linha de comando para Laravel projeta Antes de começar, verifique se seu ambiente atende aos requisitos mínimos: - **PHP**: `^8.1` (Recomendado `8.3`) -- **Laravel Framework**: `^10.0` ou `^11.0` +- **Laravel Framework**: `10.0` ou superior - **Laravel Blueprint**: `^2.12` - **Driver MongoDB**: Configurado e funcional em sua aplicação Laravel. @@ -21,15 +21,29 @@ Antes de começar, verifique se seu ambiente atende aos requisitos mínimos: ## ⚙️ Instalação -Você pode instalar o pacote via Composer: +Adicione o repositório em seu `composer.json` +```json +"repositories": [ + { + "name": "sysvale/cuids-generator", + "type": "git", + "url": "https://github.com/Sysvale/cuids-generator" + } +] + +``` +Para executar uma branch específica, execute o seguinte comando: ```bash -composer require sysvale/cuids-generator +composer require sysvale/cuids-generator:dev- -W ``` +Desenvolvimento + + ## 🛠️ Como usar -Você pode instalar o pacote via Composer: +Executando o comando: ```bash php artisan cuids:generate From 12e487d42b49a1c1c534e765aa9fe2b6efbdb986 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 12:03:22 -0300 Subject: [PATCH 65/71] refactor: Remove arquivo --- README.md | 92 ------------------------------------------------------- 1 file changed, 92 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index a523bfe..0000000 --- a/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# Cuids Generator 🚀 - -[![Tests](https://github.com/sysvale/cuids-generator/actions/workflows/tests.yml/badge.svg)](https://github.com/sysvale/cuids-generator/actions) -[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) -[![PHP Version](https://img.shields.io/badge/php-%5E8.1-8892bf.svg)](https://www.php.net/) - -O **Cuids Generator** é uma ferramenta de linha de comando para Laravel projetada para acelerar a criação de módulos baseados em MongoDB. Ele atua como uma interface interativa sobre o `laravel-shift/blueprint`, permitindo definir modelos, atributos e relacionamentos de forma guiada. - ---- - -## 📋 Requisitos - -Antes de começar, verifique se seu ambiente atende aos requisitos mínimos: - -- **PHP**: `^8.1` (Recomendado `8.3`) -- **Laravel Framework**: `10.0` ou superior -- **Laravel Blueprint**: `^2.12` -- **Driver MongoDB**: Configurado e funcional em sua aplicação Laravel. - ---- - -## ⚙️ Instalação - -Adicione o repositório em seu `composer.json` -```json -"repositories": [ - { - "name": "sysvale/cuids-generator", - "type": "git", - "url": "https://github.com/Sysvale/cuids-generator" - } -] - -``` -Para executar uma branch específica, execute o seguinte comando: - -```bash -composer require sysvale/cuids-generator:dev- -W -``` - -Desenvolvimento - - -## 🛠️ Como usar - -Executando o comando: - -```bash -php artisan cuids:generate -``` -O que o comando faz: -- Interface Interativa: Pergunta o nome do Model (em inglês) e guia você na criação de campos (tipos, obrigatoriedade, etc...); -- Detecção de Models: Escaneia automaticamente sua pasta app/Models para sugerir relacionamentos com entidades existentes; -- Draft Automation: Gera o arquivo draft.yaml formatado para o Blueprint; -- Build Integrado: Executa comando blueprint:build em modo silencioso, gerando Models, Controllers e Migrations; -- Pós-processamento: Cria arquivos de constantes para o frontend e executa runners de limpeza e ajuste de código para o padrão CUIDS. - -## 🧪 Desenvolvimento e Testes -Este pacote utiliza o Pest PHP para garantir cobertura do comando de geração de módulos, verificando a cobertura com o coverage. -- Para rodar os testes: -```bash - composer test -``` -- Cobertura -```bash - composer test:coverage -``` -- Checar estilo -```bash - composer lint -``` - -- Corrigir estilo -```bash - composer fix -``` - -## 🏗️ Estrutura de pastas -## Estrutura de pastas - -* `src/`: - + `Blueprint/`: - - Lógica de escrita, Builders de rascunho e Pós-processadores - + `Console/`: - - `Commands/`: CuidsGenerateCommand (Orquestrador) - - `Editors/`: Editores interativos (FieldEditor e RelationshipEditor) - + `Providers/`: Service Provider do Pacote - + `Support/`: Enums de Tipos e Helpers -* `tests/`: Suíte de testes com Mocks de dependências - -## 📄 Licença -Este projeto está licenciado sob a Apache License 2.0. \ No newline at end of file From bc8c899df4c01f28e627e977871ffe867b3fb3e1 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 15:51:59 -0300 Subject: [PATCH 66/71] =?UTF-8?q?refactor:=20Ajusta=20logica=20de=20cria?= =?UTF-8?q?=C3=A7ao=20de=20rotas=20para=20nao=20depender=20mais=20de=20com?= =?UTF-8?q?entarios=20setados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PostProcessors/RoutePostProcessor.php | 93 ++++++++----------- 1 file changed, 37 insertions(+), 56 deletions(-) diff --git a/src/Blueprint/PostProcessors/RoutePostProcessor.php b/src/Blueprint/PostProcessors/RoutePostProcessor.php index 6f549b3..4a8709a 100644 --- a/src/Blueprint/PostProcessors/RoutePostProcessor.php +++ b/src/Blueprint/PostProcessors/RoutePostProcessor.php @@ -4,7 +4,6 @@ use Illuminate\Support\Facades\File; use Illuminate\Support\Str; -use RuntimeException; class RoutePostProcessor { @@ -12,83 +11,65 @@ public function handle(string $model): void { $path = base_path('routes/web.php'); - if (! File::exists($path)) { + if (!File::exists($path)) { return; } $content = File::get($path); - $content = $this->removeBlueprintResourceRoute($content, $model); + $content = $this->transformToApiResource($content, $model); - $updated = $this->registerBackEndRoute($content, $model); + $content = $this->ensureControllerImport($content, $model); - File::put($path, $updated); + File::put($path, $content); } - private function registerBackEndRoute(string $content, string $model): string + private function transformToApiResource(string $content, string $model): string { - $lines = explode("\n", $content); - $controller = Str::studly($model) . 'Controller'; - $routeName = Str::kebab(Str::pluralStudly($model)); - - $useLine = "use App\Http\Controllers\\{$controller};"; - $routeLine = " Route::apiResource('/{$routeName}', {$controller}::class);"; - - $foundImportMarker = false; - $foundRegisterMarker = false; - - $result = []; + $resourceName = Str::kebab(Str::pluralStudly($model)); - foreach ($lines as $line) { - if (str_contains($line, '@endcontrollerimport')) { - $foundImportMarker = true; + $pattern = '/Route::resource\s*\(\s*[\'"][^\'"]+[\'"]\s*,\s*\\\\?App\\\\Http\\\\Controllers\\\\' . $controller . '::class\s*\)(?:\s*->(?:except|only)\s*\([^)]+\))?\s*;/'; - if (! str_contains($content, $useLine)) { - $result[] = $useLine; - } - } + $replacement = "Route::apiResource('/{$resourceName}', {$controller}::class);"; - if (str_contains($line, '@endroutergister')) { - $foundRegisterMarker = true; - - if (! str_contains($content, $routeLine)) { - if (! empty($result) && trim(end($result)) !== '') { - $result[] = ''; - } + return preg_replace($pattern, $replacement, $content); + } - $result[] = $routeLine; - } - } + private function ensureControllerImport(string $content, string $model): string + { + $controller = Str::studly($model) . 'Controller'; + $useLine = "use App\Http\Controllers\\{$controller};"; - $result[] = $line; + if (str_contains($content, $useLine)) { + return $content; } - if (! $foundImportMarker) { - throw new RuntimeException( - 'Não foi possível encontrar o marcador @endcontrollerimport em routes/web.php' + $pattern = '/use App\\\\Http\\\\Controllers\\\\.*;/'; + + if (preg_match_all($pattern, $content, $matches, PREG_OFFSET_CAPTURE)) { + $lastMatch = end($matches[0]); + $lastMatchText = $lastMatch[0]; + $lastMatchOffset = $lastMatch[1]; + + return substr_replace( + $content, + $lastMatchText . "\n" . $useLine, + $lastMatchOffset, + strlen($lastMatchText) ); } - if (! $foundRegisterMarker) { - throw new RuntimeException( - 'Não foi possível encontrar o marcador @endroutergister em routes/web.php' + if (preg_match_all('/use .*;/i', $content, $matches, PREG_OFFSET_CAPTURE)) { + $lastMatch = end($matches[0]); + return substr_replace( + $content, + $lastMatch[0] . "\n" . $useLine, + $lastMatch[1], + strlen($lastMatch[0]) ); } - return implode("\n", $result); - } - - private function removeBlueprintResourceRoute(string $content, string $model): string - { - $controller = Str::studly($model) . 'Controller'; - - $pattern = sprintf( - '/Route::resource\s*\(\s*[\'"][^\'"]+[\'"]\s*,\s*App\\\\Http\\\\Controllers\\\\%s::class\s*\) - \s*(->(?:only|except)\s*\([^)]+\))?\s*;/mx', - $controller - ); - - return preg_replace($pattern, '', $content); + return str_replace(' Date: Tue, 23 Dec 2025 15:52:20 -0300 Subject: [PATCH 67/71] =?UTF-8?q?refactor:=20Adiciona=20agora=20logica=20d?= =?UTF-8?q?e=20sanitiza=C3=A7=C3=A3o/normaliza=C3=A7=C3=A3o=20para=20nome?= =?UTF-8?q?=20de=20variaveis=20informadas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Console/Editors/FieldEditor.php | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/Console/Editors/FieldEditor.php b/src/Console/Editors/FieldEditor.php index 325f38d..106ea36 100644 --- a/src/Console/Editors/FieldEditor.php +++ b/src/Console/Editors/FieldEditor.php @@ -2,6 +2,7 @@ namespace Sysvale\CuidsGenerator\Console\Editors; +use Illuminate\Support\Str; use Sysvale\CuidsGenerator\Support\FieldType; use function Laravel\Prompts\select; @@ -64,20 +65,22 @@ private function add(array &$fields): void } ); + $fieldName = $this->sanitizeFieldName($name); + $type = select( - label: "Qual o tipo de '{$name}'?", + label: "Qual o tipo de '{$fieldName}'?", options: FieldType::values(), default: FieldType::values()[0] ); $requiredChoice = select( - label: "O campo '{$name}' é obrigatório?", + label: "O campo '{$fieldName}' é obrigatório?", options: ['Sim', 'Não'], default: 'Sim' ); - $fields[$name] = [ - 'name' => $name, + $fields[$fieldName] = [ + 'name' => $fieldName, 'type' => $type, 'required' => $requiredChoice === 'Sim', 'nullable' => $requiredChoice === 'Não', @@ -102,8 +105,10 @@ private function rename(array &$fields): void } ); - $fields[$new] = $fields[$old]; - $fields[$new]['name'] = $new; + $fieldName = $this->sanitizeFieldName($new); + + $fields[$fieldName] = $fields[$old]; + $fields[$fieldName]['name'] = $fieldName; unset($fields[$old]); $this->list($fields); @@ -197,4 +202,9 @@ private function isEmpty(array $fields): bool } return false; } + + private function sanitizeFieldName(string $name): string + { + return Str::snake(Str::camel(Str::singular($name))); + } } From 6113fc4a392178402475f855b688308115f0dbdc Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 15:54:31 -0300 Subject: [PATCH 68/71] =?UTF-8?q?refactor:=20Corre=C3=A7=C3=B5es=20recomen?= =?UTF-8?q?dadas=20pelo=20phpcs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PostProcessors/RoutePostProcessor.php | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/Blueprint/PostProcessors/RoutePostProcessor.php b/src/Blueprint/PostProcessors/RoutePostProcessor.php index 4a8709a..2872979 100644 --- a/src/Blueprint/PostProcessors/RoutePostProcessor.php +++ b/src/Blueprint/PostProcessors/RoutePostProcessor.php @@ -29,7 +29,9 @@ private function transformToApiResource(string $content, string $model): string $controller = Str::studly($model) . 'Controller'; $resourceName = Str::kebab(Str::pluralStudly($model)); - $pattern = '/Route::resource\s*\(\s*[\'"][^\'"]+[\'"]\s*,\s*\\\\?App\\\\Http\\\\Controllers\\\\' . $controller . '::class\s*\)(?:\s*->(?:except|only)\s*\([^)]+\))?\s*;/'; + $pattern = '/Route::resource\s*\(\s*[\'"][^\'"]+[\'"]\s*,\s*\\\\?App\\\\Http\\\\Controllers\\\\' + . $controller + . '::class\s*\)(?:\s*->(?:except|only)\s*\([^)]+\))?\s*;/'; $replacement = "Route::apiResource('/{$resourceName}', {$controller}::class);"; @@ -46,16 +48,16 @@ private function ensureControllerImport(string $content, string $model): string } $pattern = '/use App\\\\Http\\\\Controllers\\\\.*;/'; - + if (preg_match_all($pattern, $content, $matches, PREG_OFFSET_CAPTURE)) { $lastMatch = end($matches[0]); $lastMatchText = $lastMatch[0]; $lastMatchOffset = $lastMatch[1]; return substr_replace( - $content, - $lastMatchText . "\n" . $useLine, - $lastMatchOffset, + $content, + $lastMatchText . "\n" . $useLine, + $lastMatchOffset, strlen($lastMatchText) ); } @@ -63,13 +65,13 @@ private function ensureControllerImport(string $content, string $model): string if (preg_match_all('/use .*;/i', $content, $matches, PREG_OFFSET_CAPTURE)) { $lastMatch = end($matches[0]); return substr_replace( - $content, - $lastMatch[0] . "\n" . $useLine, - $lastMatch[1], + $content, + $lastMatch[0] . "\n" . $useLine, + $lastMatch[1], strlen($lastMatch[0]) ); } return str_replace(' Date: Tue, 23 Dec 2025 16:07:26 -0300 Subject: [PATCH 69/71] =?UTF-8?q?refactor:=20Remove=20cria=C3=A7=C3=A3o=20?= =?UTF-8?q?de=20migartions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Console/Commands/CuidsGenerateCommand.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Console/Commands/CuidsGenerateCommand.php b/src/Console/Commands/CuidsGenerateCommand.php index 13c8db4..c8884bc 100644 --- a/src/Console/Commands/CuidsGenerateCommand.php +++ b/src/Console/Commands/CuidsGenerateCommand.php @@ -62,6 +62,14 @@ public function handle() $this->blueprintWriter->write($draft); + $generators = config('blueprint.generators'); + + if (isset($generators['migration'])) { + unset($generators['migration']); + } + + config(['blueprint.generators' => $generators]); + spin(fn () => $this->callSilent('blueprint:build'), 'Construindo arquivos via Blueprint...'); $this->components->info('Gerando constantes do frontend...'); From 2d9b5c65ec5ef7bef0b964eaeea926bec422a9d4 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 16:40:53 -0300 Subject: [PATCH 70/71] refactor: Realiza ajustes em pos processadores dos testes para garantir testabiliade mais field --- src/Blueprint/PostProcessorRunner.php | 4 +-- .../PostProcessors/TestPostProcessor.php | 3 +- src/Blueprint/Stubs/controller.test.stub | 33 ++++++++++++++++--- src/Console/Commands/CuidsGenerateCommand.php | 2 +- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/Blueprint/PostProcessorRunner.php b/src/Blueprint/PostProcessorRunner.php index ca7c6ba..8264427 100644 --- a/src/Blueprint/PostProcessorRunner.php +++ b/src/Blueprint/PostProcessorRunner.php @@ -9,10 +9,10 @@ public function __construct( ) { } - public function run(string $model): void + public function run(string $model, array $fields): void { foreach ($this->processors as $processor) { - $processor->handle($model); + $processor->handle($model, $fields); } } } diff --git a/src/Blueprint/PostProcessors/TestPostProcessor.php b/src/Blueprint/PostProcessors/TestPostProcessor.php index 8ebd9b9..46c33b7 100644 --- a/src/Blueprint/PostProcessors/TestPostProcessor.php +++ b/src/Blueprint/PostProcessors/TestPostProcessor.php @@ -7,7 +7,7 @@ class TestPostProcessor { - public function handle(string $model): void + public function handle(string $model, array $fields): void { $path = base_path("tests/Feature/Http/Controllers/{$model}ControllerTest.php"); @@ -25,6 +25,7 @@ public function handle(string $model): void '{{ route }}' => Str::kebab(Str::plural($model)), '{{ table }}' => Str::snake(Str::plural($model)), '{{ variable }}' => Str::camel($model), + '{{ firstKey }}' => $firstKey = array_key_first($fields), ]; $content = str_replace( diff --git a/src/Blueprint/Stubs/controller.test.stub b/src/Blueprint/Stubs/controller.test.stub index a62594d..98ee54c 100644 --- a/src/Blueprint/Stubs/controller.test.stub +++ b/src/Blueprint/Stubs/controller.test.stub @@ -3,6 +3,7 @@ namespace Tests\Feature\Http\Controllers; use App\Models\{{ model }}; +use Database\Factories\UserFactory; use Illuminate\Foundation\Testing\WithFaker; use Tests\TestCase; @@ -13,6 +14,14 @@ class {{ model }}ControllerTest extends TestCase protected function setUp(): void { parent::setUp(); + + $user = UserFactory::new()->create([ + 'tenant_fqn' => 'fake-fqn' + ]); + + session()->put('tenant_fqn', 'fake-fqn'); + + $this->actingAs($user); } public function testIf{{ pluralModel }}AreListedCorrectly(): void @@ -22,7 +31,12 @@ class {{ model }}ControllerTest extends TestCase ->create(); $this->getJson(route('{{ route }}.index')) - ->assertStatus(200); + ->assertJsonStructure([ + 'data', + 'meta', + 'links' + ]) + ->assertOk(); } public function testIf{{ model }}CanBeCreated(): void @@ -32,7 +46,11 @@ class {{ model }}ControllerTest extends TestCase ->toArray(); $this->postJson(route('{{ route }}.store'), $data) - ->assertStatus(201); + ->assertCreated(201); + + $this->assertDatabaseHas('{{ table }}', [ + '{{ firstKey }}' => $data['{{ firstKey }}'], + ]); } public function testIf{{ model }}CanBeShown(): void @@ -41,7 +59,7 @@ class {{ model }}ControllerTest extends TestCase ->create(); $this->getJson(route('{{ route }}.show', $model)) - ->assertStatus(200); + ->assertOk(); } public function testIf{{ model }}CanBeUpdated(): void @@ -54,7 +72,12 @@ class {{ model }}ControllerTest extends TestCase ->toArray(); $this->putJson(route('{{ route }}.update', $model), $updatedData) - ->assertStatus(200); + ->assertOk(); + + $this->assertDatabaseHas('{{ table }}', [ + 'id' => $model->id, + '{{ firstKey }}' => $updatedData['{{ firstKey }}'], + ]); } public function testIf{{ model }}CanBeDeleted(): void @@ -63,7 +86,7 @@ class {{ model }}ControllerTest extends TestCase ->create(); $this->deleteJson(route('{{ route }}.destroy', $model)) - ->assertStatus(204); + ->assertNoContent(); $this->assertSoftDeleted('{{ table }}', [ 'id' => $model->id diff --git a/src/Console/Commands/CuidsGenerateCommand.php b/src/Console/Commands/CuidsGenerateCommand.php index c8884bc..0cf62c3 100644 --- a/src/Console/Commands/CuidsGenerateCommand.php +++ b/src/Console/Commands/CuidsGenerateCommand.php @@ -76,7 +76,7 @@ public function handle() $this->formFieldBuilder->handle($entityStudly, $fields); $this->components->info('Aplicando pós-processadores...'); - $this->postProcessorRunner->run($entityStudly); + $this->postProcessorRunner->run($entityStudly, $fields); $this->components->info("Módulo {$entityStudly} gerado com sucesso!"); } catch (\Exception $e) { From 0598e28219268a3956077f6d9c05e8b5fe1b0065 Mon Sep 17 00:00:00 2001 From: Igor Vinicius Date: Tue, 23 Dec 2025 16:45:15 -0300 Subject: [PATCH 71/71] refactor: Remove wrap null --- src/Blueprint/Stubs/collection.stub | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Blueprint/Stubs/collection.stub b/src/Blueprint/Stubs/collection.stub index 5b14557..208d054 100644 --- a/src/Blueprint/Stubs/collection.stub +++ b/src/Blueprint/Stubs/collection.stub @@ -6,8 +6,6 @@ use Illuminate\Http\Resources\Json\ResourceCollection; class {{ model }}Collection extends ResourceCollection { - public static $wrap = null; - public function toArray($request): array { return $this