From bae9f33ae2cdfc9c172d47286516b850de9f0842 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sun, 7 May 2023 17:20:02 -0700 Subject: [PATCH 01/29] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 28d2e3a..5f959e3 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,8 @@ Checkout our channel on change-log in v2.3 branch and document it in the CrestApps-site repository. For any help, my email can be found in the `composer.json` file, feel free to send me an email. +- **HELP WANTED** Version `v2.3` needs to be documented. If you are able to contribute, please read the change-log in v2.3 branch and document it in the CrestApps-site repository. For any help, my email can be found in the `composer.json` file, feel free to send me an email. +- **HELP WANTED** Need to create a new theme for Bootstrap 5 and make it the default. If interested, please submit a PR. - Please start by ***Staring*** this package on GitHub. - Sharing this projects with others is your way of saying keep improvements and new awesome feature coming. - Report any bugs or send us any comments, idea, thought that you may have about this project as an issue on GitHub. From aebc92f7f9716b537a9722f372f8cfc42d3559ea Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Mon, 11 Sep 2023 12:07:38 -0700 Subject: [PATCH 02/29] Create FUNDING.yml --- .github/FUNDING.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..0ebee40 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,13 @@ +# These are supported funding model platforms + +github: [malhayek] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] From b502395d70683be344c0357d5f50c66e0a65de58 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Mon, 11 Sep 2023 18:28:52 -0700 Subject: [PATCH 03/29] Update FUNDING.yml --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 0ebee40..9a14922 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,6 +1,6 @@ # These are supported funding model platforms -github: [malhayek] +github: malhayek patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username From ddac1eb358c208f1f27df74c204fc07921976e8e Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Mon, 22 Jan 2024 17:47:38 -0800 Subject: [PATCH 04/29] Update themes to Bootstrap 5.3 --- config/default.php | 9 +- .../Api/CreateApiControllerCommand.php | 13 +- src/Commands/Api/CreateApiScaffoldCommand.php | 5 +- .../CreateApiDocsControllerCommand.php | 4 +- .../ApiDocs/CreateApiDocsScaffoldCommand.php | 7 +- .../ApiDocs/CreateApiDocsViewCommand.php | 10 +- src/Commands/Bases/ViewsCommandBase.php | 12 +- .../Views/CreateCreateViewCommand.php | 5 +- src/Commands/Views/CreateFormViewCommand.php | 1 + src/Commands/Views/CreateIndexViewCommand.php | 62 ++ .../Views/CreateViewLayoutCommand.php | 6 +- src/Models/ViewInput.php | 4 +- src/Traits/CommonCommand.php | 2 +- .../api-documentation-index.stub | 677 +++++++++--------- .../controller-affirm-method.stub | 2 +- .../controller-upload-method-5.3.stub | 13 +- .../controller-upload-method.stub | 2 +- templates/default-collective/controller.stub | 18 +- .../default-collective/create.blade.stub | 26 +- templates/default-collective/edit.blade.stub | 29 +- .../form-file-field.blade.stub | 26 +- .../form-helper-field.blade.stub | 2 +- .../form-input-wrapper.blade.stub | 2 +- .../form-label-field.blade.stub | 2 +- .../form-month-field.blade.stub | 2 +- .../form-nolabel-field.blade.stub | 2 +- .../form-pickitems-field.blade.stub | 9 +- .../form-pickitems-inline-field.blade.stub | 10 +- .../form-selectmenu-field.blade.stub | 2 +- .../form-selectrange-field.blade.stub | 2 +- templates/default-collective/index.blade.stub | 76 +- .../layout-with-validation.stub | 346 ++++----- templates/default-collective/layout.stub | 323 +++++---- templates/default-collective/show.blade.stub | 14 +- .../default/api-documentation-index.stub | 677 +++++++++--------- templates/default/create.blade.stub | 26 +- templates/default/edit.blade.stub | 29 +- templates/default/form-file-field.blade.stub | 26 +- .../default/form-helper-field.blade.stub | 2 +- .../default/form-input-wrapper.blade.stub | 4 +- templates/default/form-label-field.blade.stub | 2 +- templates/default/form-month-field.blade.stub | 2 +- .../default/form-nolabel-field.blade.stub | 2 +- .../default/form-pickitems-field.blade.stub | 8 +- .../form-pickitems-inline-field.blade.stub | 10 +- .../default/form-selectmenu-field.blade.stub | 2 +- .../default/form-selectrange-field.blade.stub | 2 +- .../default/form-textarea-field.blade.stub | 2 +- templates/default/index.blade.stub | 43 +- templates/default/index.body.cell.blade.stub | 2 +- templates/default/layout-with-validation.stub | 346 ++++----- templates/default/layout.stub | 323 +++++---- templates/default/pagination.blade.stub | 50 ++ templates/default/show.blade.stub | 54 +- templates/default/show.row.blade.stub | 4 +- 55 files changed, 1722 insertions(+), 1619 deletions(-) create mode 100644 templates/default/pagination.blade.stub diff --git a/config/default.php b/config/default.php index 659e5e3..aad76b2 100644 --- a/config/default.php +++ b/config/default.php @@ -161,7 +161,7 @@ |-------------------------------------------------------------------------- | */ - 'api_docs_controller_path' => 'Http/Controllers/ApiDocs', + 'api_docs_controller_path' => 'Http/Controllers', /* |-------------------------------------------------------------------------- @@ -338,10 +338,13 @@ ], ], [ - 'match' => ['picture', 'file', 'photo', 'avatar'], + 'match' => ['picture', 'file', 'photo', 'avatar', 'image', 'document', 'attachment*'], 'set' => [ 'is-on-index' => false, 'html-type' => 'file', + 'data-type' => 'string', + 'data-type-params' => [2500], + 'validation' => 'file', ], ], [ @@ -373,7 +376,7 @@ ], ], [ - 'match' => ['created_at', 'updated_at', 'deleted_at'], + 'match' => ['created_at', 'updated_at', 'deleted_at', 'modified_at'], 'set' => [ 'data-type' => 'datetime', 'is-on-form' => false, diff --git a/src/Commands/Api/CreateApiControllerCommand.php b/src/Commands/Api/CreateApiControllerCommand.php index f2ae243..f2f1a74 100644 --- a/src/Commands/Api/CreateApiControllerCommand.php +++ b/src/Commands/Api/CreateApiControllerCommand.php @@ -28,7 +28,7 @@ class CreateApiControllerCommand extends ControllerCommandBase */ protected $signature = 'create:api-controller {model-name : The model name that this controller will represent.} - {--controller-name= : The name of the controler.} + {--controller-name= : The name of the controller.} {--controller-directory= : The directory where the controller should be created under.} {--model-directory= : The path where the model should be created under.} {--resource-file= : The name of the resource-file to import from.} @@ -37,7 +37,7 @@ class CreateApiControllerCommand extends ControllerCommandBase {--language-filename= : The languages file name to put the labels in.} {--with-form-request : This will extract the validation into a request form class.} {--without-form-request : Generate the controller without the form-request file. } - {--with-auth : Generate the controller with Laravel auth middlewear. } + {--with-auth : Generate the controller with Laravel auth middleware. } {--template-name= : The template name to use when generating the code.} {--form-request-directory= : The directory of the form-request.} {--controller-extends=default-controller : The base controller to be extend.} @@ -46,7 +46,7 @@ class CreateApiControllerCommand extends ControllerCommandBase {--api-resource-collection-directory= : The directory where the api-resource-collection should be created.} {--api-resource-name= : The api-resource file name.} {--api-resource-collection-name= : The api-resource-collection file name.} - {--api-version= : The api version to prefix your resurces with.} + {--api-version= : The api version to prefix your resources with.} {--force : This option will override the controller if one already exists.}'; /** @@ -74,7 +74,7 @@ public function handle() if ($input->withApiResource) { if (!Helpers::isApiResourceSupported()) { - $this->info('Api-resource is not supported in the current Laravel version. To use Api-resource, pleae upgrade to Laravel 5.5+.'); + $this->info('Api-resource is not supported in the current Laravel version. To use Api-resource, please upgrade to Laravel 5.5+.'); $this->warn('*** Continuing without create api-resource! ***'); } else { $this->makeApiResource($input, false) @@ -162,7 +162,7 @@ protected function getAdditionalNamespaces($input) protected function getNamespacesForUsedRelations(array $fields) { // Since there is no create/edit forms in the API controller, - // No need for any relation's namespances. + // No need for any relation's namespaces. return []; } @@ -498,6 +498,9 @@ protected function getCommandInput() { $input = parent::getCommandInput(); + $cName = trim($this->option('controller-name')); + $input->controllerName = $cName ? Str::finish($cName, Config::getControllerNamePostFix()) : Helpers::makeControllerName($modelName . 'Api'); + $input->apiResourceDirectory = trim($this->option('api-resource-directory')); $input->apiResourceCollectionDirectory = trim($this->option('api-resource-collection-directory')); $input->apiResourceName = trim($this->option('api-resource-name')); diff --git a/src/Commands/Api/CreateApiScaffoldCommand.php b/src/Commands/Api/CreateApiScaffoldCommand.php index 4fcd620..b2a49c8 100644 --- a/src/Commands/Api/CreateApiScaffoldCommand.php +++ b/src/Commands/Api/CreateApiScaffoldCommand.php @@ -193,7 +193,7 @@ protected function createRoutes(ApiScaffoldInput $input, Field $primaryField = n } /** - * Get the Api folder after removing the controllers path. + * Get the API folder after removing the controllers path. * * @param string $path * @@ -222,6 +222,9 @@ protected function getCommandInput() { $input = new ApiScaffoldInput(parent::getCommandInput()); + $cName = trim($this->option('controller-name')); + + $input->controllerName = $cName ? Str::finish($cName, Config::getControllerNamePostFix()) : Helpers::makeControllerName($input->modelName . 'Api'); $input->withApiResource = $this->option('with-api-resource'); $input->apiResourceDirectory = $this->option('api-resource-directory'); $input->apiResourceCollectionDirectory = $this->option('api-resource-collection-directory'); diff --git a/src/Commands/ApiDocs/CreateApiDocsControllerCommand.php b/src/Commands/ApiDocs/CreateApiDocsControllerCommand.php index 843ef56..5fcbd89 100644 --- a/src/Commands/ApiDocs/CreateApiDocsControllerCommand.php +++ b/src/Commands/ApiDocs/CreateApiDocsControllerCommand.php @@ -199,7 +199,7 @@ protected function getControllerDirectory($controllerDirectory) } /** - * Gets the destenation file to be created. + * Gets the destination file to be created. * * @param string $name * @param string $path @@ -262,7 +262,7 @@ protected function getCommandInput() { $modelName = trim($this->argument('model-name')); $cName = trim($this->option('controller-name')); - $controllerName = $cName ? Str::finish($cName, Config::getControllerNamePostFix()) : Helpers::makeControllerName($modelName); + $controllerName = $cName ? Str::finish($cName, Config::getControllerNamePostFix()) : Helpers::makeControllerName($modelName . 'ApiDocs'); $prefix = ($this->option('routes-prefix') == 'default-form') ? Helpers::makeRouteGroup($modelName) : $this->option('routes-prefix'); $resourceFile = trim($this->option('resource-file')) ?: Helpers::makeJsonFileName($modelName); $force = $this->option('force'); diff --git a/src/Commands/ApiDocs/CreateApiDocsScaffoldCommand.php b/src/Commands/ApiDocs/CreateApiDocsScaffoldCommand.php index bc13713..8c4454e 100644 --- a/src/Commands/ApiDocs/CreateApiDocsScaffoldCommand.php +++ b/src/Commands/ApiDocs/CreateApiDocsScaffoldCommand.php @@ -7,10 +7,12 @@ use CrestApps\CodeGenerator\Traits\CommonCommand; use CrestApps\CodeGenerator\Traits\ScaffoldTrait; use Illuminate\Console\Command; +use CrestApps\CodeGenerator\Support\Helpers; +use CrestApps\CodeGenerator\Traits\LanguageTrait; class CreateApiDocsScaffoldCommand extends command { - use ApiDocViewsTrait, CommonCommand, ScaffoldTrait; + use ApiDocViewsTrait, CommonCommand, ScaffoldTrait, LanguageTrait; /** * The console command description. @@ -169,7 +171,8 @@ protected function createLanguageFile($input) protected function getCommandInput() { $modelName = $this->argument('model-name'); - $controllerName = $this->option('controller-name'); + $cName = trim($this->option('controller-name')); + $controllerName = $cName ? Str::finish($cName, Config::getControllerNamePostFix()) : Helpers::makeControllerName($modelName . 'ApiDocs'); $prefix = $this->option('routes-prefix'); $resourceFile = $this->option('resource-file'); $force = $this->option('force'); diff --git a/src/Commands/ApiDocs/CreateApiDocsViewCommand.php b/src/Commands/ApiDocs/CreateApiDocsViewCommand.php index 27da053..5a84caa 100644 --- a/src/Commands/ApiDocs/CreateApiDocsViewCommand.php +++ b/src/Commands/ApiDocs/CreateApiDocsViewCommand.php @@ -35,15 +35,15 @@ class CreateApiDocsViewCommand extends Command */ protected $signature = 'api-docs:create-view {model-name : The model name that this controller will represent.} - {--controller-name= : The name of the controler.} + {--controller-name= : The name of the controller.} {--controller-directory= : The directory where the controller should be created under.} {--resource-file= : The name of the resource-file to import from.} {--routes-prefix=default-form : Prefix of the route group.} {--language-filename= : The languages file name to put the labels in.} - {--with-auth : Generate the controller with Laravel auth middlewear. } + {--with-auth : Generate the controller with Laravel auth middleware. } {--views-directory= : The name of the directory to create the views under.} - {--api-version= : The api version to prefix your resurces with.} - {--layout-name=layouts.api-doc-layout : This will extract the validation into a request form class.} + {--api-version= : The api version to prefix your resources with.} + {--layout-name=layouts.app : This will extract the validation into a request form class.} {--template-name= : The template name to use when generating the code.} {--force : This option will override the controller if one already exists.}'; @@ -205,7 +205,7 @@ protected function makeStandardSubView($name, $input, array $apiDocLabels, array } /** - * Gets the destenation file to be created. + * Gets the destination file to be created. * * @param string $name * @param string $path diff --git a/src/Commands/Bases/ViewsCommandBase.php b/src/Commands/Bases/ViewsCommandBase.php index c9e228c..e12722f 100644 --- a/src/Commands/Bases/ViewsCommandBase.php +++ b/src/Commands/Bases/ViewsCommandBase.php @@ -63,7 +63,7 @@ protected function getViewName() } /** - * It gets the views destenation path + * It gets the views destination path * * @param $viewsDirectory * @@ -119,7 +119,7 @@ protected function getDestinationViewFullname($viewsDirectory, $routesPrefix, $v } /** - * It generate the destenation view name + * It generate the destination view name * * @param $action * @@ -138,7 +138,7 @@ protected function getDestinationViewName($action) * * @return $this */ - protected function replaceCommonTemplates(&$stub, ViewInput $input, array $fields) + protected function replaceCommonTemplates(&$stub, $input, array $fields) { $viewLabels = new ViewLabelsGenerator($input->modelName, $fields, $this->isCollectiveTemplate()); @@ -222,7 +222,7 @@ protected function replaceFormName(&$stub, $name) /** * Get the view's name of a given file. * - * @param string $fillname + * @param string $filename * * @return string */ @@ -347,7 +347,7 @@ protected function createLanguageFile($langFile, $resourceFile, $modelName) } /** - * Gets destenation view path + * Gets destination view path * * @param string $viewsDirectory * @param string $routesPrefix @@ -413,7 +413,7 @@ protected function getHtmlGenerator(array $fields, $modelName, $template) } /** - * Replace the modele's header fo the given stub. + * Replace the model's header for the given stub. * * @param string $stub * @param string $title diff --git a/src/Commands/Views/CreateCreateViewCommand.php b/src/Commands/Views/CreateCreateViewCommand.php index 7d9cc75..a451779 100644 --- a/src/Commands/Views/CreateCreateViewCommand.php +++ b/src/Commands/Views/CreateCreateViewCommand.php @@ -48,6 +48,7 @@ protected function getStubName() protected function handleCreateView() { $input = $this->getCommandInput(); + $resources = Resource::fromFile($input->resourceFile, $input->languageFileName); $destenationFile = $this->getDestinationViewFullname($input->viewsDirectory, $input->prefix); @@ -68,7 +69,7 @@ protected function handleCreateView() } /** - * Gets te create form name + * Gets the create form name * * @param string $modelName * @@ -80,7 +81,7 @@ protected function getFormName($modelName) } /** - * Gets te create form id + * Gets the create form id * * @param string $modelName * diff --git a/src/Commands/Views/CreateFormViewCommand.php b/src/Commands/Views/CreateFormViewCommand.php index b2d2ef5..f09a1f2 100644 --- a/src/Commands/Views/CreateFormViewCommand.php +++ b/src/Commands/Views/CreateFormViewCommand.php @@ -48,6 +48,7 @@ protected function handleCreateView() { $input = $this->getCommandInput(); $resources = Resource::fromFile($input->resourceFile, $input->languageFileName); + $destenationFile = $this->getDestinationViewFullname($input->viewsDirectory, $input->prefix); if ($this->canCreateView($destenationFile, $input->force, $resources)) { diff --git a/src/Commands/Views/CreateIndexViewCommand.php b/src/Commands/Views/CreateIndexViewCommand.php index a58cde1..983ebe8 100644 --- a/src/Commands/Views/CreateIndexViewCommand.php +++ b/src/Commands/Views/CreateIndexViewCommand.php @@ -4,9 +4,13 @@ use CrestApps\CodeGenerator\Commands\Bases\ViewsCommandBase; use CrestApps\CodeGenerator\Models\Resource; +use CrestApps\CodeGenerator\Support\Helpers; +use CrestApps\CodeGenerator\Traits\LanguageTrait; class CreateIndexViewCommand extends ViewsCommandBase { + use LanguageTrait; + /** * The name and signature of the console command. * @@ -19,6 +23,7 @@ class CreateIndexViewCommand extends ViewsCommandBase {--routes-prefix=default-form : Prefix of the route group.} {--language-filename= : The name of the language file.} {--layout-name=layouts.app : This will extract the validation into a request form class.} + {--pagination-view-name=pagination : the name of the view to use for pagination.} {--template-name= : The template name to use when generating the code.} {--force : This option will override the view if one already exists.}'; @@ -47,9 +52,19 @@ protected function getStubName() protected function handleCreateView() { $input = $this->getCommandInput(); + $resources = Resource::fromFile($input->resourceFile, $input->languageFileName); $destenationFile = $this->getDestinationViewFullname($input->viewsDirectory, $input->prefix); + $paginationFileName = $this->getDestinationViewFullname($input->viewsDirectory, '', $input->paginationViewName); + + if(!$this->alreadyExists($paginationFileName)) + { + $pagerStub = $this->getStubContent('pagination.blade', $this->getTemplateName()); + + $this->createFile($paginationFileName, $pagerStub); + } + if ($this->canCreateView($destenationFile, $input->force, $resources)) { $stub = $this->getStub(); $htmlCreator = $this->getHtmlGenerator($resources->fields, $input->modelName, $this->getTemplateName()); @@ -59,11 +74,58 @@ protected function handleCreateView() ->replaceHeaderCells($stub, $htmlCreator->getIndexHeaderCells()) ->replaceBodyCells($stub, $htmlCreator->getIndexBodyCells()) ->replaceModelHeader($stub, $this->getHeaderFieldAccessor($resources->fields, $input->modelName)) + ->replacePaginationViewName($stub, $input->paginationViewName) ->createFile($destenationFile, $stub) ->info('Index view was crafted successfully.'); } } + /** + * Replaces the fillable for the given stub. + * + * @param string $stub + * @param string $fillable + * + * @return $this + */ + protected function replacePaginationViewName(&$stub, $name) + { + return $this->replaceTemplate('pagination_view_name', $name, $stub); + } + + /** + * Gets a clean user inputs. + * + * @return object + */ + protected function getCommandInput() + { + $options = $this->options(); + + $modelName = trim($this->arguments()['model-name']); + $resourceFile = trim($options['resource-file']) ?: Helpers::makeJsonFileName($modelName); + $viewsDirectory = trim($options['views-directory']); + $prefix = trim($options['routes-prefix']); + $prefix = ($prefix == 'default-form') ? Helpers::makeRouteGroup($modelName) : $prefix; + $force = $options['force']; + $languageFileName = trim($options['language-filename']) ?: self::makeLocaleGroup($modelName); + $layout = trim($options['layout-name']); + $template = trim($options['template-name']); + $paginationViewName = trim($options['pagination-view-name']); + + return (object) compact( + 'modelName', + 'prefix', + 'force', + 'resourceFile', + 'languageFileName', + 'layout', + 'template', + 'paginationViewName', + 'viewsDirectory' + ); + } + /** * Replaces the column headers in a given stub. * diff --git a/src/Commands/Views/CreateViewLayoutCommand.php b/src/Commands/Views/CreateViewLayoutCommand.php index 181cc09..0d741e6 100644 --- a/src/Commands/Views/CreateViewLayoutCommand.php +++ b/src/Commands/Views/CreateViewLayoutCommand.php @@ -25,7 +25,7 @@ class CreateViewLayoutCommand extends Command {--layout-directory=layouts : The directory of the layouts.} {--without-validation : This option will create a layout without client-side validation.} {--template-name= : The template name to use when generating the code.} - {--force : Override existsing layout.}'; + {--force : Override existing layout.}'; /** * The console command description. @@ -96,7 +96,7 @@ protected function fileExists($filename, $force) } /** - * Gets the destenation path. + * Gets the destination path. * * @param string $path * @@ -128,7 +128,7 @@ protected function getCommandInput() } /** - * Replaces the application'd name fo the given stub. + * Replaces the application's name for the given stub. * * @param string $stub * @param string $appName diff --git a/src/Models/ViewInput.php b/src/Models/ViewInput.php index ef4bac8..bf02a31 100644 --- a/src/Models/ViewInput.php +++ b/src/Models/ViewInput.php @@ -31,7 +31,7 @@ class ViewInput public $viewsDirectory; /** - * The provided route's pre-fix + * The provided route's prefix * * @var string */ @@ -77,7 +77,7 @@ public function __construct(array $arguments, array $options = []) } /** - * Gets array of the paramets + * Gets array of the parameters * * @return array */ diff --git a/src/Traits/CommonCommand.php b/src/Traits/CommonCommand.php index 92c1f86..4530d5b 100644 --- a/src/Traits/CommonCommand.php +++ b/src/Traits/CommonCommand.php @@ -295,7 +295,7 @@ protected function getStubByName($name, $template = null) protected function replaceRouteNames(&$stub, $modelName, $routesPrefix, array $actions = null) { foreach (($actions ?: $this->actions) as $action) { - $routeName = $this->getDotNotationName($modelName, $routesPrefix, $action); + $routeName = $this->getDotNotationName($this->getModelName($modelName), $routesPrefix, $action); $routeTemplate = $this->getRouteName($action); $stub = $this->strReplace($routeTemplate, $routeName, $stub); } diff --git a/templates/default-collective/api-documentation-index.stub b/templates/default-collective/api-documentation-index.stub index 00d7519..2816e9f 100644 --- a/templates/default-collective/api-documentation-index.stub +++ b/templates/default-collective/api-documentation-index.stub @@ -7,411 +7,380 @@

[% available_resources %]

-
-
- -
-
GET
- /{{ Route::getRoutes()->getByName('[% index_route_name %]')->uri() }} - [% index_route_description %] -
-
- - - -
+
+
+
+ GET + /{{ Route::getRoutes()->getByName('[% index_route_name %]')->uri() }} +

[% index_route_description %]

- -
-
-

[% request_title %]

- [% authorized_request_for_index %] - -
-

[% response_title %]

- -

[% index_route_response_description %]

-

- -

200 - Ok

-

[% request_was_successful %]

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
success[% boolean_title %]Was the request successful or not.
message[% string_title %][% the_success_message %]
data[% array_title %] - [% the_key_is_the_model_property_and_the_value_is_the_model_value %] -
links[% array_title %] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[% key_title %][% data_type_title %][% description_title %]
first[% string_title %][% link_to_retrieve_first_page %]
last[% string_title %][% link_to_retrieve_last_page %]
prev[% string_title %][% link_to_retrieve_previous_page %]
next[% string_title %][% link_to_retrieve_next_page %]
- -
meta[% array_title %] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[% key_title %][% data_type_title %][% description_title %]
current_page[% integer_title %][% the_number_of_current_page %]
from[% integer_title %][% the_index_of_the_first_retrieved_item %]
last_page[% integer_title %][% the_number_of_the_last_page %]
Path[% string_title %][% the_base_link_to_the_resource %]
per_page[% integer_title %][% the_number_of_models_per_page %]
to[% integer_title %][% the_index_of_the_last_retrieved_item %]
total[% integer_title %][% the_total_of_available_pages %]
- -
- - [% include_failed_authentication_for_authorized_request %] - -
+
+
+
+

[% request_title %]

+ [% authorized_request_for_index %] + +
+

[% response_title %]

+ +

[% index_route_response_description %]

+

+ +

200 - Ok

+

[% request_was_successful %]

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
success[% boolean_title %]Was the request successful or not.
message[% string_title %][% the_success_message %]
data[% array_title %] + [% the_key_is_the_model_property_and_the_value_is_the_model_value %] +
links[% array_title %] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[% key_title %][% data_type_title %][% description_title %]
first[% string_title %][% link_to_retrieve_first_page %]
last[% string_title %][% link_to_retrieve_last_page %]
prev[% string_title %][% link_to_retrieve_previous_page %]
next[% string_title %][% link_to_retrieve_next_page %]
+ +
meta[% array_title %] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[% key_title %][% data_type_title %][% description_title %]
current_page[% integer_title %][% the_number_of_current_page %]
from[% integer_title %][% the_index_of_the_first_retrieved_item %]
last_page[% integer_title %][% the_number_of_the_last_page %]
Path[% string_title %][% the_base_link_to_the_resource %]
per_page[% integer_title %][% the_number_of_models_per_page %]
to[% integer_title %][% the_index_of_the_last_retrieved_item %]
total[% integer_title %][% the_total_of_available_pages %]
+ +
+ + [% include_failed_authentication_for_authorized_request %] -
-
- -
-
POST
- /{{ Route::getRoutes()->getByName('[% store_route_name %]')->uri() }} - [% store_route_description %] -
-
+
+
- -
+
+
+
+ POST + /{{ Route::getRoutes()->getByName('[% store_route_name %]')->uri() }} +

[% store_route_description %]

- -
-
-

[% request_title %]

- - @include('[% path_to_view_home %]fields-list', [ - 'withValidation' => true - ]) - -
-

[% response_title %]

-

[% store_route_response_description %]

-

- - @include('[% path_to_view_home %]retrieved') - @include('[% path_to_view_home %]failed-to-retrieve') - @include('[% path_to_view_home %]failed-validation') - [% include_failed_authentication_for_authorized_request %] - -
+
+
+
+

[% request_title %]

+ + @include('[% path_to_view_home %]fields-list', [ + 'withValidation' => true + ]) +
+

[% response_title %]

+

[% store_route_response_description %]

+

-
-
+ @include('[% path_to_view_home %]retrieved') + @include('[% path_to_view_home %]failed-to-retrieve') + @include('[% path_to_view_home %]failed-validation') + [% include_failed_authentication_for_authorized_request %] + +
+
-
-
POST
- /{{ Route::getRoutes()->getByName('[% update_route_name %]')->uri() }} - [% update_route_description %] -
-
- -
+
+
+
+ POST + /{{ Route::getRoutes()->getByName('[% update_route_name %]')->uri() }} +

[% update_route_description %]

+
+
+
+
-
-
+
+
-

[% request_title %]

+

[% request_title %]

- @include('[% path_to_view_home %]fields-list', [ - 'withValidation' => true, - 'withPathId' => true, - ]) + @include('[% path_to_view_home %]fields-list', [ + 'withValidation' => true, + 'withPathId' => true, + ]) -
-

[% response_title %]

-

[% update_route_response_description %]

-

- - @include('[% path_to_view_home %]retrieved') - @include('[% path_to_view_home %]failed-to-retrieve') - @include('[% path_to_view_home %]failed-validation') - [% include_failed_authentication_for_authorized_request %] +
+

[% response_title %]

+

[% update_route_response_description %]

+

+ + @include('[% path_to_view_home %]retrieved') + @include('[% path_to_view_home %]failed-to-retrieve') + @include('[% path_to_view_home %]failed-validation') + [% include_failed_authentication_for_authorized_request %] -
+
-
-
- -
-
GET
- /{{ Route::getRoutes()->getByName('[% show_route_name %]')->uri() }} - [% show_route_description %] -
-
- - - - -
+
+
+
+ GET + /{{ Route::getRoutes()->getByName('[% show_route_name %]')->uri() }} +

[% show_route_description %]

- -
-
- -

[% request_title %]

- - - - - - - - - - - - [% include_parameter_for_authorized_request %] - - - - - - - -
[% parameter_name_title %][% data_type_title %][% parameter_type_title %][% description_title %]
[% model_name %][% integer_title %][% path_title %][% the_id_of_model_to_retrieve %]
- - -
-

[% response_title %]

-

[% show_route_response_description %]

-

- - @include('[% path_to_view_home %]retrieved') - @include('[% path_to_view_home %]failed-to-retrieve') - [% include_failed_authentication_for_authorized_request %] - -
+
+
+
+ +

[% request_title %]

+ + + + + + + + + + + + [% include_parameter_for_authorized_request %] + + + + + + + +
[% parameter_name_title %][% data_type_title %][% parameter_type_title %][% description_title %]
[% model_name %][% integer_title %][% path_title %][% the_id_of_model_to_retrieve %]
+ + +
+

[% response_title %]

+

[% show_route_response_description %]

+

+ + @include('[% path_to_view_home %]retrieved') + @include('[% path_to_view_home %]failed-to-retrieve') + [% include_failed_authentication_for_authorized_request %] +
+
-
-
- -
-
DELETE
- /{{ Route::getRoutes()->getByName('[% destroy_route_name %]')->uri() }} - [% destroy_route_description %] -
-
- - -
+
+
+
+ DELETE + /{{ Route::getRoutes()->getByName('[% destroy_route_name %]')->uri() }} +

[% destroy_route_description %]

- -
-
- -

[% request_title %]

- - - - - - - - - - - - [% include_parameter_for_authorized_request %] - - - - - - - -
[% parameter_name_title %][% data_type_title %][% parameter_type_title %][% description_title %]
[% model_name %][% integer_title %][% path_title %][% the_id_of_model_to_delete %]
- - -
-

[% response_title %]

-

[% destroy_route_response_description %]

-

- - @include('[% path_to_view_home %]retrieved') - @include('[% path_to_view_home %]failed-to-retrieve') - [% include_failed_authentication_for_authorized_request %] - -
+
+
-
+
+ +

[% request_title %]

+ + + + + + + + + + + + [% include_parameter_for_authorized_request %] + + + + + + + +
[% parameter_name_title %][% data_type_title %][% parameter_type_title %][% description_title %]
[% model_name %][% integer_title %][% path_title %][% the_id_of_model_to_delete %]
+ + +
+

[% response_title %]

+

[% destroy_route_response_description %]

+

+ + @include('[% path_to_view_home %]retrieved') + @include('[% path_to_view_home %]failed-to-retrieve') + [% include_failed_authentication_for_authorized_request %] -

[% model_definition_title %]

-
-
+
-
- [% model_name_title %] -
-
+
- +
-
+

[% model_definition_title %]

+
+
+
+ [% model_name_title %]
- -
-
- - - - - - - - - - [% fields_list_for_body %] - -
[% field_name_title %][% field_type_title %][% description_title %]
-
+
+
-
+
+ + + + + + + + + + [% fields_list_for_body %] + +
[% field_name_title %][% field_type_title %][% description_title %]
+
+
@endsection diff --git a/templates/default-collective/controller-affirm-method.stub b/templates/default-collective/controller-affirm-method.stub index 7e76d9d..7d4f94f 100644 --- a/templates/default-collective/controller-affirm-method.stub +++ b/templates/default-collective/controller-affirm-method.stub @@ -2,7 +2,7 @@ /** * Validate the given request with the defined rules. * - * @param [% request_fullname %] $request + * @param [% request_fullname %] $request * * @return boolean */ diff --git a/templates/default-collective/controller-upload-method-5.3.stub b/templates/default-collective/controller-upload-method-5.3.stub index 69c3e91..45b9a51 100644 --- a/templates/default-collective/controller-upload-method-5.3.stub +++ b/templates/default-collective/controller-upload-method-5.3.stub @@ -2,7 +2,7 @@ /** * Moves the attached file to the server. * - * @param Symfony\Component\HttpFoundation\File\UploadedFile $file + * @param \Symfony\Component\HttpFoundation\File\UploadedFile $file * * @return string */ @@ -12,9 +12,8 @@ return ''; } - $fileName = sprintf('%s.%s', uniqid(), $file->getClientOriginalExtension()); - $destinationPath = config('laravel-code-generator.files_upload_path','uploads'); - $path = $file->move($destinationPath, $fileName); - - return $destinationPath . '/' . $fileName; - } \ No newline at end of file + $path = config('laravel-code-generator.files_upload_path', 'uploads'); + $saved = $file->store('public/' . $path, config('filesystems.default')); + + return substr($saved, 7); + } diff --git a/templates/default-collective/controller-upload-method.stub b/templates/default-collective/controller-upload-method.stub index 69c3e91..3354a45 100644 --- a/templates/default-collective/controller-upload-method.stub +++ b/templates/default-collective/controller-upload-method.stub @@ -2,7 +2,7 @@ /** * Moves the attached file to the server. * - * @param Symfony\Component\HttpFoundation\File\UploadedFile $file + * @param \Symfony\Component\HttpFoundation\File\UploadedFile $file * * @return string */ diff --git a/templates/default-collective/controller.stub b/templates/default-collective/controller.stub index cbe851c..bbdb6b6 100644 --- a/templates/default-collective/controller.stub +++ b/templates/default-collective/controller.stub @@ -11,7 +11,7 @@ class [% controller_name %] [% controller_extends %] /** * Display a listing of the [% model_name_plural %]. * - * @return Illuminate\View\View + * @return \Illuminate\View\View */ public function index() { @@ -23,7 +23,7 @@ class [% controller_name %] [% controller_extends %] /** * Show the form for creating a new [% model_name %]. * - * @return Illuminate\View\View + * @return \Illuminate\View\View */ public function create() { @@ -37,7 +37,7 @@ class [% controller_name %] [% controller_extends %] * * @param [% request_fullname %] [% request_variable %] * - * @return Illuminate\Http\RedirectResponse | Illuminate\Routing\Redirector + * @return \Illuminate\Http\RedirectResponse | \Illuminate\Routing\Redirector */ public function store([% type_hinted_request_name %]) { @@ -61,7 +61,7 @@ class [% controller_name %] [% controller_extends %] * * @param int $id * - * @return Illuminate\View\View + * @return \Illuminate\View\View */ public function show($id) { @@ -75,7 +75,7 @@ class [% controller_name %] [% controller_extends %] * * @param int $id * - * @return Illuminate\View\View + * @return \Illuminate\View\View */ public function edit($id) { @@ -88,10 +88,10 @@ class [% controller_name %] [% controller_extends %] /** * Update the specified [% model_name %] in the storage. * - * @param int $id + * @param int $id * @param [% request_fullname %] [% request_variable %] * - * @return Illuminate\Http\RedirectResponse | Illuminate\Routing\Redirector + * @return \Illuminate\Http\RedirectResponse | \Illuminate\Routing\Redirector */ public function update($id, [% type_hinted_request_name %]) { @@ -114,9 +114,9 @@ class [% controller_name %] [% controller_extends %] /** * Remove the specified [% model_name %] from the storage. * - * @param int $id + * @param int $id * - * @return Illuminate\Http\RedirectResponse | Illuminate\Routing\Redirector + * @return \Illuminate\Http\RedirectResponse | \Illuminate\Routing\Redirector */ public function destroy($id) { diff --git a/templates/default-collective/create.blade.stub b/templates/default-collective/create.blade.stub index be65568..130b761 100644 --- a/templates/default-collective/create.blade.stub +++ b/templates/default-collective/create.blade.stub @@ -2,25 +2,18 @@ @section('content') -
- -
- -
-

[% create_model %]

-
- -
+
+
+

[% create_model %]

+ -
-
+
@if ($errors->any())
    @@ -32,7 +25,6 @@ {!! Form::open([ 'route' => '[% store_route_name %]', - 'class' => 'form-horizontal', 'name' => '[% form_name %]', 'id' => '[% form_id %]', [% upload_files %] @@ -40,10 +32,8 @@ !!} @include ('[% form_view_name %]', ['[% model_name_singular_variable %]' => null,]) -
    -
    - {!! Form::submit([% add %], ['class' => 'btn btn-primary']) !!} -
    +
    + {!! Form::submit([% add %], ['class' => 'btn btn-primary']) !!}
    {!! Form::close() !!} diff --git a/templates/default-collective/edit.blade.stub b/templates/default-collective/edit.blade.stub index 3dcc739..e3ae582 100644 --- a/templates/default-collective/edit.blade.stub +++ b/templates/default-collective/edit.blade.stub @@ -2,28 +2,22 @@ @section('content') -
    - -
    - -
    -

    {{ !empty([% model_header %]) ? [% model_header %] : '[% model_name_title %]' }}

    -
    - -
    +
    +
    +

    {{ !empty([% model_header %]) ? [% model_header %] : '[% model_name_title %]' }}

    +
    -
    +
    @if ($errors->any()) @@ -53,7 +53,7 @@ For full documentation and live demo please visit MIT license - From 5af937daa105fa2189b6399e4be7e6fcbd1adff3 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Thu, 25 Jan 2024 17:23:53 -0800 Subject: [PATCH 10/29] Create docs site --- .gitignore | 3 + docs/.gitignore | 20 + docs/README.md | 41 + docs/babel.config.js | 3 + docs/docs/available-commands.md | 577 + docs/docs/configurations.md | 12 + docs/docs/get-started.md | 37 + docs/docs/intro.md | 62 + docs/docs/laravel-collective.md | 36 + docs/docs/release-notes.md | 103 + docs/docs/resource-file.md | 318 + docs/docs/upgrade-guide.md | 16 + docs/docusaurus.config.js | 139 + docs/package-lock.json | 14645 ++++++++++++++++ docs/package.json | 44 + docs/sidebars.js | 33 + docs/src/components/HomepageFeatures/index.js | 64 + .../HomepageFeatures/styles.module.css | 11 + docs/src/css/custom.css | 31 + docs/src/pages/index.js | 43 + docs/src/pages/index.module.css | 23 + docs/src/pages/markdown-page.md | 7 + docs/static/.nojekyll | 0 docs/static/img/crestapps-logo.png | Bin 0 -> 8002 bytes docs/static/img/docusaurus-social-card.jpg | Bin 0 -> 55746 bytes docs/static/img/docusaurus.png | Bin 0 -> 5142 bytes docs/static/img/favicon.ico | Bin 0 -> 3626 bytes docs/static/img/logo.svg | 1 + .../static/img/undraw_docusaurus_mountain.svg | 171 + docs/static/img/undraw_docusaurus_react.svg | 170 + docs/static/img/undraw_docusaurus_tree.svg | 40 + docs/versions.json | 2 + 32 files changed, 16652 insertions(+) create mode 100644 docs/.gitignore create mode 100644 docs/README.md create mode 100644 docs/babel.config.js create mode 100644 docs/docs/available-commands.md create mode 100644 docs/docs/configurations.md create mode 100644 docs/docs/get-started.md create mode 100644 docs/docs/intro.md create mode 100644 docs/docs/laravel-collective.md create mode 100644 docs/docs/release-notes.md create mode 100644 docs/docs/resource-file.md create mode 100644 docs/docs/upgrade-guide.md create mode 100644 docs/docusaurus.config.js create mode 100644 docs/package-lock.json create mode 100644 docs/package.json create mode 100644 docs/sidebars.js create mode 100644 docs/src/components/HomepageFeatures/index.js create mode 100644 docs/src/components/HomepageFeatures/styles.module.css create mode 100644 docs/src/css/custom.css create mode 100644 docs/src/pages/index.js create mode 100644 docs/src/pages/index.module.css create mode 100644 docs/src/pages/markdown-page.md create mode 100644 docs/static/.nojekyll create mode 100644 docs/static/img/crestapps-logo.png create mode 100644 docs/static/img/docusaurus-social-card.jpg create mode 100644 docs/static/img/docusaurus.png create mode 100644 docs/static/img/favicon.ico create mode 100644 docs/static/img/logo.svg create mode 100644 docs/static/img/undraw_docusaurus_mountain.svg create mode 100644 docs/static/img/undraw_docusaurus_react.svg create mode 100644 docs/static/img/undraw_docusaurus_tree.svg create mode 100644 docs/versions.json diff --git a/.gitignore b/.gitignore index 9990b78..fecfefd 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ .DS_Store vendor/ composer.lock + +.vscode/ +.node_modules/ \ No newline at end of file diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..b2d6de3 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..0c6c2c2 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,41 @@ +# Website + +This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. + +### Installation + +``` +$ yarn +``` + +### Local Development + +``` +$ yarn start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. + +### Build + +``` +$ yarn build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +### Deployment + +Using SSH: + +``` +$ USE_SSH=true yarn deploy +``` + +Not using SSH: + +``` +$ GIT_USER= yarn deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/docs/babel.config.js b/docs/babel.config.js new file mode 100644 index 0000000..e00595d --- /dev/null +++ b/docs/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/docs/docs/available-commands.md b/docs/docs/available-commands.md new file mode 100644 index 0000000..8ea9488 --- /dev/null +++ b/docs/docs/available-commands.md @@ -0,0 +1,577 @@ +--- +sidebar_position: 3 +title: Available Commands +--- + +## Available Commands + +The option in between the square brackets `[]` must be replaced with a variable of your choice. + + - **Main commands** + - php artisan create:layout \[application-name\] + - php artisan create:resources \[model-name\] + - php artisan create:controller \[model-name\] + - php artisan create:model \[model-name\] + - php artisan create:form-request \[model-name\] + - php artisan create:routes \[model-name\] + - php artisan create:migration \[model-name\] + - php artisan create:language \[model-name\] + - php artisan create:mapped-resources + - **Views commands** + - php artisan create:views \[model-name\] + - php artisan create:index-view \[model-name\] + - php artisan create:create-view \[model-name\] + - php artisan create:edit-view \[model-name\] + - php artisan create:show-view \[model-name\] + - php artisan create:form-view \[model-name\] + - **Resource's files commands** + - php artisan resource-file:from-database \[model-name\] + - php artisan resource-file:create \[model-name\] + - php artisan resource-file:append \[model-name\] + - php artisan resource-file:reduce \[model-name\] + - php artisan resource-file:delete \[model-name\] + - **Migration commands** + - php artisan migrate-all + - php artisan migrate:rollback-all + - php artisan migrate:reset-all + - php artisan migrate:refresh-all + - php artisan migrate:status-all + +## Important Naming Convention + +Laravel-Code-Generator strive to generate highly readable, and error free code. In order to keep your code readable, it is important to follow a good naming convention when choosing names for your models, fields, tables, relations and so on. Here is a list of recommendation that we believe is important to keep your code clean and highly readable. + +1. Since each model represents a single object/row in a list/database, naming the model should be written in singular-form while using [Studly Case](https://laravel.com/docs/5.5/helpers#method-studly-case). For example, `Post` and `PostCategory`... +2. Since a database is a collection of model's object, table naming should always be plural and written in lowercase while using [Snake Case](https://en.wikipedia.org/wiki/Snake_case). For example, `users`, `post_categories`... +3. Primary keys should be named `id` in the table. +4. Since the foreign key represents a foreign/other table, the name should always end with `_id`. For example, `post_id`, `user_id`, `post_category_id`... +5. Field naming should always be in a singular-form and written in lowercase while using [Snake Case](https://en.wikipedia.org/wiki/Snake_case). For example, `title`, `first_name`, `description`... + + +## Examples + +The following example assumes that we are trying to create a CRUD called AssetCategory with the fields listed below. + + - id + - name + - description + - is_active + + +### Basic example + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +``` +php artisan create:resources AssetCategory``` +``` +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example using translations for English and Arabic + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active --translation-for=en,ar +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +``` +php artisan create:resources AssetCategory +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example with form-request + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +``` +php artisan create:resources AssetCategory --with-form-request +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example with soft-delete and migration + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json`` + +``` +php artisan create:resources AssetCategory --with-soft-delete --with-migration +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Creating resources from existing database. + +``` +php artisan create:resources AssetCategory --table-exists +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + +You may also create a resource-file from existing database separately using `php artisan resource-file:form-database AssetCategory` + + +### Creating resources from existing database with translation for English and Arabic + +``` +php artisan create:resources AssetCategory --table-exists --translation-for=en,ar +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json`` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + +You may also create a [resource-file](./resource-file.md) from existing database separately using + +``` +php artisan resource-file:form-database AssetCategory --translation-for=en,ar +``` + +### Creating resources from existing database with translation for English and Arabic in two step for better control over the fields! + +``` +php artisan resource-file:form-database AssetCategory --translation-for=en,ar +php artisan create:resources AssetCategory +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + + + +## How To + +::: Info +All examples below assumes that you already created a [resource-file](./resource-file.md) (i.e resources/codegenerator-fields/posts.json. This file can be created using the following command `php artisan resource-file:create Post --fields=id,title,details,is_active`) +::: + +### How to create "views-layout"? + +:::note[To create a new layout for your application.] + + ``` + php artisan create:layout [application-name] + ``` + + The argument `[application-name]` should be replaced with the name of the application you are creating. For example: + + ``` + php artisan create:layout "My New Laravel App" + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --layout-filename | The name of the layout file to be used. | `app` (i.e, creates `app.blade.php`) | + | --layout-directory | The directory to create the layout under. | `layouts` | + | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | + | --force | This option will override the layout if one already exists. | | + +::: + + +### How to create resources (complete CRUD)? + +:::note[Create multiple resources at the same time. It can be invoked every time the resource-file is modified to recreate the resources all over again.] + + ``` + php artisan create:resources [model-name] + ``` + + The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:resources Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | + | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | + | --controller-extends | Specify which class should the controller extends. Note: the default value can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `Http\Controllers\Controller` | + | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | + | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | + | --models-per-page | How many models to show per page on the index view. | `25` | + | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | + | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | + | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | + | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | + | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | + | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | + | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | + | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | + | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | + | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | + | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | + | --engine-name | A specific engine name for the database's table can be provided here. | | + | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | + | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | + | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | + | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --template-name | [Described above](#template-name) | | + | --force | This option will override the layout if one already exists. | | + +::: + + +### How to create multiple resources at once? + +:::note[Create multiple resources at the same time] + + ``` + php artisan create:mapped-resources + ``` + +When using `resource-file:create`, `resource-file:from-database` or `resource-file:delete` the `resources_map.json` file is updated behind the scenes. This options create multiple resources for all the resources found in the `resources/laravel-code-generator/sources/resources_map.json` at the same time. The resources can be invoked every time any of the resource-file is modified to recreate the resources all over again. + + | Option | Description | + | ----------- | ----------- | + | --controller-extends | [Described above](#controller-extends) | + | --with-auth | [Described above](#with-auth) | + | --models-per-page | [Described above](#models-per-page) | + | --with-form-request | [Described above](#with-form-request) | + | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | + | --form-request-directory | [Described above](#form-request-directory) | + | --table-exists | [Described above](#table-exists) | + | --translation-for | [Described above](#translation-for) | + | --primary-key | [Described above](#primary-key) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --with-migration | [Described above](#with-migration) | + | --connection-name | [Described above](#connection-name) | + | --engine-name | [Described above](#engine-name) | + | --controller-directory | [Described above](#controller-directory) | + | --model-directory | [Described above](#model-directory) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --mapping-filename | This option allows you to pass the name of the mapping-directory file. When this option is left out, the default `resources_map.json`` file will be used. | + | --force | This option will override the layout if one already exists. | +::: + + +### How to create a controller? + +:::note[Create a controller for your resource.] + + ``` + php artisan create:controller [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:controller Posts + ``` + + | Option | Description | + | ----------- | ----------- | + | --controller-name | [Described above](#controller-name) | + | --controller-directory | [Described above](#controller-directory) | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --models-per-page | [Described above](#models-per-page) | + | --language-filename | [Described above](#language-filename) | + | --with-auth | [Described above](#with-auth) | + | --with-form-request | [Described above](#with-form-request) | + | --without-form-request | [Described above](#without-form-request) | + | --form-request-directory | [Described above](#form-request-directory) | + | --model-directory | [Described above](#model-directory) | + | --views-directory | [Described above](#views-directory) | + | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | + | --without-model | Allow you to create all the resources excluding the model. | + | --without-views | Allow you to create all the resources excluding the views. | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + + + +### How to create a model? + +:::note[Create a model.] + + ``` + php artisan create:model [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:model Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --table-name | [Described above](#table-name) | + | --primary-key | [Described above](#primary-key) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --model-directory | [Described above](#model-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create routes? + +:::note[Create routes for your CRUD operations.] + + ``` + php artisan create:routes [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:routes Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --controller-name | [Described above](#controller-name) | + | --routes-prefix | [Described above](#routes-prefix) | + | --table-name | [Described above](#table-name) | + | --template-name | [Described above](#template-name) | +::: + +### How to create all standard CRUD views (i.e. Create, Read, Update and Delete)? + +> When creating views using the `create:views`, `create:create-view` or `create:update-view` an additional view called "form-view" is created. The "form-view" contains the form fields to prevent code duplication. + +:::note[Create routes for views for CRUD operations.] + + ``` + php artisan create:views [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:views Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | + | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the Create Operation? + +:::note[Create a create-view.] + + ``` + php artisan create:create-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:create-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + + +### How to create a view for the Edit Operation? + +:::note[Create an edit-view.] + + ``` + php artisan create:edit-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:edit-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the List Operation? + +:::note[Create an index-view.] + + ``` + php artisan create:index-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:index-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the Display Operation? + +:::note[Create an show-view.] + + ``` + php artisan create:show-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:show-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a form-view? + +:::note[Create an form-view.] + + ``` + php artisan create:form-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a database migration? + +:::note[Create a database migration.] + + ``` + php artisan create:migration [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:migration Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --table-name | [Described above](#table-name) | + | --resource-file | [Described above](#resource-file) | + | --migration-class-name | [Described above](#migration-class-name) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --connection-name | [Described above](#connection-name) | + | --engine-name | [Described above](#engine-name) | + | --template-name | [Described above](#template-name) | + | --force | This option will override the file if it already exists. | +::: + +### How to create form-request? + +:::note[Create a form-request for request validation.] + + ``` + php artisan create:form-request [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-request Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --class-name | [Described above](#class-name) | + | --resource-file | [Described above](#resource-file) | + | --with-auth | [Described above](#with-auth) | + | --routes-prefix | [Described above](#routes-prefix) | + | --form-request-directory | [Described above](#form-request-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a language file? + +:::note[Create a new language file.] + + ``` + php artisan create:language [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:language Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --language-filename | [Described above](#language-filename) | + | --resource-file | [Described above](#resource-file) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: diff --git a/docs/docs/configurations.md b/docs/docs/configurations.md new file mode 100644 index 0000000..7ce093f --- /dev/null +++ b/docs/docs/configurations.md @@ -0,0 +1,12 @@ +--- +sidebar_position: 5 +title: Configurations +--- + +## Configurations + +Laravel-Code-Generator ships with lots of configurable option to give you control of the generated code. It is strongly recommended that you read the comments block above each option in the config/codegenerator.php file to get familiar with all available options. + +Starting at version 2.2 it ships with a unique way to override/extend the default settings to prevent you from losing your setting when upgrading the package. The config/codegenerator_custom.php is a dedicated file to store your options. This file will always be controlled by you and will never be overridden by the package. To override any configuration found in config/codegenerator.php, simple add the same option in your custom file. The generator will look at the your configuration before falling back to the default config. Note, any array based option will be extended not overridden. For more info read the comment block in the config/codegenerator_custom.php + +The most important option in the configuration file is common_definitions. This option allows you to set the default properties of new field using the name of that field. Your goal should be to generate 100% ready resource-file using this config. It will save you lots of time since all your fields will get generated using the desired properties. In another words, when using `resource-file:create`, `resource-file:append` or `resource-file:from-database` to create resource file, the generated JSON will be 100% ready for you without any manual modification. diff --git a/docs/docs/get-started.md b/docs/docs/get-started.md new file mode 100644 index 0000000..3931537 --- /dev/null +++ b/docs/docs/get-started.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 2 +title: Getting Started +--- + +# Getting Started + +### Installation + +1. To download this package into your Laravel project, use the command-line to execute the following command + +``` +composer require crestapps/laravel-code-generator --dev +``` + +2. (You may skip this step when using Laravel >= 5.5)** To bootstrap the packages into your project while using command-line only, open the app/Providers/AppServiceProvider.php file in your project. Then, add the following code to the `register()` method. + +``` +if ($this->app->runningInConsole()) { + $this->app->register('CrestApps\CodeGenerator\CodeGeneratorServiceProvider'); +} +``` + +3. Execute the following command from the command-line to publish the package's config and the default template to start generating awesome code. + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default +``` + +A layout is required for the default views! The code generator allows you to create a layout using the command-line. Of course you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/) in your layout for the default templates to work properly. Additionally, you can chose to design your own templates using a different or no css framework. For more info on how to create a custom template [click here](https://crestapps.com/laravel-code-generator/docs/2.2#how-to-create-custom-template)! + +### Demo + +Below a video to demonstrate how to use most of the package commands. + + + diff --git a/docs/docs/intro.md b/docs/docs/intro.md new file mode 100644 index 0000000..8523b27 --- /dev/null +++ b/docs/docs/intro.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 1 +title: Introduction +--- + +## CrestApps - Laravel Code Generator + +### Introduction + +Enhance your Laravel development experience with our sophisticated code generator! This powerful tool is designed to streamline your workflow and save you valuable time. Whether you need to create views, controllers, routes, migrations, languages, or request forms, this versatile generator has got you covered – all in just seconds! + +Experience the ultimate flexibility and customization options to cater to a wide range of use cases. Our code generator comes with a cross-browser compatible template and includes client-side validation to bring a modern touch to your application. + +Explore the project's source code on [GitHub](https://github.com/CrestApps/laravel-code-generator), available under the permissive [MIT license](https://opensource.org/licenses/MIT). Upgrade your Laravel development with efficiency and style! + + +### Features + +- Craft clean, reusable, and highly readable code for seamless development. +- Generate complete resources effortlessly with a single command, supporting both migration and existing database scenarios. +- Streamline resource creation for all existing database tables with a single command. +- Save and recreate fields using a JSON file, ensuring adaptability to changing business needs. +- Leverage JSON-based resource files for easy regeneration, even when business rules evolve. +- Generate standard CRUD controllers with simple or form-request validation. +- Customize view templates to alter the standard look and feel of your application. +- Create models with relations for comprehensive data representation. +- Establish named routes with and without grouping for efficient navigation. +- Generate standard CRUD views to facilitate a consistent user experience. +- Smart migration engine tracks generated migrations to only create necessary ones. +- Intelligent handling of model relations to simplify development. +- Highly flexible with rich configurable options to suit diverse needs. +- Easy commands for resource-file creation, addition, or reduction. +- Full support for generating multi-language applications. +- Implement client-side validation for enhanced user interaction. +- Efficiently handle file uploading and store multiple responses in the database. +- Generate form-request to clean up controllers and boost code reusability. +- Create view layouts with and without client-side validation. +- Change templates at runtime for diverse view generation. +- Ability to generate views with or without Laravel-Collective integration. +- Seamless handling of date, time, or datetime fields. +- Automatic management of boolean fields for hassle-free development. + + +### Dependencies + +#### Prerequisite + + - **[Laravel >= 5.1 framework.](https://laravel.com/)** + - **[Composer](https://getcomposer.org/)** installed on your local workstation. + +#### Default template dependencies + + - **[CSS bootstrap Framework.](http://getbootstrap.com/)** This is only required with the default template. You are free to make your own template. + +#### (Optional) Client-side validation dependencies + + - **[jQuery.](https://jquery.com/)** Required only if you want to take advantage of the client + - **[jQuery Validation Plugin.](https://jqueryvalidation.org/)** Only if you want to take advantage of the client side validation. + +#### (Optional) Using Laravel-Collective + +Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](using-laravel-collective.md) diff --git a/docs/docs/laravel-collective.md b/docs/docs/laravel-collective.md new file mode 100644 index 0000000..a19e9aa --- /dev/null +++ b/docs/docs/laravel-collective.md @@ -0,0 +1,36 @@ +--- +sidebar_position: 10 +title: Laravel Collective +--- + +## Using Laravel-Collective to generate views + +:::info + To use Laravel-Collective to generate view, you'll have to install the [Laravel-Collective](https://github.com/LaravelCollective/html) package. + ::: + + Laravel-Code-Generator is capable of fully generating views using Laravel-Collective package. In fact, it is shipped with a template based on Laravel-collective called "default-collective". + +By default, the template "default-collective" is not published to the resources folder as it is not needed out of the box. To publish it, use the command-line to execute the following command. + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective +``` + +### How to generate views using the Laravel-Collective package? + +There are two ways to generate views using Laravel-Collective + +- Via the package configuration + + > Open the config file of the package /config/codegenerator.php change the value of the key template to default-collective + +- Or, via command-line + + > Change the template name at run time. In another words, pass the following option--template-name=default-collective from command-line + +### How to create a new template based on Laravel-Collective? + +First, duplicate the folder `/resources/codegenerator-templates/default-collective`` and name it anything your like. + +Second, open up the package config file and add the new template name to the `laravel_collective_templates` array. diff --git a/docs/docs/release-notes.md b/docs/docs/release-notes.md new file mode 100644 index 0000000..a193f4c --- /dev/null +++ b/docs/docs/release-notes.md @@ -0,0 +1,103 @@ +--- +sidebar_position: 6 +title: Release Notes +--- + +## Release Notes + +Version 2.2 introduces very exciting features, more flexibility and less work for you out of the box! It also, adds support for the new features that were introduced in Laravel 5.5. Follow is a list of all new features and changes that were introduced. + +### New Futures + +#### Smart Migrations Engine + +> Whaaaat?!! Yup that's right, version 2.2 introduce a very powerful feature which keeps track of all your migrations. After migrating, each time, you add/delete a field/index from your resource file, the code-generator will only generate a migration to add/drop and drop/add columns as needed! Keep in mind that you still have to tell the generator that you need to create a new migration using `create:migration` command or the `--with-migration` option for the `create:resources` command. +> +> Another migration related feature was to organizing your migration files! When uses migrations heavily, finding a specific migration may be overwhelming due to the number of file. This feature, allow you to group all your migrations into sub-folders. Please note that this feature is off by default, to turn it on, set organize\_migrations to true. +> +> You're probably thinking "Laravel only detects migrations in the main folder... boooo!" That is correct! However, if you are using Laravel 5.3+, version 2.2 of Laravel-code-generator include five new commands to help you interact with migration from all folders. Check out the "Command Changes" below for more info about the new commands. + +Previously Laravel-Code-Generator was limited to `belongsTo()` type relation. Now, when creating resources from existing database's table, the code-generator is able to create `hasOne()` and `hasMany()` relations by scanning the database's constrains and analyzing its existing data. +In the resource-file you can now define any [Eloquent relations](https://laravel.com/docs/5.5/eloquent-relationships). Each relation should follow the [foreign-relation](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#foreign-relations) schema below. Additionally, you can define [composite/multi-columns](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#composite-indexes) indexes! Each index should follow the [index schema](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#composite-indexes) listed below. +> +> When using Laravel 5.5, you can pass custom Validation Rule object directly in you resource file and the generator will add it to the validation rules! For more info [check out the validation option below](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#field-validation) +> +> Improved the file uploading process to allow you to delete uploaded file +> +> `--indexes` and `--relations` have been added to the following commands `resource-file:create`, `resource-file:append`, or `resource-file:reduce` to allow you to interact with the resource-file freely. +> +> The options `--fields`, `--indexes` and `--relations` for the `resource-file:create`, `resource-file:append`, or `resource-file:reduce` commands accept complex string to allow you to pass more values to add to the resource-file. For example, `--fields="name:colors;html-type:select;options:blue|yellow|green|red|white,name:second_field_name"` + +#### More configurations so you can type less and do more! + +> **plural\_names\_for** was added to the configuration file to allow you to set your own plural-form vs singular-form preference when naming controller, form-request, resource-file, language file, table-name and route group. If you like your controllers to be in a plural-form, you can simply change the default behavior from the configuration file! +> +> **controller\_name\_postfix** was added to the configuration file to allow you to change the controller's postfix. If you don't like to post fix your controllers with the word Controller, you can set this to an empty string or any other value. +> +> **form\_request\_name\_postfix** was added to the configuration file to allow you to change the form-request's postfix. If you don't like to post fix your form-request with the word FormRequest, you can set this to an empty string or any other value. +> +> **irregular\_plurals** was added to the configuration file. The code-generator heavily uses Laravel helpers `str_plural()` and `str_singular()` to generate readable code to make your code spectacular. The problem is the both generate incorrect words for irregular plurals. If you are using a language other than English, you can define a word with each with its plural-form to help the generator keep your code readable. +> +> **create\_move\_file\_method** was added to the configuration file. This option will allow the user to chose not to create moveFile method on every CRUD when file-upload is required. If you set this to false, it is your responsibility make sure that the moveFile method exists in a higher level of your code like `App\Http\Controllers\Controller`. +> +> New configuration file (i.e `config/code_generator_custom.php`) was added to allow you to override the default configuration. This way, you won't lose any of your custom configuration when upgrading which is important! For more info, read the config file. + +### Cleaner! + +> In addition to storing fields in the JSON file, indexes and relations can be stored in the same file too! For that reason, the option \--fields-file have been renamed to \--resource-file in all the commands. +> +> Version 2.2 completely dropped support for raw fields, indexes, and relations as announced in previous documents. Storing resources in JSON file is much better, easier to manage, easier to regenerate resources in the future, shorter/cleaner commands, and much more flexible! +> +> Thanks to the request validation improvement in Laravel 5.5, the controller code is much cleaner. +> +> When the `ConvertEmptyStringsToNull` middleware is registered, we no longer convert empty string to null manually since the middleware will do just that. +> +> The `--without-migration` option with `php artisan create:resources` command has been reversed. It is now `--with-migration` and should only be passed when you need a new migration created. +> +> For consistency, the \--lang-file-name option have been renamed to \--language-filename. +> +> The options `--names` in the `resource-file:create`, `resource-file:append`, and `resource-file:reduce` has been renamed to `--fields`. + +### Command Changes + +> _The following commands were renamed_ +> +> The command `create:fields-file` has been renamed to `resource-file:from-database` +> +> The command `fields-file:create` has been renamed to `resource-file:create` +> +> The command `fields-file:delete` has been renamed to `resource-file:delete` +> +> The command `fields-file:append` has been renamed to `resource-file:append` +> +> The command `fields-file:reduce` has been renamed to `resource-file:reduce` +> +> _The following commands were added_ +> +> `php artisan migrate-all` command was added. It allow you to run all of your outstanding migrations from all folders +> +> `php artisan migrate:rollback-all` command was added and it allows you to rolls back the last "batch" of migrations, which may include multiple migration from all folders. +> +> `php artisan migrate:reset-all` command was added to allow you to roll back all of your application's migrations from all folder. +> +> `php artisan migrate:refresh-all` command was added to allow you to invoke the `migrate:rollback-all` command then immediately invokes the `migrate:migrate-all` command. +> +> `php artisan migrate:status-all` command was added to allow you to checks the status of all your migration from all folders. + +### Bug Free! + +> All known bugs have been addressed! + +## Upgrade Guide + + - In your composer.json file, update the `crestapps/laravel-code-generator` dependency to `2.2.*`. + - Using the command-line, execute the following two commands to upgrade to the latest version of v2.2 + - `composer update` + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default --force` + - If you will be using **Laravel-Collective**, execute the following commands update the default-collective template. + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective --force` + - Move any custom template "if any" from `resources/codegenerator-templates` to `resources/laravel-code-generator/templates`. **IMPORTANT** do not copy the default and default-collective folders. + - Move all the file that are located in `resources/codegenerator-files` to `resources/laravel-code-generator/sources`. Now you should be able to delete the following two folders since they have been relocated `resources/codegenerator-templates` and `resources/codegenerator-files`. + - Finally, there are some changes to the layout stub which are required. To override your existing layout call the following code`php artisan create:layout "My New App"`. If you are using your own layout, you may want to create a temporary layout and extract the updated css/js code into your own layout/assets. The following command will create a new file called "app\_temp.blade.php" `php artisan create:layout "My New App" --layout-filename=app_temp` + +* * * \ No newline at end of file diff --git a/docs/docs/resource-file.md b/docs/docs/resource-file.md new file mode 100644 index 0000000..52d8448 --- /dev/null +++ b/docs/docs/resource-file.md @@ -0,0 +1,318 @@ +--- +sidebar_position: 4 +title: Resource File +--- + +## Resource Files + +A JSON based file that allows you to define how you like your resource generated. You can define your fields, indexes, and model relations. + +## Available Commands to Manage Resource Files + +The option in between the square brackets `[]` must be replaced with a variable of your choice. + - php artisan resource-file:create \[model-name\] + - php artisan resource-file:append \[model-name\] + - php artisan resource-file:reduce \[model-name\] + - php artisan resource-file:delete \[model-name\] + +### How to create resource-file? + +:::note[Create a new resource file.] + + ``` + php artisan resource-file:create [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:create Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | + | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | + | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | + | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| + | --translation-for | [Described above](#translation-for) | + | --force | This option will override any file that already exist. | +::: + +### How to add resources to existing resource-file? + +:::note[Appends a new fields, indexes, or relations to an existing resource-file. If the resource-file does not exists one will be created] + + ``` + php artisan resource-file:append Post --fields=notes,created_by + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-request Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | + | --translation-for | [Described above](#translation-for) | +::: + +### How to remove resources to existing resource-file? + + > If the resource-file becomes empty, it will automatically get deleted by calling the `resource-file:delete` command. + +:::note[Removes fields, indexes, or relations to an existing resource-file.] + + ``` + php artisan resource-file:reduce [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:reduce Post --fields=notes,created_by + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | +::: + +### How to delete existing resource-file? + +> It is recommended to use this command to delete file instead of manually deleting it. This command will also delete the mapped relation in the resource_map file. + +:::note[Delete existing resource-file. ] + + ``` + php artisan resource-file:delete [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:delete Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | +::: + +### How to create a resource's file from existing database? + +> Are you looking to convert existing application to Laravel framework? Or, looking to use database-first instead of code-first approach? No problem! This package allows you to create a resource's file from existing database. +> +> You can easily take advantage of this feature by passing `--table-exists` option to the `create:resources` command to automatically generate all the resources from existing database's table. + +:::note[Convert your existing database into resource file, then the create:resources command is used to generate the resources] + + ``` + php artisan resource-file:from-database [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:from-database Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --table-name | [Described above](#table-name) | + | --database-name | [Described above](#database-name) | + | --resource-file | [Described above](#resource-file) | + | --resource-filename| [Described above](#resource-filename) | + | --translation-for| [Described above](#translation-for) | + | --force | This option will override any file that already exist. | + +::: + + +### Fields + +> The minimum requirement for creating a field is a unique name. However, the code-generator is very flexible and allows you to have full control on the fields. Below all the available properties for defining a field + +#### HTML Properties + | Property name | Description | + | ----------- | ----------- | + | name | A unique name for the field. This is a required field. | + | label | A user-friendly title to describe the field. If this option is left out, the field's name is used to generate a title. | + | validation | You can pass any valid Laravel validation rule. The rules should be separated by bar `\|`.

    For example: `required\|string\|min:2\|max:255`

    Start with Laravel 5.5, you can define custom validation rules and pass them as well. For example, to use a custom validation rule called Uppercase in addition to the required rule, you can pass this string required|new Uppercase.

    To learn more about the valid options please visit [Laravel documentation](https://laravel.com/docs/master/validation#available-validation-rules).

    When the rule `required` is not used, the field in the migration file will automatically become nullable. | + | html-type | Default value: `text`. A valid property will be one of the following options
    `text`, `textarea`, `password`,`email`,`checkbox`,`radio`,`number`,`select`,`hidden`,`file`,`selectRange`,`selectMonth`, or `multipleSelect`.

    Note: when using file type, after the file is uploaded to the designated path, the filename is stored in the database by default. For everything to work properly, the data-type must be of some sort of a string type. Or modify the behavior of moveFile method to handle the new file.

    By default this process stores the uploaded file in the path defined in config file.

    Note: when using checkbox, or multipleSelect, the items are stored in the database as JSON string. Additionally, the items in the index or form views are displayed separated by the value provided in the delimiter property. | + | delimiter | Default value: "; ". When generating a form with checkbox or a select menu that accepts multiple answers, we need either store the results in a foreign model or store the records in a string field. By default, the code generator will convert the multiple options that a user selected into a JSON string before the results are stored using a Eloquent-mutator method.

    When the data is presented on the show and/or index views, the options are displayed separated by the value of the delimiter. Of course, you can always change this behavior to fit your needs by removing the accessor and mutator methods in the model and modifying the views accordingly. | + | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."`` property. Classes that are already set in the views will not be replaced. | + | date-format | Default value: "m/d/Y H:i A". Any field with the type date, time or datetime can be formatted different when it is displayed. You can change the display format using this option. | + | html-value | A default value to set the field to. When using multiple options based html-type like checkbox, multipleSelect you can set this property to array of values to set multiple values by default. Ex, `["Red","Green"]` | + | options | If you used select, checkbox, or radio for the html-type property, this is where you provide the options. Here are some example of the schema.

    A simple array: In this option, the value will be the numeric index value of the item in the array.
    ```"options": ["Prefer not to say","Male","Female"]```.
    Using explicit values
    ```"options": { "": Prefer not to say", "male": "Male","female": "Female"}```.
    Using multiple language phrases for each option
    ```"options": {"en":{"":"Prefer not to say","male":"Male","female":"Female"},"ar":{"":"Prefer not to say in Arabic","male":"Male in Arabic","female":"Female in Arabic"},"fr":{"":"Prefer not to say in French","male":"Male in French","female":"Female in French"}}``` | + | is-inline-options | Default value: false. If the html-type is set to radio or checkbox, setting this option to true will put the items next to each other instead of a vertical list. | + | placeholder or place-holder | You can set a placeholder value when html-type is set to text, number, email, textarea or select. | + | is-on-index | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index view. | + | is-on-form | Default value: `true`. Setting the value to `false` will prevent from adding this field to the form view. | + | is-on-show | Default value: `true`. Setting the value to `false` will prevent from adding this field to the show view. | + | is-on-views | Default value: `true`. Setting the value to `false`` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | + | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns`` in the configuration file, allow you to list the common field name to automatically set them as header. | + + #### Database Properties + | Property name | Description | + | ----------- | ----------- | + | data-type | Default is `varchar`. The database column type. The following are valid types:
    ```'char', 'date', 'datetime', 'datetimetz', 'biginteger', 'bigint', 'blob', 'binary', 'bool', 'boolean', 'decimal', 'double', 'enum', 'list', 'float', 'int', 'integer', 'ipaddress', 'json', 'jsonb', 'longtext', 'macaddress', 'mediuminteger', 'mediumint', 'mediumtext', 'morphs', 'string', 'varchar', 'nvarchar', 'text', 'time', 'timetz', 'tinyinteger', 'tinyint', 'timestamp', 'timestamptz', 'unsignedbiginteger', 'unsignedbigint', 'unsignedInteger', 'unsignedint', 'unsignedmediuminteger', 'unsignedmediumint', 'unsignedsmallinteger', 'unsignedsmallint', 'unsignedtinyinteger', 'uuid', 'uuid'```

    Note: you can add short cuts if needed to in the `laravel-code-generator.php` config file.You can add new mapping to the eloquent_type_to_method array. | + | data-type-params | This option allows you to specify parameters for the data type. Please ensure you provide valid parameters otherwise unexpected behavior will occur. For example, varchar and char will only need a maximum of one integer parameter where double, decimal and float require two integer parameters.

    Command line example with specifying a decimal precision and scale: `data-type-params=5,2`. JSON file example `"data-type-params": [5,2]`

    If this option left out while some sort of a string data-type was used along with a max validation rule, the max value is used to limit the length of the sting in the database when a migration is generated | + | data-value | Default value is null. The default value for the database column. | + | is-auto-increment | Default value is false. Setting this value to true will make this column a primary with auto increment identity. | + | is-primary | Default value is false. You can set this field as the primary for retrieving records from the database. You can only set one column as the primary. If you set multiple fields are primary, the first one will be selected and the rest will be ignored.

    Note: if you set the is-auto-increment field, this option will automatically get set. Ths only time this can be used is to create a primary field you don't wish for the database to auto assign it. | + | is-index | Default value is false. Setting this value to true will add index to this column. | + | is-unique | Default value is false. Setting this value to true will add a unique index to this column. | + | is-nullable | Default value is false. Setting this value to true will make this column nullable.

    Note: when setting this option to true, the default value will be set to NULL unless you pass a different value to data-value.

    When the validation rule contains "nullable", "required_if", "required_unless", "required_with", "required_with_all", "required_without", "required_without_all" or does NOT contains "required" rule, this flag will automatically gets set. | + | is-unsigned | Default value is false. Setting this value to true will make this column unsigned. This option should only be used with numeric types only. | + | comment | This option will allow you to add meta description of the field in the database. | + | is-data | This option will allow you to casts a data filed to a Carbon object. | + | cast-as | This option will allow you to cast a field to php's native type. | + | foreign-relation | This option will allow you to create a foreign relation between the models.

    ```json {"name":"creator","type":"belongsTo","params":["App\\User","created_by"],"field":"name"}``` | + | foreign-constraint | This option will allow you to create a foreign relation between the models.

    ```json {"field":"user_id","references":"id","on":"users","on-delete":"cascade","on-update":"cascade","references-model":"App\\Models\\User"} ``` | + | on-store | This option allows you to set a fixed value on the store action. For example, Illuminate\Support\Facades\Auth::Id(); will set the value to the current user id when the model is first created. Assuming you're using [Laravel Authentication](https://laravel.com/docs/master/authentication). | + | on-update | Similar to on-storeThis option allows you to set a fixed value on the update action. | + + +### Managing fields using JSON file + +Storing the field's specification in a JSON file enables you to easily reuse the field with multiple commands. It also allows you to recreate the resources in the future if you decided to add/remove fields after the views have been crafted. The JSON files are typically stored in /resources/laravel-generator. If you don’t like where these files are kept, you can change that path from the config/laravelgenerator.php file. + +The following command should be used to manage the resource-file to make this process easier. + + - php artisan resource-file:from-database [model-name] + - php artisan resource-file:create [model-name] + - php artisan resource-file:append [model-name] + - php artisan resource-file:reduce [model-name] + - php artisan resource-file:delete [model-name] + +### Resources mapping file + +The resources-map file, is a JSON file that is used to keep track of the fields-file and the model classes to allow you to create the resources all at once. + +The default file name is `resources_map.json` and can be changed from the configuration file. + +When using `resource-file:create`, `resource-file:from-database` or `resource-file:delete` commands, a file called resources_map.json is automatically updated. + +The following is the structure of the file. + +```json + { + { + "model-name": "Brand", + "resource-file": "brands.json" + }, + { + "model-name": "Customer", + "resource-file": "customers.json", + "table-name": "customers_table" + } +} +``` + + All option that are available to the `create:resources` can be used in the mapping file to make creating resources for all models customizable. Here is an example + + ```json + { + { + "model-name": "Customer", + "resource-file": "customers.json", + "table-name": "customers_table", + "routes-prefix" "customers_prefix" + } +} + ``` + +To generate all the resources mapped in the resources_map.json file, use the following command + +``` +php artisan create:mapped-resources [model-name] +``` + +### Generating clean and complete fields out of the box! + +When using the commands that generate fields, our goal is to generate fields configured and ready for use without having to make any change to the generated fields. + +While it is not possible to cover 100% of the use cases, Laravel-code-generator is shipped with a powerful configuration option to allow you to add conditions to handle your own use case. + +The key `common_definitions` in the `config/laravel-code-generator.php` file allows you match field name using pattern then set the properties accordingly. + +For example, you may want to add a global date, time, or datetime picker using javascript for any field where its name ends with `_at`. + +You can do that by adding the following entry + +```json +[ + 'match' => ['*_at'], + 'set' => [ + 'class' => 'datetime-picker', + ] +] +``` + +The same thing can be done for any field that ends with `_date` or starts with `date_of`` +```json +[ + 'match' => ['*_date','date_of_*'], + 'set' => [ + 'class' => 'date-picker', + ] +] +``` + +Of course, you can set any of the field's option like html-type, data-type, data-type-params or foreign relation. You can set the configuration as fits your environment, then you'll be able to create fields-file ready to generate resources with minimal work! + +The conditions are applied to each field top to bottom, the configuration at the bottom of the array will take presence over the once on the top in case multiple conditions were matched. + + +:::info +It is strongly recommended to read the comments above each option in the configuration file to help you understand and customize the generator to fit your needs! +::: + + +### Foreign Relations + +If you're using a code-first-approach and like to define relations between your models, you can easily define that in the relations keyword entry of the resource-file. Each relation can be defined using the following schema + +```json +{ + "name": "posts", // the name of the relation + "type": "hasMany", // the type of the relation + "params": [ // the parameters for the used relation. + "App\\Models\\Comment", + "post_id", + "id" + ], + "field": "name" // the name of the field on the foreign model to use as display value +} +``` +:::info +When creating `hasOne()` or `belongsTo()` relations, it be best to define them at the field level using the foreign-relation option. +Composite Indexes +::: + + +### Composite Indexes +If you're using a code-first-approach and like to define indexes with multiple columns, you can easily do that by adding these indexed to the Indexes keyword entry in the resource-file file. Each composite index can be defined using the following schema + +```json +{ + "name": "owner", // The name of the index to use, if no name is set a one will be generated. + "type": "unique", // Valid index type is one of the following 'index','unique' or 'primary'. If the type is not provided, 'index' is used. + "columns": [ // List of the columns' names to be included in the index left to right. + "first_name", + "last_name" + ] +} +``` diff --git a/docs/docs/upgrade-guide.md b/docs/docs/upgrade-guide.md new file mode 100644 index 0000000..c1ef8fb --- /dev/null +++ b/docs/docs/upgrade-guide.md @@ -0,0 +1,16 @@ +--- +sidebar_position: 5 +title: Upgrade Guide +--- + +## Upgrade Guide + + - In your composer.json file, update the `crestapps/laravel-code-generator` dependency to `2.2.*`. + - Using the command-line, execute the following two commands to upgrade to the latest version of v2.2 + - `composer update` + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default --force` + - If you will be using **Laravel-Collective**, execute the following commands update the default-collective template. + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective --force` + - Move any custom template "if any" from `resources/codegenerator-templates` to `resources/laravel-code-generator/templates`. **IMPORTANT** do not copy the default and default-collective folders. + - Move all the file that are located in `resources/codegenerator-files` to `resources/laravel-code-generator/sources`. Now you should be able to delete the following two folders since they have been relocated `resources/codegenerator-templates` and `resources/codegenerator-files`. + - Finally, there are some changes to the layout stub which are required. To override your existing layout call the following code`php artisan create:layout "My New App"`. If you are using your own layout, you may want to create a temporary layout and extract the updated css/js code into your own layout/assets. The following command will create a new file called "app\_temp.blade.php" `php artisan create:layout "My New App" --layout-filename=app_temp` diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js new file mode 100644 index 0000000..a941617 --- /dev/null +++ b/docs/docusaurus.config.js @@ -0,0 +1,139 @@ +// @ts-check +// `@type` JSDoc annotations allow editor autocompletion and type checking +// (when paired with `@ts-check`). +// There are various equivalent ways to declare your Docusaurus config. +// See: https://docusaurus.io/docs/api/docusaurus-config + +import {themes as prismThemes} from 'prism-react-renderer'; + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: 'My Site', + tagline: 'Dinosaurs are cool', + favicon: 'img/favicon.ico', + + // Set the production url of your site here + url: 'https://your-docusaurus-site.example.com', + // Set the // pathname under which your site is served + // For GitHub pages deployment, it is often '//' + baseUrl: '/', + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: 'facebook', // Usually your GitHub org/user name. + projectName: 'docusaurus', // Usually your repo name. + + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + + // Even if you don't use internationalization, you can use this field to set + // useful metadata like html lang. For example, if your site is Chinese, you + // may want to replace "en" with "zh-Hans". + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: './sidebars.js', + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: + 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', + }, + blog: { + showReadingTime: true, + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: + 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', + }, + theme: { + customCss: './src/css/custom.css', + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + // Replace with your project's social card + image: 'img/docusaurus-social-card.jpg', + navbar: { + logo: { + alt: 'CrestApps Logo', + src: 'img/crestapps-logo.png', + }, + items: [ + { + type: 'docSidebar', + sidebarId: 'docsSidebar', + position: 'left', + label: 'Tutorial', + }, + { + href: 'https://github.com/MikeAlhayek/laravel-code-generator', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Docs', + items: [ + { + label: 'Tutorial', + to: '/docs/intro', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'Stack Overflow', + href: 'https://stackoverflow.com/questions/tagged/docusaurus', + }, + { + label: 'Discord', + href: 'https://discordapp.com/invite/docusaurus', + }, + { + label: 'Twitter', + href: 'https://twitter.com/docusaurus', + }, + ], + }, + { + title: 'More', + items: [ + { + label: 'Blog', + to: '/blog', + }, + { + label: 'GitHub', + href: 'https://github.com/facebook/docusaurus', + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} CrestApps, Inc.`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + }, + }), +}; + +export default config; diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 0000000..06b8c3f --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,14645 @@ +{ + "name": "laravel-code-generator", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "laravel-code-generator", + "version": "0.0.0", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/preset-classic": "3.1.0", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/types": "3.1.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", + "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", + "dependencies": { + "@algolia/cache-common": "4.22.1" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", + "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", + "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", + "dependencies": { + "@algolia/cache-common": "4.22.1" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", + "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", + "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", + "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", + "dependencies": { + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", + "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", + "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + }, + "node_modules/@algolia/logger-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", + "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==" + }, + "node_modules/@algolia/logger-console": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", + "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", + "dependencies": { + "@algolia/logger-common": "4.22.1" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", + "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", + "dependencies": { + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", + "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", + "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", + "dependencies": { + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", + "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", + "dependencies": { + "@algolia/cache-common": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", + "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", + "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", + "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz", + "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz", + "integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", + "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", + "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.7", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", + "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.8.tgz", + "integrity": "sha512-2ZzmcDugdm0/YQKFVYsXiwUN7USPX8PM7cytpb4PFl87fM+qYPSvTZX//8tyeJB1j0YDmafBJEbl5f8NfLyuKw==", + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", + "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==" + }, + "node_modules/@docsearch/react": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", + "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.2", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.1.0.tgz", + "integrity": "sha512-GWudMGYA9v26ssbAWJNfgeDZk+lrudUTclLPRsmxiknEBk7UMp7Rglonhqbsf3IKHOyHkMU4Fr5jFyg5SBx9jQ==", + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/generator": "^7.23.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "@babel/preset-react": "^7.22.5", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@babel/runtime-corejs3": "^7.22.6", + "@babel/traverse": "^7.22.8", + "@docusaurus/cssnano-preset": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", + "@svgr/webpack": "^6.5.1", + "autoprefixer": "^10.4.14", + "babel-loader": "^9.1.3", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.2", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.31.1", + "css-loader": "^6.8.1", + "css-minimizer-webpack-plugin": "^4.2.2", + "cssnano": "^5.1.15", + "del": "^6.1.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "html-minifier-terser": "^7.2.0", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.5.3", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.7.6", + "postcss": "^8.4.26", + "postcss-loader": "^7.3.3", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "rtl-detect": "^1.0.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.5", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "url-loader": "^4.1.1", + "webpack": "^5.88.1", + "webpack-bundle-analyzer": "^4.9.0", + "webpack-dev-server": "^4.15.1", + "webpack-merge": "^5.9.0", + "webpackbar": "^5.0.2" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.1.0.tgz", + "integrity": "sha512-ned7qsgCqSv/e7KyugFNroAfiszuxLwnvMW7gmT2Ywxb/Nyt61yIw7KHyAZCMKglOalrqnYA4gMhLUCK/mVePA==", + "dependencies": { + "cssnano-preset-advanced": "^5.3.10", + "postcss": "^8.4.26", + "postcss-sort-media-queries": "^4.4.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.1.0.tgz", + "integrity": "sha512-p740M+HCst1VnKKzL60Hru9xfG4EUYJDarjlEC4hHeBy9+afPmY3BNPoSHx9/8zxuYfUlv/psf7I9NvRVdmdvg==", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.1.0.tgz", + "integrity": "sha512-D7onDz/3mgBonexWoQXPw3V2E5Bc4+jYRf9gGUUK+KoQwU8xMDaDkUUfsr7t6UBa/xox9p5+/3zwLuXOYMzGSg==", + "dependencies": { + "@babel/parser": "^7.22.7", + "@babel/traverse": "^7.22.8", + "@docusaurus/logger": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^1.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.1.0.tgz", + "integrity": "sha512-XUl7Z4PWlKg4l6KF05JQ3iDHQxnPxbQUqTNKvviHyuHdlalOFv6qeDAm7IbzyQPJD5VA6y4dpRbTWSqP9ClwPg==", + "dependencies": { + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "3.1.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.1.0.tgz", + "integrity": "sha512-iMa6WBaaEdYuxckvJtLcq/HQdlA4oEbCXf/OFfsYJCCULcDX7GDZpKxLF3X1fLsax3sSm5bmsU+CA0WD+R1g3A==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "cheerio": "^1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.1.0.tgz", + "integrity": "sha512-el5GxhT8BLrsWD0qGa8Rq+Ttb/Ni6V3DGT2oAPio0qcs/mUAxeyXEAmihkvmLCnAgp6xD27Ce7dISZ5c6BXeqA==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.1.0.tgz", + "integrity": "sha512-9gntYQFpk+93+Xl7gYczJu8I9uWoyRLnRwS0+NUFcs9iZtHKsdqKWPRrONC9elfN3wJ9ORwTbcVzsTiB8jvYlg==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.1.0.tgz", + "integrity": "sha512-AbvJwCVRbmQ8w9d8QXbF4Iq/ui0bjPZNYFIhtducGFnm2YQRN1mraK8mCEQb0Aq0T8SqRRvSfC/far4n/s531w==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^1.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.1.0.tgz", + "integrity": "sha512-zvUOMzu9Uhz0ciqnSbtnp/5i1zEYlzarQrOXG90P3Is3efQI43p2YLW/rzSGdLb5MfQo2HvKT6Q5+tioMO045Q==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.1.0.tgz", + "integrity": "sha512-0txshvaY8qIBdkk2UATdVcfiCLGq3KAUfuRQD2cRNgO39iIf4/ihQxH9NXcRTwKs4Q5d9yYHoix3xT6pFuEYOg==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.1.0.tgz", + "integrity": "sha512-zOWPEi8kMyyPtwG0vhyXrdbLs8fIZmY5vlbi9lUU+v8VsroO5iHmfR2V3SMsrsfOanw5oV/ciWqbxezY00qEZg==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.1.0.tgz", + "integrity": "sha512-TkR5vGBpUooEB9SoW42thahqqwKzfHrQQhkB+JrEGERsl4bKODSuJNle4aA4h6LSkg4IyfXOW8XOI0NIPWb9Cg==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.1.0.tgz", + "integrity": "sha512-xGLQRFmmT9IinAGUDVRYZ54Ys28USNbA3OTXQXnSJLPr1rCY7CYnHI4XoOnKWrNnDiAI4ruMzunXWyaElUYCKQ==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/plugin-content-blog": "3.1.0", + "@docusaurus/plugin-content-docs": "3.1.0", + "@docusaurus/plugin-content-pages": "3.1.0", + "@docusaurus/plugin-debug": "3.1.0", + "@docusaurus/plugin-google-analytics": "3.1.0", + "@docusaurus/plugin-google-gtag": "3.1.0", + "@docusaurus/plugin-google-tag-manager": "3.1.0", + "@docusaurus/plugin-sitemap": "3.1.0", + "@docusaurus/theme-classic": "3.1.0", + "@docusaurus/theme-common": "3.1.0", + "@docusaurus/theme-search-algolia": "3.1.0", + "@docusaurus/types": "3.1.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.1.0.tgz", + "integrity": "sha512-/+jMl2Z9O8QQxves5AtHdt91gWsEZFgOV3La/6eyKEd7QLqQUtM5fxEJ40rq9NKYjqCd1HzZ9egIMeJoWwillw==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/plugin-content-blog": "3.1.0", + "@docusaurus/plugin-content-docs": "3.1.0", + "@docusaurus/plugin-content-pages": "3.1.0", + "@docusaurus/theme-common": "3.1.0", + "@docusaurus/theme-translations": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.43", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.26", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.1.0.tgz", + "integrity": "sha512-YGwEFALLIbF5ocW/Fy6Ae7tFWUOugEN3iwxTx8UkLAcLqYUboDSadesYtVBmRCEB4FVA2qoP7YaW3lu3apUPPw==", + "dependencies": { + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/plugin-content-blog": "3.1.0", + "@docusaurus/plugin-content-docs": "3.1.0", + "@docusaurus/plugin-content-pages": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.1.0.tgz", + "integrity": "sha512-8cJH0ZhPsEDjq3jR3I+wHmWzVY2bXMQJ59v2QxUmsTZxbWA4u+IzccJMIJx4ooFl9J6iYynwYsFuHxyx/KUmfQ==", + "dependencies": { + "@docsearch/react": "^3.5.2", + "@docusaurus/core": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/plugin-content-docs": "3.1.0", + "@docusaurus/theme-common": "3.1.0", + "@docusaurus/theme-translations": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "algoliasearch": "^4.18.0", + "algoliasearch-helper": "^3.13.3", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.1.0.tgz", + "integrity": "sha512-DApE4AbDI+WBajihxB54L4scWQhVGNZAochlC9fkbciPuFAgdRBD3NREb0rgfbKexDC/rioppu/WJA0u8tS+yA==", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/types": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.0.tgz", + "integrity": "sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-LgZfp0D+UBqAh7PZ//MUNSFBMavmAPku6Si9x8x3V+S318IGCNJ6hUr2O29UO0oLybEWUjD5Jnj9IUN6XyZeeg==", + "dependencies": { + "@docusaurus/logger": "3.1.0", + "@svgr/webpack": "^6.5.1", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.1.0.tgz", + "integrity": "sha512-SfvnRLHoZ9bwTw67knkSs7IcUR0GY2SaGkpdB/J9pChrDiGhwzKNUhcieoPyPYrOWGRPk3rVNYtoy+Bc7psPAw==", + "dependencies": { + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.1.0.tgz", + "integrity": "sha512-dFxhs1NLxPOSzmcTk/eeKxLY5R+U4cua22g9MsAMiRWcwFKStZ2W3/GDY0GmnJGqNS8QAQepJrxQoyxXkJNDeg==", + "dependencies": { + "@docusaurus/logger": "3.1.0", + "@docusaurus/utils": "3.1.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.0.tgz", + "integrity": "sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-to-js": "^2.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.0.tgz", + "integrity": "sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ==", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.24", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", + "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==" + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@slorber/static-site-generator-webpack-plugin": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", + "dependencies": { + "eval": "^0.1.8", + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", + "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", + "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", + "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", + "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", + "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", + "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", + "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", + "@svgr/babel-plugin-remove-jsx-attribute": "*", + "@svgr/babel-plugin-remove-jsx-empty-expression": "*", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", + "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", + "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", + "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "dependencies": { + "@babel/types": "^7.20.0", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", + "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/hast-util-to-babel-ast": "^6.5.1", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", + "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "dependencies": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", + "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-constant-elements": "^7.18.12", + "@babel/preset-env": "^7.19.4", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@svgr/core": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "@svgr/plugin-svgo": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", + "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz", + "integrity": "sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==" + }, + "node_modules/@types/hast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", + "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.10.tgz", + "integrity": "sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/node": { + "version": "20.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.6.tgz", + "integrity": "sha512-+EOokTnksGVgip2PbYbr3xnR7kZigh4LbybAfBAw5BpnQ+FqBYUsvCEjYd70IXKlbohQ64mzEYmMtlWUY8q//Q==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "node_modules/@types/prismjs": { + "version": "1.26.3", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.3.tgz", + "integrity": "sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/react": { + "version": "18.2.48", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", + "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", + "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.22.1", + "@algolia/cache-common": "4.22.1", + "@algolia/cache-in-memory": "4.22.1", + "@algolia/client-account": "4.22.1", + "@algolia/client-analytics": "4.22.1", + "@algolia/client-common": "4.22.1", + "@algolia/client-personalization": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/logger-console": "4.22.1", + "@algolia/requester-browser-xhr": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/requester-node-http": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.16.2.tgz", + "integrity": "sha512-Yl/Gu5Cq4Z5s/AJ0jR37OPI1H3+z7PHz657ibyaXgMOaWvPlZ3OACN13N+7HCLPUlB0BN+8BtmrG/CqTilowBA==", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.17", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", + "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.22.2", + "caniuse-lite": "^1.0.30001578", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", + "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.5.0", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001580", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001580.tgz", + "integrity": "sha512-mtj5ur2FFPZcCEpXFy8ADXbDACuNFXg6mxVDqp7tqooX6l3zwm+d8EPoeOSIFRDvHs8qu7/SLFOGniULkcH2iA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.1.tgz", + "integrity": "sha512-IgdsbxNyMskrTFxa9lWHyMwAJU5gXOPP+1yO+K59d50VLVAIDAbs7gIv705KzALModfK3ZrSZTPNpC0PQgIZuw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", + "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", + "dependencies": { + "browserslist": "^4.22.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.35.1.tgz", + "integrity": "sha512-zcIdi/CL3MWbBJYo5YCeVAAx+Sy9yJE9I3/u9LkFABwbeaPhTMRWraM8mYFp9jW5Z50hOy7FVzCc8dCrpZqtIQ==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.9.1.tgz", + "integrity": "sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", + "dependencies": { + "cssnano": "^5.1.8", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", + "dependencies": { + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.645", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.645.tgz", + "integrity": "sha512-EeS1oQDCmnYsRDRy2zTeC336a/4LZ6WKqvSaM1jLocEk5ZuyszkQtCpsqvuvaIXGOUjwtvF6LTcS8WueibXvSw==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz", + "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz", + "integrity": "sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==", + "dependencies": { + "@types/estree": "^1.0.0", + "is-plain-obj": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", + "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", + "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz", + "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz", + "integrity": "sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==", + "dependencies": { + "inline-style-parser": "0.2.2" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.12.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.0.tgz", + "integrity": "sha512-HSLsmSmXz+PV9PYoi3p7cgIbj06WnEBNT28n+bbBNcPZXZFqCzzvGqpTBPujx/Z0nh1+KNQPDrNgdmQ8dq0qYw==", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.4", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", + "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz", + "integrity": "sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz", + "integrity": "sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz", + "integrity": "sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", + "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", + "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", + "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", + "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", + "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", + "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.7", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.7.tgz", + "integrity": "sha512-+0n11YGyRavUR3IlaOzJ0/4Il1avMvJ1VJfhWfCn24ITQXhRr1gghbhhrda6tgtNcpZaWKdSuwKq20Jb7fnlyw==", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-unused": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", + "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss-merge-idents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", + "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", + "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", + "dependencies": { + "sort-css-media-queries": "2.1.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.16" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/postcss-zindex": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", + "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", + "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" + }, + "node_modules/react-helmet-async": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-json-view-lite": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.2.1.tgz", + "integrity": "sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", + "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.0.tgz", + "integrity": "sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rtl-detect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", + "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==" + }, + "node_modules/rtlcss": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", + "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", + "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/sitemap": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", + "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/svgo/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.90.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.0.tgz", + "integrity": "sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", + "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "is-plain-object": "^5.0.0", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000..5d2577b --- /dev/null +++ b/docs/package.json @@ -0,0 +1,44 @@ +{ + "name": "laravel-code-generator", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids" + }, + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/preset-classic": "3.1.0", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/types": "3.1.0" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=18.0" + } +} diff --git a/docs/sidebars.js b/docs/sidebars.js new file mode 100644 index 0000000..584cf1d --- /dev/null +++ b/docs/sidebars.js @@ -0,0 +1,33 @@ +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ + +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + // By default, Docusaurus generates a sidebar from the docs folder structure + docsSidebar: [{type: 'autogenerated', dirName: '.'}], + + // But you can create a sidebar manually + /* + docSidebar: [ + 'intro', + 'hello', + { + type: 'category', + label: 'Tutorial', + items: ['tutorial-basics/create-a-document'], + }, + ], + */ +}; + +export default sidebars; diff --git a/docs/src/components/HomepageFeatures/index.js b/docs/src/components/HomepageFeatures/index.js new file mode 100644 index 0000000..acc7621 --- /dev/null +++ b/docs/src/components/HomepageFeatures/index.js @@ -0,0 +1,64 @@ +import clsx from 'clsx'; +import Heading from '@theme/Heading'; +import styles from './styles.module.css'; + +const FeatureList = [ + { + title: 'Easy to Use', + Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, + description: ( + <> + Docusaurus was designed from the ground up to be easily installed and + used to get your website up and running quickly. + + ), + }, + { + title: 'Focus on What Matters', + Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, + description: ( + <> + Docusaurus lets you focus on your docs, and we'll do the chores. Go + ahead and move your docs into the docs directory. + + ), + }, + { + title: 'Powered by React', + Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, + description: ( + <> + Extend or customize your website layout by reusing React. Docusaurus can + be extended while reusing the same header and footer. + + ), + }, +]; + +function Feature({Svg, title, description}) { + return ( +
    +
    + +
    +
    + {title} +

    {description}

    +
    +
    + ); +} + +export default function HomepageFeatures() { + return ( +
    +
    +
    + {FeatureList.map((props, idx) => ( + + ))} +
    +
    +
    + ); +} diff --git a/docs/src/components/HomepageFeatures/styles.module.css b/docs/src/components/HomepageFeatures/styles.module.css new file mode 100644 index 0000000..b248eb2 --- /dev/null +++ b/docs/src/components/HomepageFeatures/styles.module.css @@ -0,0 +1,11 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css new file mode 100644 index 0000000..e5f025c --- /dev/null +++ b/docs/src/css/custom.css @@ -0,0 +1,31 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #1b1b1d; + --ifm-color-primary-dark: #18181a; + --ifm-color-primary-darker: #171719; + --ifm-color-primary-darkest: #131314; + --ifm-color-primary-light: #1e1e20; + --ifm-color-primary-lighter: #1f1f21; + --ifm-color-primary-lightest: #232326; + --ifm-background-color: #f1f1f1; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(10, 7, 7, 0.1); +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #eaa429; + --ifm-color-primary-dark: #e19816; + --ifm-color-primary-darker: #d58f15; + --ifm-color-primary-darkest: #af7611; + --ifm-color-primary-light: #ecaf42; + --ifm-color-primary-lighter: #eeb44f; + --ifm-color-primary-lightest: #f1c474; + --ifm-background-color: #292929; +} diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js new file mode 100644 index 0000000..a8c61f2 --- /dev/null +++ b/docs/src/pages/index.js @@ -0,0 +1,43 @@ +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import HomepageFeatures from '@site/src/components/HomepageFeatures'; + +import Heading from '@theme/Heading'; +import styles from './index.module.css'; + +function HomepageHeader() { + const {siteConfig} = useDocusaurusContext(); + return ( +
    +
    + + {siteConfig.title} + +

    {siteConfig.tagline}

    +
    + + Docusaurus Tutorial - 5min ⏱️ + +
    +
    +
    + ); +} + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + + +
    + +
    +
    + ); +} diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css new file mode 100644 index 0000000..9f71a5d --- /dev/null +++ b/docs/src/pages/index.module.css @@ -0,0 +1,23 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 996px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} diff --git a/docs/src/pages/markdown-page.md b/docs/src/pages/markdown-page.md new file mode 100644 index 0000000..9756c5b --- /dev/null +++ b/docs/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. diff --git a/docs/static/.nojekyll b/docs/static/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/static/img/crestapps-logo.png b/docs/static/img/crestapps-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1453170552ca61fd76bbae415c94bf75ff434894 GIT binary patch literal 8002 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 Ef(E37CjbBd literal 0 HcmV?d00001 diff --git a/docs/static/img/docusaurus-social-card.jpg b/docs/static/img/docusaurus-social-card.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ffcb448210e1a456cb3588ae8b396a597501f187 GIT binary patch literal 55746 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 fgzs%Vr*-jYG(YMS<ttdtee# literal 0 HcmV?d00001 diff --git a/docs/static/img/docusaurus.png b/docs/static/img/docusaurus.png new file mode 100644 index 0000000000000000000000000000000000000000..f458149e3c8f53335f28fbc162ae67f55575c881 GIT binary patch literal 5142 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 F{0H{b<4^zq literal 0 HcmV?d00001 diff --git a/docs/static/img/favicon.ico b/docs/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c01d54bcd39a5f853428f3cd5aa0f383d963c484 GIT binary patch literal 3626 zcmb`Je@s(X6vrR`EK3%b%orErlDW({vnABqA zcfaS{d+xbU5JKp0*;0YOg+;Fl!eT)XRuapIwFLL`=imZCSon$`se`_<%@MB=M~KG+ z=EW^FL`w|Bo>*ktlaS^(fut!95`iG5u=SZ8nfDHO#GaTlH1-XG^;vsjUb^gWTVz0+ z^=WR1wv9-2oeR=_;fL0H7rNWqAzGtO(D;`~cX(RcN0w2v24Y8)6t`cS^_ghs`_ho? z{0ka~1Dgo8TfAP$r*ua?>$_V+kZ!-(TvEJ7O2f;Y#tezt$&R4 zLI}=-y@Z!grf*h3>}DUL{km4R>ya_I5Ag#{h_&?+HpKS!;$x3LC#CqUQ8&nM?X))Q zXAy2?`YL4FbC5CgJu(M&Q|>1st8XXLZ|5MgwgjP$m_2Vt0(J z&Gu7bOlkbGzGm2sh?X`){7w69Y$1#@P@7DF{ZE=4%T0NDS)iH`tiPSKpDNW)zmtn( zw;4$f>k)4$LBc>eBAaTZeCM2(iD+sHlj!qd z2GjRJ>f_Qes(+mnzdA^NH?^NB(^o-%Gmg$c8MNMq&`vm@9Ut;*&$xSD)PKH{wBCEC z4P9%NQ;n2s59ffMn8*5)5AAg4-93gBXBDX`A7S& zH-|%S3Wd%T79fk-e&l`{!?lve8_epXhE{d3Hn$Cg!t=-4D(t$cK~7f&4s?t7wr3ZP z*!SRQ-+tr|e1|hbc__J`k3S!rMy<0PHy&R`v#aJv?`Y?2{avK5sQz%=Us()jcNuZV z*$>auD4cEw>;t`+m>h?f?%VFJZj8D|Y1e_SjxG%J4{-AkFtT2+ZZS5UScS~%;dp!V>)7zi`w(xwSd*FS;Lml=f6hn#jq)2is4nkp+aTrV?)F6N z>DY#SU0IZ;*?Hu%tSj4edd~kYNHMFvS&5}#3-M;mBCOCZL3&;2obdG?qZ>rD|zC|Lu|sny76pn2xl|6sk~Hs{X9{8iBW zwiwgQt+@hi`FYMEhX2 \ No newline at end of file diff --git a/docs/static/img/undraw_docusaurus_mountain.svg b/docs/static/img/undraw_docusaurus_mountain.svg new file mode 100644 index 0000000..af961c4 --- /dev/null +++ b/docs/static/img/undraw_docusaurus_mountain.svg @@ -0,0 +1,171 @@ + + Easy to Use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/static/img/undraw_docusaurus_react.svg b/docs/static/img/undraw_docusaurus_react.svg new file mode 100644 index 0000000..94b5cf0 --- /dev/null +++ b/docs/static/img/undraw_docusaurus_react.svg @@ -0,0 +1,170 @@ + + Powered by React + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/static/img/undraw_docusaurus_tree.svg b/docs/static/img/undraw_docusaurus_tree.svg new file mode 100644 index 0000000..d9161d3 --- /dev/null +++ b/docs/static/img/undraw_docusaurus_tree.svg @@ -0,0 +1,40 @@ + + Focus on What Matters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/versions.json b/docs/versions.json new file mode 100644 index 0000000..0d4f101 --- /dev/null +++ b/docs/versions.json @@ -0,0 +1,2 @@ +[ +] From d026990e43e33f7a91934c14aa4adf9e8344efbf Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Thu, 25 Jan 2024 17:26:08 -0800 Subject: [PATCH 11/29] cleanup --- .gitignore | 2 +- docs/static/img/docusaurus-social-card.jpg | Bin 55746 -> 0 bytes docs/static/img/docusaurus.png | Bin 5142 -> 0 bytes docs/static/img/favicon.ico | Bin 3626 -> 0 bytes docs/static/img/logo.svg | 1 - .../static/img/undraw_docusaurus_mountain.svg | 171 ------------------ docs/static/img/undraw_docusaurus_react.svg | 170 ----------------- docs/static/img/undraw_docusaurus_tree.svg | 40 ---- 8 files changed, 1 insertion(+), 383 deletions(-) delete mode 100644 docs/static/img/docusaurus-social-card.jpg delete mode 100644 docs/static/img/docusaurus.png delete mode 100644 docs/static/img/favicon.ico delete mode 100644 docs/static/img/logo.svg delete mode 100644 docs/static/img/undraw_docusaurus_mountain.svg delete mode 100644 docs/static/img/undraw_docusaurus_react.svg delete mode 100644 docs/static/img/undraw_docusaurus_tree.svg diff --git a/.gitignore b/.gitignore index fecfefd..c8725b0 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ vendor/ composer.lock .vscode/ -.node_modules/ \ No newline at end of file +.node_modules/ diff --git a/docs/static/img/docusaurus-social-card.jpg b/docs/static/img/docusaurus-social-card.jpg deleted file mode 100644 index ffcb448210e1a456cb3588ae8b396a597501f187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55746 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 fgzs%Vr*-jYG(YMS<ttdtee# diff --git a/docs/static/img/docusaurus.png b/docs/static/img/docusaurus.png deleted file mode 100644 index f458149e3c8f53335f28fbc162ae67f55575c881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5142 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 F{0H{b<4^zq diff --git a/docs/static/img/favicon.ico b/docs/static/img/favicon.ico deleted file mode 100644 index c01d54bcd39a5f853428f3cd5aa0f383d963c484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3626 zcmb`Je@s(X6vrR`EK3%b%orErlDW({vnABqA zcfaS{d+xbU5JKp0*;0YOg+;Fl!eT)XRuapIwFLL`=imZCSon$`se`_<%@MB=M~KG+ z=EW^FL`w|Bo>*ktlaS^(fut!95`iG5u=SZ8nfDHO#GaTlH1-XG^;vsjUb^gWTVz0+ z^=WR1wv9-2oeR=_;fL0H7rNWqAzGtO(D;`~cX(RcN0w2v24Y8)6t`cS^_ghs`_ho? z{0ka~1Dgo8TfAP$r*ua?>$_V+kZ!-(TvEJ7O2f;Y#tezt$&R4 zLI}=-y@Z!grf*h3>}DUL{km4R>ya_I5Ag#{h_&?+HpKS!;$x3LC#CqUQ8&nM?X))Q zXAy2?`YL4FbC5CgJu(M&Q|>1st8XXLZ|5MgwgjP$m_2Vt0(J z&Gu7bOlkbGzGm2sh?X`){7w69Y$1#@P@7DF{ZE=4%T0NDS)iH`tiPSKpDNW)zmtn( zw;4$f>k)4$LBc>eBAaTZeCM2(iD+sHlj!qd z2GjRJ>f_Qes(+mnzdA^NH?^NB(^o-%Gmg$c8MNMq&`vm@9Ut;*&$xSD)PKH{wBCEC z4P9%NQ;n2s59ffMn8*5)5AAg4-93gBXBDX`A7S& zH-|%S3Wd%T79fk-e&l`{!?lve8_epXhE{d3Hn$Cg!t=-4D(t$cK~7f&4s?t7wr3ZP z*!SRQ-+tr|e1|hbc__J`k3S!rMy<0PHy&R`v#aJv?`Y?2{avK5sQz%=Us()jcNuZV z*$>auD4cEw>;t`+m>h?f?%VFJZj8D|Y1e_SjxG%J4{-AkFtT2+ZZS5UScS~%;dp!V>)7zi`w(xwSd*FS;Lml=f6hn#jq)2is4nkp+aTrV?)F6N z>DY#SU0IZ;*?Hu%tSj4edd~kYNHMFvS&5}#3-M;mBCOCZL3&;2obdG?qZ>rD|zC|Lu|sny76pn2xl|6sk~Hs{X9{8iBW zwiwgQt+@hi`FYMEhX2 \ No newline at end of file diff --git a/docs/static/img/undraw_docusaurus_mountain.svg b/docs/static/img/undraw_docusaurus_mountain.svg deleted file mode 100644 index af961c4..0000000 --- a/docs/static/img/undraw_docusaurus_mountain.svg +++ /dev/null @@ -1,171 +0,0 @@ - - Easy to Use - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/static/img/undraw_docusaurus_react.svg b/docs/static/img/undraw_docusaurus_react.svg deleted file mode 100644 index 94b5cf0..0000000 --- a/docs/static/img/undraw_docusaurus_react.svg +++ /dev/null @@ -1,170 +0,0 @@ - - Powered by React - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/static/img/undraw_docusaurus_tree.svg b/docs/static/img/undraw_docusaurus_tree.svg deleted file mode 100644 index d9161d3..0000000 --- a/docs/static/img/undraw_docusaurus_tree.svg +++ /dev/null @@ -1,40 +0,0 @@ - - Focus on What Matters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 68533deaa7f8678367ab69f618c54649ac22aa78 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Fri, 26 Jan 2024 17:23:46 -0800 Subject: [PATCH 12/29] complete the docs --- docs/docs/available-commands.md | 56 +- docs/docs/configurations.md | 14 +- docs/docs/get-started.md | 12 +- docs/docs/intro.md | 9 - docs/docs/release-notes.md | 99 +-- docs/docs/upgrade-guide.md | 12 +- docs/docusaurus.config.js | 56 +- docs/package-lock.json | 724 +++++++++++------- docs/package.json | 6 +- docs/src/pages/index.js | 5 +- docs/src/pages/markdown-page.md | 7 - docs/static/img/favicon.ico | Bin 0 -> 15406 bytes .../version-2.0.0/available-commands.md | 577 ++++++++++++++ .../version-2.0.0/configurations.md | 12 + .../version-2.0.0/get-started.md | 37 + docs/versioned_docs/version-2.0.0/intro.md | 62 ++ .../version-2.0.0}/laravel-collective.md | 0 .../version-2.0.0/release-notes.md | 103 +++ .../version-2.0.0/resource-file.md | 318 ++++++++ .../version-2.0.0/upgrade-guide.md | 16 + .../version-2.1.0/available-commands.md | 577 ++++++++++++++ .../version-2.1.0/configurations.md | 12 + .../version-2.1.0/get-started.md | 37 + docs/versioned_docs/version-2.1.0/intro.md | 62 ++ .../version-2.1.0/laravel-collective.md | 36 + .../version-2.1.0/release-notes.md | 103 +++ .../version-2.1.0/resource-file.md | 318 ++++++++ .../version-2.1.0/upgrade-guide.md | 16 + .../version-2.2.0/available-commands.md | 577 ++++++++++++++ .../version-2.2.0/configurations.md | 12 + .../version-2.2.0/get-started.md | 37 + docs/versioned_docs/version-2.2.0/intro.md | 62 ++ .../version-2.2.0/laravel-collective.md | 36 + .../version-2.2.0/release-notes.md | 103 +++ .../version-2.2.0/resource-file.md | 318 ++++++++ .../version-2.2.0/upgrade-guide.md | 16 + .../version-2.3.0/available-commands.md | 577 ++++++++++++++ .../version-2.3.0/configurations.md | 12 + .../version-2.3.0/get-started.md | 37 + docs/versioned_docs/version-2.3.0/intro.md | 62 ++ .../version-2.3.0/laravel-collective.md | 36 + .../version-2.3.0/release-notes.md | 103 +++ .../version-2.3.0/resource-file.md | 318 ++++++++ .../version-2.3.0/upgrade-guide.md | 16 + .../version-2.4.0/available-commands.md | 588 ++++++++++++++ .../version-2.4.0/configurations.md | 12 + .../version-2.4.0/get-started.md | 37 + docs/versioned_docs/version-2.4.0/intro.md | 62 ++ .../version-2.4.0/laravel-collective.md | 36 + .../version-2.4.0/release-notes.md | 19 + .../version-2.4.0/resource-file.md | 318 ++++++++ .../version-2.4.0/upgrade-guide.md | 8 + .../version-3.0.0/available-commands.md | 593 ++++++++++++++ .../version-3.0.0/configurations.md | 20 + .../version-3.0.0/get-started.md | 43 ++ docs/versioned_docs/version-3.0.0/intro.md | 53 ++ .../version-3.0.0/release-notes.md | 10 + .../version-3.0.0/resource-file.md | 318 ++++++++ .../version-3.0.0/upgrade-guide.md | 8 + .../version-2.0.0-sidebars.json | 8 + .../version-2.1.0-sidebars.json | 8 + .../version-2.2.0-sidebars.json | 8 + .../version-2.3.0-sidebars.json | 8 + .../version-2.4.0-sidebars.json | 8 + .../version-3.0.0-sidebars.json | 8 + docs/versions.json | 6 + 66 files changed, 7337 insertions(+), 450 deletions(-) delete mode 100644 docs/src/pages/markdown-page.md create mode 100644 docs/static/img/favicon.ico create mode 100644 docs/versioned_docs/version-2.0.0/available-commands.md create mode 100644 docs/versioned_docs/version-2.0.0/configurations.md create mode 100644 docs/versioned_docs/version-2.0.0/get-started.md create mode 100644 docs/versioned_docs/version-2.0.0/intro.md rename docs/{docs => versioned_docs/version-2.0.0}/laravel-collective.md (100%) create mode 100644 docs/versioned_docs/version-2.0.0/release-notes.md create mode 100644 docs/versioned_docs/version-2.0.0/resource-file.md create mode 100644 docs/versioned_docs/version-2.0.0/upgrade-guide.md create mode 100644 docs/versioned_docs/version-2.1.0/available-commands.md create mode 100644 docs/versioned_docs/version-2.1.0/configurations.md create mode 100644 docs/versioned_docs/version-2.1.0/get-started.md create mode 100644 docs/versioned_docs/version-2.1.0/intro.md create mode 100644 docs/versioned_docs/version-2.1.0/laravel-collective.md create mode 100644 docs/versioned_docs/version-2.1.0/release-notes.md create mode 100644 docs/versioned_docs/version-2.1.0/resource-file.md create mode 100644 docs/versioned_docs/version-2.1.0/upgrade-guide.md create mode 100644 docs/versioned_docs/version-2.2.0/available-commands.md create mode 100644 docs/versioned_docs/version-2.2.0/configurations.md create mode 100644 docs/versioned_docs/version-2.2.0/get-started.md create mode 100644 docs/versioned_docs/version-2.2.0/intro.md create mode 100644 docs/versioned_docs/version-2.2.0/laravel-collective.md create mode 100644 docs/versioned_docs/version-2.2.0/release-notes.md create mode 100644 docs/versioned_docs/version-2.2.0/resource-file.md create mode 100644 docs/versioned_docs/version-2.2.0/upgrade-guide.md create mode 100644 docs/versioned_docs/version-2.3.0/available-commands.md create mode 100644 docs/versioned_docs/version-2.3.0/configurations.md create mode 100644 docs/versioned_docs/version-2.3.0/get-started.md create mode 100644 docs/versioned_docs/version-2.3.0/intro.md create mode 100644 docs/versioned_docs/version-2.3.0/laravel-collective.md create mode 100644 docs/versioned_docs/version-2.3.0/release-notes.md create mode 100644 docs/versioned_docs/version-2.3.0/resource-file.md create mode 100644 docs/versioned_docs/version-2.3.0/upgrade-guide.md create mode 100644 docs/versioned_docs/version-2.4.0/available-commands.md create mode 100644 docs/versioned_docs/version-2.4.0/configurations.md create mode 100644 docs/versioned_docs/version-2.4.0/get-started.md create mode 100644 docs/versioned_docs/version-2.4.0/intro.md create mode 100644 docs/versioned_docs/version-2.4.0/laravel-collective.md create mode 100644 docs/versioned_docs/version-2.4.0/release-notes.md create mode 100644 docs/versioned_docs/version-2.4.0/resource-file.md create mode 100644 docs/versioned_docs/version-2.4.0/upgrade-guide.md create mode 100644 docs/versioned_docs/version-3.0.0/available-commands.md create mode 100644 docs/versioned_docs/version-3.0.0/configurations.md create mode 100644 docs/versioned_docs/version-3.0.0/get-started.md create mode 100644 docs/versioned_docs/version-3.0.0/intro.md create mode 100644 docs/versioned_docs/version-3.0.0/release-notes.md create mode 100644 docs/versioned_docs/version-3.0.0/resource-file.md create mode 100644 docs/versioned_docs/version-3.0.0/upgrade-guide.md create mode 100644 docs/versioned_sidebars/version-2.0.0-sidebars.json create mode 100644 docs/versioned_sidebars/version-2.1.0-sidebars.json create mode 100644 docs/versioned_sidebars/version-2.2.0-sidebars.json create mode 100644 docs/versioned_sidebars/version-2.3.0-sidebars.json create mode 100644 docs/versioned_sidebars/version-2.4.0-sidebars.json create mode 100644 docs/versioned_sidebars/version-3.0.0-sidebars.json diff --git a/docs/docs/available-commands.md b/docs/docs/available-commands.md index 8ea9488..5b420d5 100644 --- a/docs/docs/available-commands.md +++ b/docs/docs/available-commands.md @@ -9,7 +9,7 @@ The option in between the square brackets `[]` must be replaced with a variable - **Main commands** - php artisan create:layout \[application-name\] - - php artisan create:resources \[model-name\] + - php artisan create:scaffold \[model-name\] - php artisan create:controller \[model-name\] - php artisan create:model \[model-name\] - php artisan create:form-request \[model-name\] @@ -36,6 +36,14 @@ The option in between the square brackets `[]` must be replaced with a variable - php artisan migrate:reset-all - php artisan migrate:refresh-all - php artisan migrate:status-all + - **API generation commands** + - php artisan create:api-scaffold + - php artisan create:api-controller + - php artisan create:api-resource + - **API documentation generation commands** + - php artisan api-docs:scaffold + - php artisan api-docs:create-controller + - php artisan api-docs:create-view ## Important Naming Convention @@ -57,6 +65,11 @@ The following example assumes that we are trying to create a CRUD called AssetCa - description - is_active +:::info + +A layout is required for the default views! You can use command to create a layout using the command-line. Of course you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/) in your layout for the default templates to work properly. Additionally, you can chose to design your own templates using a different or no css framework. +:::: + ### Basic example @@ -64,10 +77,10 @@ The following example assumes that we are trying to create a CRUD called AssetCa php artisan resource-file:create AssetCategory --fields=id,name,description,is_active ``` -The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` ``` -php artisan create:resources AssetCategory``` +php artisan create:scaffold AssetCategory ``` The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! @@ -78,10 +91,10 @@ The above command will create a model `app/Models/AssetCategory`, a controller ` php artisan resource-file:create AssetCategory --fields=id,name,description,is_active --translation-for=en,ar ``` -The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` ``` -php artisan create:resources AssetCategory +php artisan create:scaffold AssetCategory ``` The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! @@ -93,10 +106,10 @@ The above command will create a model `app/Models/AssetCategory`, a controller ` php artisan resource-file:create AssetCategory --fields=id,name,description,is_active ``` -The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` ``` -php artisan create:resources AssetCategory --with-form-request +php artisan create:scaffold AssetCategory --with-form-request ``` The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! @@ -108,10 +121,10 @@ The above command will create a model `app/Models/AssetCategory`, a controller ` php artisan resource-file:create AssetCategory --fields=id,name,description,is_active ``` -The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json`` +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json`` ``` -php artisan create:resources AssetCategory --with-soft-delete --with-migration +php artisan create:scaffold AssetCategory --with-soft-delete --with-migration ``` The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! @@ -120,10 +133,10 @@ The above command will create a model `app/Models/AssetCategory`, a controller ` ### Creating resources from existing database. ``` -php artisan create:resources AssetCategory --table-exists +php artisan create:scaffold AssetCategory --table-exists ``` -The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! @@ -133,10 +146,10 @@ You may also create a resource-file from existing database separately using `php ### Creating resources from existing database with translation for English and Arabic ``` -php artisan create:resources AssetCategory --table-exists --translation-for=en,ar +php artisan create:scaffold AssetCategory --table-exists --translation-for=en,ar ``` -The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json`` +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json`` Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! @@ -150,10 +163,10 @@ php artisan resource-file:form-database AssetCategory --translation-for=en,ar ``` php artisan resource-file:form-database AssetCategory --translation-for=en,ar -php artisan create:resources AssetCategory +php artisan create:scaffold AssetCategory ``` -The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! @@ -165,7 +178,7 @@ Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/C All examples below assumes that you already created a [resource-file](./resource-file.md) (i.e resources/codegenerator-fields/posts.json. This file can be created using the following command `php artisan resource-file:create Post --fields=id,title,details,is_active`) ::: -### How to create "views-layout"? +### How to create "views-layout"? :::note[To create a new layout for your application.] @@ -194,20 +207,20 @@ All examples below assumes that you already created a [resource-file](./resource :::note[Create multiple resources at the same time. It can be invoked every time the resource-file is modified to recreate the resources all over again.] ``` - php artisan create:resources [model-name] + php artisan create:scaffold [model-name] ``` The argument `[model-name]` should be replaced with the name of the model you are creating. For example: ``` - php artisan create:resources Post + php artisan create:scaffold Post ``` | Option | Description | Default | | ----------- | ----------- | ----------- | | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | - | --controller-extends | Specify which class should the controller extends. Note: the default value can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `Http\Controllers\Controller` | + | --controller-extends | Specify which class should the controller extends. Note: the default value is can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `default-controller` which means use the settings from the configurations by default `Http\Controllers\Controller` | | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | | --models-per-page | How many models to show per page on the index view. | `25` | @@ -227,9 +240,9 @@ All examples below assumes that you already created a [resource-file](./resource | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --fields | [Described below](#fields) | | | --template-name | [Described above](#template-name) | | | --force | This option will override the layout if one already exists. | | - ::: @@ -350,6 +363,9 @@ The argument `[model-name]` should be replaced with the name of the model you ar | ----------- | ----------- | ----------- | | --controller-name | [Described above](#controller-name) | | --routes-prefix | [Described above](#routes-prefix) | + | --without-route-clause | Create the routes without where clause for the id. It may be used when the primary key is not an integer | + | --for-api | Create API based routes. | + | --for-version | provide the version of the api to create the routes for. | | --table-name | [Described above](#table-name) | | --template-name | [Described above](#template-name) | ::: diff --git a/docs/docs/configurations.md b/docs/docs/configurations.md index 7ce093f..3c0d860 100644 --- a/docs/docs/configurations.md +++ b/docs/docs/configurations.md @@ -5,8 +5,16 @@ title: Configurations ## Configurations -Laravel-Code-Generator ships with lots of configurable option to give you control of the generated code. It is strongly recommended that you read the comments block above each option in the config/codegenerator.php file to get familiar with all available options. +Laravel-Code-Generator ships with lots of configurable option to give you control of the generated code. It is strongly recommended that you read the comments block above each option in the config/laravel-code-generator.php file to get familiar with all available options. -Starting at version 2.2 it ships with a unique way to override/extend the default settings to prevent you from losing your setting when upgrading the package. The config/codegenerator_custom.php is a dedicated file to store your options. This file will always be controlled by you and will never be overridden by the package. To override any configuration found in config/codegenerator.php, simple add the same option in your custom file. The generator will look at the your configuration before falling back to the default config. Note, any array based option will be extended not overridden. For more info read the comment block in the config/codegenerator_custom.php +To override or extend the default settings to prevent you from losing your setting when upgrading the package. The `config/laravel-code-generator.php` is a dedicated file to store your options. This file will always be controlled by you and will never be overridden by the package. To override any configuration found in `config/laravel-code-generator.php`, simple add the same option in your custom file. The generator will look at the your configuration before falling back to the default config. Note, any array based option will be extended not overridden. -The most important option in the configuration file is common_definitions. This option allows you to set the default properties of new field using the name of that field. Your goal should be to generate 100% ready resource-file using this config. It will save you lots of time since all your fields will get generated using the desired properties. In another words, when using `resource-file:create`, `resource-file:append` or `resource-file:from-database` to create resource file, the generated JSON will be 100% ready for you without any manual modification. +:::info +If you like to override default settings, you may execute the following command to publish a default configuration file to `/config/laravel-code-generator.php` + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=config +``` +::: + +The most important option in the configuration file is `common_definitions`. This option allows you to set the default properties of new field using the name of that field. Your goal should be to generate 100% ready resource-file using this config. It will save you lots of time since all your fields will get generated using the desired properties. In another words, when using `resource-file:create`, `resource-file:append` or `resource-file:from-database` to create resource file, the generated JSON will be 100% ready for you without any manual modification. diff --git a/docs/docs/get-started.md b/docs/docs/get-started.md index 3931537..3925a0f 100644 --- a/docs/docs/get-started.md +++ b/docs/docs/get-started.md @@ -21,13 +21,19 @@ if ($this->app->runningInConsole()) { } ``` -3. Execute the following command from the command-line to publish the package's config and the default template to start generating awesome code. +#### Optional Steps + +If you like to override default settings, you may execute the following command to publish a default configuration file to `/config/laravel-code-generator.php` ``` -php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=config ``` -A layout is required for the default views! The code generator allows you to create a layout using the command-line. Of course you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/) in your layout for the default templates to work properly. Additionally, you can chose to design your own templates using a different or no css framework. For more info on how to create a custom template [click here](https://crestapps.com/laravel-code-generator/docs/2.2#how-to-create-custom-template)! +If you like to override the default template, you may execute the following command to publish the default template to `/resources/laravel-code-generator/templates/default` + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-template +``` ### Demo diff --git a/docs/docs/intro.md b/docs/docs/intro.md index 8523b27..c2ee0c5 100644 --- a/docs/docs/intro.md +++ b/docs/docs/intro.md @@ -51,12 +51,3 @@ Explore the project's source code on [GitHub](https://github.com/CrestApps/larav #### Default template dependencies - **[CSS bootstrap Framework.](http://getbootstrap.com/)** This is only required with the default template. You are free to make your own template. - -#### (Optional) Client-side validation dependencies - - - **[jQuery.](https://jquery.com/)** Required only if you want to take advantage of the client - - **[jQuery Validation Plugin.](https://jqueryvalidation.org/)** Only if you want to take advantage of the client side validation. - -#### (Optional) Using Laravel-Collective - -Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](using-laravel-collective.md) diff --git a/docs/docs/release-notes.md b/docs/docs/release-notes.md index a193f4c..36fa413 100644 --- a/docs/docs/release-notes.md +++ b/docs/docs/release-notes.md @@ -5,99 +5,6 @@ title: Release Notes ## Release Notes -Version 2.2 introduces very exciting features, more flexibility and less work for you out of the box! It also, adds support for the new features that were introduced in Laravel 5.5. Follow is a list of all new features and changes that were introduced. - -### New Futures - -#### Smart Migrations Engine - -> Whaaaat?!! Yup that's right, version 2.2 introduce a very powerful feature which keeps track of all your migrations. After migrating, each time, you add/delete a field/index from your resource file, the code-generator will only generate a migration to add/drop and drop/add columns as needed! Keep in mind that you still have to tell the generator that you need to create a new migration using `create:migration` command or the `--with-migration` option for the `create:resources` command. -> -> Another migration related feature was to organizing your migration files! When uses migrations heavily, finding a specific migration may be overwhelming due to the number of file. This feature, allow you to group all your migrations into sub-folders. Please note that this feature is off by default, to turn it on, set organize\_migrations to true. -> -> You're probably thinking "Laravel only detects migrations in the main folder... boooo!" That is correct! However, if you are using Laravel 5.3+, version 2.2 of Laravel-code-generator include five new commands to help you interact with migration from all folders. Check out the "Command Changes" below for more info about the new commands. - -Previously Laravel-Code-Generator was limited to `belongsTo()` type relation. Now, when creating resources from existing database's table, the code-generator is able to create `hasOne()` and `hasMany()` relations by scanning the database's constrains and analyzing its existing data. -In the resource-file you can now define any [Eloquent relations](https://laravel.com/docs/5.5/eloquent-relationships). Each relation should follow the [foreign-relation](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#foreign-relations) schema below. Additionally, you can define [composite/multi-columns](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#composite-indexes) indexes! Each index should follow the [index schema](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#composite-indexes) listed below. -> -> When using Laravel 5.5, you can pass custom Validation Rule object directly in you resource file and the generator will add it to the validation rules! For more info [check out the validation option below](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#field-validation) -> -> Improved the file uploading process to allow you to delete uploaded file -> -> `--indexes` and `--relations` have been added to the following commands `resource-file:create`, `resource-file:append`, or `resource-file:reduce` to allow you to interact with the resource-file freely. -> -> The options `--fields`, `--indexes` and `--relations` for the `resource-file:create`, `resource-file:append`, or `resource-file:reduce` commands accept complex string to allow you to pass more values to add to the resource-file. For example, `--fields="name:colors;html-type:select;options:blue|yellow|green|red|white,name:second_field_name"` - -#### More configurations so you can type less and do more! - -> **plural\_names\_for** was added to the configuration file to allow you to set your own plural-form vs singular-form preference when naming controller, form-request, resource-file, language file, table-name and route group. If you like your controllers to be in a plural-form, you can simply change the default behavior from the configuration file! -> -> **controller\_name\_postfix** was added to the configuration file to allow you to change the controller's postfix. If you don't like to post fix your controllers with the word Controller, you can set this to an empty string or any other value. -> -> **form\_request\_name\_postfix** was added to the configuration file to allow you to change the form-request's postfix. If you don't like to post fix your form-request with the word FormRequest, you can set this to an empty string or any other value. -> -> **irregular\_plurals** was added to the configuration file. The code-generator heavily uses Laravel helpers `str_plural()` and `str_singular()` to generate readable code to make your code spectacular. The problem is the both generate incorrect words for irregular plurals. If you are using a language other than English, you can define a word with each with its plural-form to help the generator keep your code readable. -> -> **create\_move\_file\_method** was added to the configuration file. This option will allow the user to chose not to create moveFile method on every CRUD when file-upload is required. If you set this to false, it is your responsibility make sure that the moveFile method exists in a higher level of your code like `App\Http\Controllers\Controller`. -> -> New configuration file (i.e `config/code_generator_custom.php`) was added to allow you to override the default configuration. This way, you won't lose any of your custom configuration when upgrading which is important! For more info, read the config file. - -### Cleaner! - -> In addition to storing fields in the JSON file, indexes and relations can be stored in the same file too! For that reason, the option \--fields-file have been renamed to \--resource-file in all the commands. -> -> Version 2.2 completely dropped support for raw fields, indexes, and relations as announced in previous documents. Storing resources in JSON file is much better, easier to manage, easier to regenerate resources in the future, shorter/cleaner commands, and much more flexible! -> -> Thanks to the request validation improvement in Laravel 5.5, the controller code is much cleaner. -> -> When the `ConvertEmptyStringsToNull` middleware is registered, we no longer convert empty string to null manually since the middleware will do just that. -> -> The `--without-migration` option with `php artisan create:resources` command has been reversed. It is now `--with-migration` and should only be passed when you need a new migration created. -> -> For consistency, the \--lang-file-name option have been renamed to \--language-filename. -> -> The options `--names` in the `resource-file:create`, `resource-file:append`, and `resource-file:reduce` has been renamed to `--fields`. - -### Command Changes - -> _The following commands were renamed_ -> -> The command `create:fields-file` has been renamed to `resource-file:from-database` -> -> The command `fields-file:create` has been renamed to `resource-file:create` -> -> The command `fields-file:delete` has been renamed to `resource-file:delete` -> -> The command `fields-file:append` has been renamed to `resource-file:append` -> -> The command `fields-file:reduce` has been renamed to `resource-file:reduce` -> -> _The following commands were added_ -> -> `php artisan migrate-all` command was added. It allow you to run all of your outstanding migrations from all folders -> -> `php artisan migrate:rollback-all` command was added and it allows you to rolls back the last "batch" of migrations, which may include multiple migration from all folders. -> -> `php artisan migrate:reset-all` command was added to allow you to roll back all of your application's migrations from all folder. -> -> `php artisan migrate:refresh-all` command was added to allow you to invoke the `migrate:rollback-all` command then immediately invokes the `migrate:migrate-all` command. -> -> `php artisan migrate:status-all` command was added to allow you to checks the status of all your migration from all folders. - -### Bug Free! - -> All known bugs have been addressed! - -## Upgrade Guide - - - In your composer.json file, update the `crestapps/laravel-code-generator` dependency to `2.2.*`. - - Using the command-line, execute the following two commands to upgrade to the latest version of v2.2 - - `composer update` - - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default --force` - - If you will be using **Laravel-Collective**, execute the following commands update the default-collective template. - - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective --force` - - Move any custom template "if any" from `resources/codegenerator-templates` to `resources/laravel-code-generator/templates`. **IMPORTANT** do not copy the default and default-collective folders. - - Move all the file that are located in `resources/codegenerator-files` to `resources/laravel-code-generator/sources`. Now you should be able to delete the following two folders since they have been relocated `resources/codegenerator-templates` and `resources/codegenerator-files`. - - Finally, there are some changes to the layout stub which are required. To override your existing layout call the following code`php artisan create:layout "My New App"`. If you are using your own layout, you may want to create a temporary layout and extract the updated css/js code into your own layout/assets. The following command will create a new file called "app\_temp.blade.php" `php artisan create:layout "My New App" --layout-filename=app_temp` - -* * * \ No newline at end of file +- Upgraded the default theme to use Bootstrap 5.3. +- Improved the controller templates. +- Dropped support for Laravel-Collective Template. diff --git a/docs/docs/upgrade-guide.md b/docs/docs/upgrade-guide.md index c1ef8fb..35103f3 100644 --- a/docs/docs/upgrade-guide.md +++ b/docs/docs/upgrade-guide.md @@ -3,14 +3,6 @@ sidebar_position: 5 title: Upgrade Guide --- -## Upgrade Guide +## Version - - In your composer.json file, update the `crestapps/laravel-code-generator` dependency to `2.2.*`. - - Using the command-line, execute the following two commands to upgrade to the latest version of v2.2 - - `composer update` - - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default --force` - - If you will be using **Laravel-Collective**, execute the following commands update the default-collective template. - - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective --force` - - Move any custom template "if any" from `resources/codegenerator-templates` to `resources/laravel-code-generator/templates`. **IMPORTANT** do not copy the default and default-collective folders. - - Move all the file that are located in `resources/codegenerator-files` to `resources/laravel-code-generator/sources`. Now you should be able to delete the following two folders since they have been relocated `resources/codegenerator-templates` and `resources/codegenerator-files`. - - Finally, there are some changes to the layout stub which are required. To override your existing layout call the following code`php artisan create:layout "My New App"`. If you are using your own layout, you may want to create a temporary layout and extract the updated css/js code into your own layout/assets. The following command will create a new file called "app\_temp.blade.php" `php artisan create:layout "My New App" --layout-filename=app_temp` +No additional steps needed to upgrade. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index a941617..b714de4 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -8,12 +8,12 @@ import {themes as prismThemes} from 'prism-react-renderer'; /** @type {import('@docusaurus/types').Config} */ const config = { - title: 'My Site', - tagline: 'Dinosaurs are cool', + title: 'Laravel Code Generator', + tagline: 'A clean code generator for Laravel framework that will save you time! This awesome tool will help you generate resources like views, controllers, routes, migration, language or request forms! It is extremely flexible and customizable. It is shipped with cross-browsers compatibility template, and client-side validation to make your application awesome!', favicon: 'img/favicon.ico', // Set the production url of your site here - url: 'https://your-docusaurus-site.example.com', + url: 'https://www.crestapps.com', // Set the // pathname under which your site is served // For GitHub pages deployment, it is often '//' baseUrl: '/', @@ -44,14 +44,7 @@ const config = { // Please change this to your repo. // Remove this to remove the "edit this page" links. editUrl: - 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', - }, - blog: { - showReadingTime: true, - // Please change this to your repo. - // Remove this to remove the "edit this page" links. - editUrl: - 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', + 'https://github.com/CrestApps/laravel-code-generator/docs/docs/edit/master/', }, theme: { customCss: './src/css/custom.css', @@ -65,6 +58,10 @@ const config = { ({ // Replace with your project's social card image: 'img/docusaurus-social-card.jpg', + colorMode: { + defaultMode: 'dark', + disableSwitch: false + }, navbar: { logo: { alt: 'CrestApps Logo', @@ -77,6 +74,12 @@ const config = { position: 'left', label: 'Tutorial', }, + { + type: 'docsVersionDropdown', + position: 'right', + lastVersion: '2.3.0', + dropdownActiveClassDisabled: true, + }, { href: 'https://github.com/MikeAlhayek/laravel-code-generator', label: 'GitHub', @@ -88,10 +91,10 @@ const config = { style: 'dark', links: [ { - title: 'Docs', + title: 'Laravel Code Generator', items: [ { - label: 'Tutorial', + label: 'Documentation', to: '/docs/intro', }, ], @@ -99,33 +102,12 @@ const config = { { title: 'Community', items: [ - { - label: 'Stack Overflow', - href: 'https://stackoverflow.com/questions/tagged/docusaurus', - }, - { - label: 'Discord', - href: 'https://discordapp.com/invite/docusaurus', - }, - { - label: 'Twitter', - href: 'https://twitter.com/docusaurus', - }, - ], - }, - { - title: 'More', - items: [ - { - label: 'Blog', - to: '/blog', - }, { label: 'GitHub', - href: 'https://github.com/facebook/docusaurus', - }, + href: 'https://github.com/MikeAlhayek/laravel-code-generator', + } ], - }, + } ], copyright: `Copyright © ${new Date().getFullYear()} CrestApps, Inc.`, }, diff --git a/docs/package-lock.json b/docs/package-lock.json index 06b8c3f..84705f3 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,8 +8,8 @@ "name": "laravel-code-generator", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "3.1.0", - "@docusaurus/preset-classic": "3.1.0", + "@docusaurus/core": "^3.1.1", + "@docusaurus/preset-classic": "^3.1.1", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "prism-react-renderer": "^2.3.0", @@ -17,7 +17,7 @@ "react-dom": "^18.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/module-type-aliases": "^3.1.1", "@docusaurus/types": "3.1.0" }, "engines": { @@ -282,20 +282,20 @@ } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -378,9 +378,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", - "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.9.tgz", + "integrity": "sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", @@ -639,13 +639,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" @@ -729,9 +729,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1055,9 +1055,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", - "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5", @@ -1391,9 +1391,9 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", + "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.23.3", @@ -1710,15 +1710,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz", - "integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", + "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "semver": "^6.3.1" }, "engines": { @@ -1884,9 +1884,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", - "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", + "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-compilation-targets": "^7.23.6", @@ -1915,7 +1915,7 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.7", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", "@babel/plugin-transform-async-to-generator": "^7.23.3", "@babel/plugin-transform-block-scoped-functions": "^7.23.3", "@babel/plugin-transform-block-scoping": "^7.23.4", @@ -1937,7 +1937,7 @@ "@babel/plugin-transform-member-expression-literals": "^7.23.3", "@babel/plugin-transform-modules-amd": "^7.23.3", "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.23.3", @@ -1963,9 +1963,9 @@ "@babel/plugin-transform-unicode-regex": "^7.23.3", "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -2040,9 +2040,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2051,9 +2051,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.8.tgz", - "integrity": "sha512-2ZzmcDugdm0/YQKFVYsXiwUN7USPX8PM7cytpb4PFl87fM+qYPSvTZX//8tyeJB1j0YDmafBJEbl5f8NfLyuKw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.9.tgz", + "integrity": "sha512-oeOFTrYWdWXCvXGB5orvMTJ6gCZ9I6FBjR+M38iKNXCsPxr4xT0RTdg5uz1H7QP8pp74IzPtwritEr+JscqHXQ==", "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" @@ -2063,22 +2063,22 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", @@ -2086,8 +2086,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2096,9 +2096,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -2162,9 +2162,9 @@ } }, "node_modules/@docusaurus/core": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.1.0.tgz", - "integrity": "sha512-GWudMGYA9v26ssbAWJNfgeDZk+lrudUTclLPRsmxiknEBk7UMp7Rglonhqbsf3IKHOyHkMU4Fr5jFyg5SBx9jQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.1.1.tgz", + "integrity": "sha512-2nQfKFcf+MLEM7JXsXwQxPOmQAR6ytKMZVSx7tVi9HEm9WtfwBH1fp6bn8Gj4zLUhjWKCLoysQ9/Wm+EZCQ4yQ==", "dependencies": { "@babel/core": "^7.23.3", "@babel/generator": "^7.23.3", @@ -2176,13 +2176,13 @@ "@babel/runtime": "^7.22.6", "@babel/runtime-corejs3": "^7.22.6", "@babel/traverse": "^7.22.8", - "@docusaurus/cssnano-preset": "3.1.0", - "@docusaurus/logger": "3.1.0", - "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/cssnano-preset": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "3.1.0", - "@docusaurus/utils-common": "3.1.0", - "@docusaurus/utils-validation": "3.1.0", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.5.1", "autoprefixer": "^10.4.14", @@ -2248,9 +2248,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.1.0.tgz", - "integrity": "sha512-ned7qsgCqSv/e7KyugFNroAfiszuxLwnvMW7gmT2Ywxb/Nyt61yIw7KHyAZCMKglOalrqnYA4gMhLUCK/mVePA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.1.1.tgz", + "integrity": "sha512-LnoIDjJWbirdbVZDMq+4hwmrTl2yHDnBf9MLG9qyExeAE3ac35s4yUhJI8yyTCdixzNfKit4cbXblzzqMu4+8g==", "dependencies": { "cssnano-preset-advanced": "^5.3.10", "postcss": "^8.4.26", @@ -2262,9 +2262,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.1.0.tgz", - "integrity": "sha512-p740M+HCst1VnKKzL60Hru9xfG4EUYJDarjlEC4hHeBy9+afPmY3BNPoSHx9/8zxuYfUlv/psf7I9NvRVdmdvg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.1.1.tgz", + "integrity": "sha512-BjkNDpQzewcTnST8trx4idSoAla6zZ3w22NqM/UMcFtvYJgmoE4layuTzlfql3VFPNuivvj7BOExa/+21y4X2Q==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" @@ -2274,15 +2274,15 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.1.0.tgz", - "integrity": "sha512-D7onDz/3mgBonexWoQXPw3V2E5Bc4+jYRf9gGUUK+KoQwU8xMDaDkUUfsr7t6UBa/xox9p5+/3zwLuXOYMzGSg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.1.1.tgz", + "integrity": "sha512-xN2IccH9+sv7TmxwsDJNS97BHdmlqWwho+kIVY4tcCXkp+k4QuzvWBeunIMzeayY4Fu13A6sAjHGv5qm72KyGA==", "dependencies": { "@babel/parser": "^7.22.7", "@babel/traverse": "^7.22.8", - "@docusaurus/logger": "3.1.0", - "@docusaurus/utils": "3.1.0", - "@docusaurus/utils-validation": "3.1.0", + "@docusaurus/logger": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -2314,12 +2314,12 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.1.0.tgz", - "integrity": "sha512-XUl7Z4PWlKg4l6KF05JQ3iDHQxnPxbQUqTNKvviHyuHdlalOFv6qeDAm7IbzyQPJD5VA6y4dpRbTWSqP9ClwPg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.1.1.tgz", + "integrity": "sha512-xBJyx0TMfAfVZ9ZeIOb1awdXgR4YJMocIEzTps91rq+hJDFJgJaylDtmoRhUxkwuYmNK1GJpW95b7DLztSBJ3A==", "dependencies": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "3.1.0", + "@docusaurus/types": "3.1.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2332,18 +2332,38 @@ "react-dom": "*" } }, + "node_modules/@docusaurus/module-type-aliases/node_modules/@docusaurus/types": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", + "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.1.0.tgz", - "integrity": "sha512-iMa6WBaaEdYuxckvJtLcq/HQdlA4oEbCXf/OFfsYJCCULcDX7GDZpKxLF3X1fLsax3sSm5bmsU+CA0WD+R1g3A==", - "dependencies": { - "@docusaurus/core": "3.1.0", - "@docusaurus/logger": "3.1.0", - "@docusaurus/mdx-loader": "3.1.0", - "@docusaurus/types": "3.1.0", - "@docusaurus/utils": "3.1.0", - "@docusaurus/utils-common": "3.1.0", - "@docusaurus/utils-validation": "3.1.0", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.1.1.tgz", + "integrity": "sha512-ew/3VtVoG3emoAKmoZl7oKe1zdFOsI0NbcHS26kIxt2Z8vcXKCUgK9jJJrz0TbOipyETPhqwq4nbitrY3baibg==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", @@ -2363,18 +2383,38 @@ "react-dom": "^18.0.0" } }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/types": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", + "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.1.0.tgz", - "integrity": "sha512-el5GxhT8BLrsWD0qGa8Rq+Ttb/Ni6V3DGT2oAPio0qcs/mUAxeyXEAmihkvmLCnAgp6xD27Ce7dISZ5c6BXeqA==", - "dependencies": { - "@docusaurus/core": "3.1.0", - "@docusaurus/logger": "3.1.0", - "@docusaurus/mdx-loader": "3.1.0", - "@docusaurus/module-type-aliases": "3.1.0", - "@docusaurus/types": "3.1.0", - "@docusaurus/utils": "3.1.0", - "@docusaurus/utils-validation": "3.1.0", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.1.1.tgz", + "integrity": "sha512-lhFq4E874zw0UOH7ujzxnCayOyAt0f9YPVYSb9ohxrdCM8B4szxitUw9rIX4V9JLLHVoqIJb6k+lJJ1jrcGJ0A==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -2392,16 +2432,36 @@ "react-dom": "^18.0.0" } }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/types": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", + "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.1.0.tgz", - "integrity": "sha512-9gntYQFpk+93+Xl7gYczJu8I9uWoyRLnRwS0+NUFcs9iZtHKsdqKWPRrONC9elfN3wJ9ORwTbcVzsTiB8jvYlg==", - "dependencies": { - "@docusaurus/core": "3.1.0", - "@docusaurus/mdx-loader": "3.1.0", - "@docusaurus/types": "3.1.0", - "@docusaurus/utils": "3.1.0", - "@docusaurus/utils-validation": "3.1.0", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.1.1.tgz", + "integrity": "sha512-NQHncNRAJbyLtgTim9GlEnNYsFhuCxaCNkMwikuxLTiGIPH7r/jpb7O3f3jUMYMebZZZrDq5S7om9a6rvB/YCA==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" @@ -2414,14 +2474,34 @@ "react-dom": "^18.0.0" } }, + "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/types": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", + "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.1.0.tgz", - "integrity": "sha512-AbvJwCVRbmQ8w9d8QXbF4Iq/ui0bjPZNYFIhtducGFnm2YQRN1mraK8mCEQb0Aq0T8SqRRvSfC/far4n/s531w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.1.1.tgz", + "integrity": "sha512-xWeMkueM9wE/8LVvl4+Qf1WqwXmreMjI5Kgr7GYCDoJ8zu4kD+KaMhrh7py7MNM38IFvU1RfrGKacCEe2DRRfQ==", "dependencies": { - "@docusaurus/core": "3.1.0", - "@docusaurus/types": "3.1.0", - "@docusaurus/utils": "3.1.0", + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", "fs-extra": "^11.1.1", "react-json-view-lite": "^1.2.0", "tslib": "^2.6.0" @@ -2434,14 +2514,34 @@ "react-dom": "^18.0.0" } }, + "node_modules/@docusaurus/plugin-debug/node_modules/@docusaurus/types": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", + "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.1.0.tgz", - "integrity": "sha512-zvUOMzu9Uhz0ciqnSbtnp/5i1zEYlzarQrOXG90P3Is3efQI43p2YLW/rzSGdLb5MfQo2HvKT6Q5+tioMO045Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.1.1.tgz", + "integrity": "sha512-+q2UpWTqVi8GdlLoSlD5bS/YpxW+QMoBwrPrUH/NpvpuOi0Of7MTotsQf9JWd3hymZxl2uu1o3PIrbpxfeDFDQ==", "dependencies": { - "@docusaurus/core": "3.1.0", - "@docusaurus/types": "3.1.0", - "@docusaurus/utils-validation": "3.1.0", + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "tslib": "^2.6.0" }, "engines": { @@ -2452,14 +2552,34 @@ "react-dom": "^18.0.0" } }, + "node_modules/@docusaurus/plugin-google-analytics/node_modules/@docusaurus/types": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", + "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.1.0.tgz", - "integrity": "sha512-0txshvaY8qIBdkk2UATdVcfiCLGq3KAUfuRQD2cRNgO39iIf4/ihQxH9NXcRTwKs4Q5d9yYHoix3xT6pFuEYOg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.1.1.tgz", + "integrity": "sha512-0mMPiBBlQ5LFHTtjxuvt/6yzh8v7OxLi3CbeEsxXZpUzcKO/GC7UA1VOWUoBeQzQL508J12HTAlR3IBU9OofSw==", "dependencies": { - "@docusaurus/core": "3.1.0", - "@docusaurus/types": "3.1.0", - "@docusaurus/utils-validation": "3.1.0", + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, @@ -2471,14 +2591,34 @@ "react-dom": "^18.0.0" } }, + "node_modules/@docusaurus/plugin-google-gtag/node_modules/@docusaurus/types": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", + "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.1.0.tgz", - "integrity": "sha512-zOWPEi8kMyyPtwG0vhyXrdbLs8fIZmY5vlbi9lUU+v8VsroO5iHmfR2V3SMsrsfOanw5oV/ciWqbxezY00qEZg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.1.1.tgz", + "integrity": "sha512-d07bsrMLdDIryDtY17DgqYUbjkswZQr8cLWl4tzXrt5OR/T/zxC1SYKajzB3fd87zTu5W5klV5GmUwcNSMXQXA==", "dependencies": { - "@docusaurus/core": "3.1.0", - "@docusaurus/types": "3.1.0", - "@docusaurus/utils-validation": "3.1.0", + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "tslib": "^2.6.0" }, "engines": { @@ -2489,17 +2629,37 @@ "react-dom": "^18.0.0" } }, + "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/@docusaurus/types": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", + "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.1.0.tgz", - "integrity": "sha512-TkR5vGBpUooEB9SoW42thahqqwKzfHrQQhkB+JrEGERsl4bKODSuJNle4aA4h6LSkg4IyfXOW8XOI0NIPWb9Cg==", - "dependencies": { - "@docusaurus/core": "3.1.0", - "@docusaurus/logger": "3.1.0", - "@docusaurus/types": "3.1.0", - "@docusaurus/utils": "3.1.0", - "@docusaurus/utils-common": "3.1.0", - "@docusaurus/utils-validation": "3.1.0", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.1.1.tgz", + "integrity": "sha512-iJ4hCaMmDaUqRv131XJdt/C/jJQx8UreDWTRqZKtNydvZVh/o4yXGRRFOplea1D9b/zpwL1Y+ZDwX7xMhIOTmg==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" @@ -2512,24 +2672,44 @@ "react-dom": "^18.0.0" } }, + "node_modules/@docusaurus/plugin-sitemap/node_modules/@docusaurus/types": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", + "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@docusaurus/preset-classic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.1.0.tgz", - "integrity": "sha512-xGLQRFmmT9IinAGUDVRYZ54Ys28USNbA3OTXQXnSJLPr1rCY7CYnHI4XoOnKWrNnDiAI4ruMzunXWyaElUYCKQ==", - "dependencies": { - "@docusaurus/core": "3.1.0", - "@docusaurus/plugin-content-blog": "3.1.0", - "@docusaurus/plugin-content-docs": "3.1.0", - "@docusaurus/plugin-content-pages": "3.1.0", - "@docusaurus/plugin-debug": "3.1.0", - "@docusaurus/plugin-google-analytics": "3.1.0", - "@docusaurus/plugin-google-gtag": "3.1.0", - "@docusaurus/plugin-google-tag-manager": "3.1.0", - "@docusaurus/plugin-sitemap": "3.1.0", - "@docusaurus/theme-classic": "3.1.0", - "@docusaurus/theme-common": "3.1.0", - "@docusaurus/theme-search-algolia": "3.1.0", - "@docusaurus/types": "3.1.0" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.1.1.tgz", + "integrity": "sha512-jG4ys/hWYf69iaN/xOmF+3kjs4Nnz1Ay3CjFLDtYa8KdxbmUhArA9HmP26ru5N0wbVWhY+6kmpYhTJpez5wTyg==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/plugin-content-blog": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/plugin-content-pages": "3.1.1", + "@docusaurus/plugin-debug": "3.1.1", + "@docusaurus/plugin-google-analytics": "3.1.1", + "@docusaurus/plugin-google-gtag": "3.1.1", + "@docusaurus/plugin-google-tag-manager": "3.1.1", + "@docusaurus/plugin-sitemap": "3.1.1", + "@docusaurus/theme-classic": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/theme-search-algolia": "3.1.1", + "@docusaurus/types": "3.1.1" }, "engines": { "node": ">=18.0" @@ -2539,6 +2719,26 @@ "react-dom": "^18.0.0" } }, + "node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/types": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", + "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@docusaurus/react-loadable": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", @@ -2552,22 +2752,22 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.1.0.tgz", - "integrity": "sha512-/+jMl2Z9O8QQxves5AtHdt91gWsEZFgOV3La/6eyKEd7QLqQUtM5fxEJ40rq9NKYjqCd1HzZ9egIMeJoWwillw==", - "dependencies": { - "@docusaurus/core": "3.1.0", - "@docusaurus/mdx-loader": "3.1.0", - "@docusaurus/module-type-aliases": "3.1.0", - "@docusaurus/plugin-content-blog": "3.1.0", - "@docusaurus/plugin-content-docs": "3.1.0", - "@docusaurus/plugin-content-pages": "3.1.0", - "@docusaurus/theme-common": "3.1.0", - "@docusaurus/theme-translations": "3.1.0", - "@docusaurus/types": "3.1.0", - "@docusaurus/utils": "3.1.0", - "@docusaurus/utils-common": "3.1.0", - "@docusaurus/utils-validation": "3.1.0", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.1.1.tgz", + "integrity": "sha512-GiPE/jbWM8Qv1A14lk6s9fhc0LhPEQ00eIczRO4QL2nAQJZXkjPG6zaVx+1cZxPFWbAsqSjKe2lqkwF3fGkQ7Q==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/plugin-content-blog": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/plugin-content-pages": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/theme-translations": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", @@ -2590,18 +2790,38 @@ "react-dom": "^18.0.0" } }, + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/types": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", + "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@docusaurus/theme-common": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.1.0.tgz", - "integrity": "sha512-YGwEFALLIbF5ocW/Fy6Ae7tFWUOugEN3iwxTx8UkLAcLqYUboDSadesYtVBmRCEB4FVA2qoP7YaW3lu3apUPPw==", - "dependencies": { - "@docusaurus/mdx-loader": "3.1.0", - "@docusaurus/module-type-aliases": "3.1.0", - "@docusaurus/plugin-content-blog": "3.1.0", - "@docusaurus/plugin-content-docs": "3.1.0", - "@docusaurus/plugin-content-pages": "3.1.0", - "@docusaurus/utils": "3.1.0", - "@docusaurus/utils-common": "3.1.0", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.1.1.tgz", + "integrity": "sha512-38urZfeMhN70YaXkwIGXmcUcv2CEYK/2l4b05GkJPrbEbgpsIZM3Xc+Js2ehBGGZmfZq8GjjQ5RNQYG+MYzCYg==", + "dependencies": { + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/plugin-content-blog": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/plugin-content-pages": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2620,18 +2840,18 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.1.0.tgz", - "integrity": "sha512-8cJH0ZhPsEDjq3jR3I+wHmWzVY2bXMQJ59v2QxUmsTZxbWA4u+IzccJMIJx4ooFl9J6iYynwYsFuHxyx/KUmfQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.1.1.tgz", + "integrity": "sha512-tBH9VY5EpRctVdaAhT+b1BY8y5dyHVZGFXyCHgTrvcXQy5CV4q7serEX7U3SveNT9zksmchPyct6i1sFDC4Z5g==", "dependencies": { "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.1.0", - "@docusaurus/logger": "3.1.0", - "@docusaurus/plugin-content-docs": "3.1.0", - "@docusaurus/theme-common": "3.1.0", - "@docusaurus/theme-translations": "3.1.0", - "@docusaurus/utils": "3.1.0", - "@docusaurus/utils-validation": "3.1.0", + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/theme-translations": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "algoliasearch": "^4.18.0", "algoliasearch-helper": "^3.13.3", "clsx": "^2.0.0", @@ -2650,9 +2870,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.1.0.tgz", - "integrity": "sha512-DApE4AbDI+WBajihxB54L4scWQhVGNZAochlC9fkbciPuFAgdRBD3NREb0rgfbKexDC/rioppu/WJA0u8tS+yA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.1.1.tgz", + "integrity": "sha512-xvWQFwjxHphpJq5fgk37FXCDdAa2o+r7FX8IpMg+bGZBNXyWBu3MjZ+G4+eUVNpDhVinTc+j6ucL0Ain5KCGrg==", "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -2665,6 +2885,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.0.tgz", "integrity": "sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==", + "devOptional": true, "dependencies": { "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", @@ -2682,11 +2903,11 @@ } }, "node_modules/@docusaurus/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-LgZfp0D+UBqAh7PZ//MUNSFBMavmAPku6Si9x8x3V+S318IGCNJ6hUr2O29UO0oLybEWUjD5Jnj9IUN6XyZeeg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.1.1.tgz", + "integrity": "sha512-ZJfJa5cJQtRYtqijsPEnAZoduW6sjAQ7ZCWSZavLcV10Fw0Z3gSaPKA/B4micvj2afRZ4gZxT7KfYqe5H8Cetg==", "dependencies": { - "@docusaurus/logger": "3.1.0", + "@docusaurus/logger": "3.1.1", "@svgr/webpack": "^6.5.1", "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", @@ -2717,9 +2938,9 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.1.0.tgz", - "integrity": "sha512-SfvnRLHoZ9bwTw67knkSs7IcUR0GY2SaGkpdB/J9pChrDiGhwzKNUhcieoPyPYrOWGRPk3rVNYtoy+Bc7psPAw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.1.1.tgz", + "integrity": "sha512-eGne3olsIoNfPug5ixjepZAIxeYFzHHnor55Wb2P57jNbtVaFvij/T+MS8U0dtZRFi50QU+UPmRrXdVUM8uyMg==", "dependencies": { "tslib": "^2.6.0" }, @@ -2736,12 +2957,12 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.1.0.tgz", - "integrity": "sha512-dFxhs1NLxPOSzmcTk/eeKxLY5R+U4cua22g9MsAMiRWcwFKStZ2W3/GDY0GmnJGqNS8QAQepJrxQoyxXkJNDeg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.1.1.tgz", + "integrity": "sha512-KlY4P9YVDnwL+nExvlIpu79abfEv6ZCHuOX4ZQ+gtip+Wxj0daccdReIWWtqxM/Fb5Cz1nQvUCc7VEtT8IBUAA==", "dependencies": { - "@docusaurus/logger": "3.1.0", - "@docusaurus/utils": "3.1.0", + "@docusaurus/logger": "3.1.1", + "@docusaurus/utils": "3.1.1", "joi": "^17.9.2", "js-yaml": "^4.1.0", "tslib": "^2.6.0" @@ -3383,9 +3604,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "version": "4.17.42", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.42.tgz", + "integrity": "sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3484,9 +3705,9 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.6.tgz", - "integrity": "sha512-+EOokTnksGVgip2PbYbr3xnR7kZigh4LbybAfBAw5BpnQ+FqBYUsvCEjYd70IXKlbohQ64mzEYmMtlWUY8q//Q==", + "version": "20.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.7.tgz", + "integrity": "sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A==", "dependencies": { "undici-types": "~5.26.4" } @@ -4140,27 +4361,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", - "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4", - "core-js-compat": "^3.33.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4312,9 +4518,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", "funding": [ { "type": "opencollective", @@ -4330,8 +4536,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -5693,9 +5899,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.645", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.645.tgz", - "integrity": "sha512-EeS1oQDCmnYsRDRy2zTeC336a/4LZ6WKqvSaM1jLocEk5ZuyszkQtCpsqvuvaIXGOUjwtvF6LTcS8WueibXvSw==" + "version": "1.4.648", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.648.tgz", + "integrity": "sha512-EmFMarXeqJp9cUKu/QEciEApn0S/xRcpZWuAm32U7NgoZCimjsilKXHRO9saeEW55eHZagIDg6XTUOv32w9pjg==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -6142,9 +6348,9 @@ } }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", + "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", "dependencies": { "reusify": "^1.0.4" } diff --git a/docs/package.json b/docs/package.json index 5d2577b..6b41950 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,8 +14,8 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "3.1.0", - "@docusaurus/preset-classic": "3.1.0", + "@docusaurus/core": "^3.1.1", + "@docusaurus/preset-classic": "^3.1.1", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "prism-react-renderer": "^2.3.0", @@ -23,7 +23,7 @@ "react-dom": "^18.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/module-type-aliases": "^3.1.1", "@docusaurus/types": "3.1.0" }, "browserslist": { diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js index a8c61f2..0d35893 100644 --- a/docs/src/pages/index.js +++ b/docs/src/pages/index.js @@ -2,7 +2,7 @@ import clsx from 'clsx'; import Link from '@docusaurus/Link'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import Layout from '@theme/Layout'; -import HomepageFeatures from '@site/src/components/HomepageFeatures'; +// import HomepageFeatures from '@site/src/components/HomepageFeatures'; import Heading from '@theme/Heading'; import styles from './index.module.css'; @@ -20,7 +20,7 @@ function HomepageHeader() { - Docusaurus Tutorial - 5min ⏱️ + View Documentations
    @@ -36,7 +36,6 @@ export default function Home() { description="Description will go into a meta tag in ">
    -
    ); diff --git a/docs/src/pages/markdown-page.md b/docs/src/pages/markdown-page.md deleted file mode 100644 index 9756c5b..0000000 --- a/docs/src/pages/markdown-page.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Markdown page example ---- - -# Markdown page example - -You don't need React to write simple standalone pages. diff --git a/docs/static/img/favicon.ico b/docs/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..72503fd3283c5ae1e291f1b3b189da24cb1abdf7 GIT binary patch literal 15406 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 | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | + | --force | This option will override the layout if one already exists. | | + +::: + + +### How to create resources (complete CRUD)? + +:::note[Create multiple resources at the same time. It can be invoked every time the resource-file is modified to recreate the resources all over again.] + + ``` + php artisan create:resources [model-name] + ``` + + The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:resources Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | + | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | + | --controller-extends | Specify which class should the controller extends. Note: the default value can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `Http\Controllers\Controller` | + | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | + | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | + | --models-per-page | How many models to show per page on the index view. | `25` | + | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | + | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | + | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | + | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | + | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | + | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | + | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | + | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | + | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | + | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | + | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | + | --engine-name | A specific engine name for the database's table can be provided here. | | + | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | + | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | + | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | + | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --template-name | [Described above](#template-name) | | + | --force | This option will override the layout if one already exists. | | + +::: + + +### How to create multiple resources at once? + +:::note[Create multiple resources at the same time] + + ``` + php artisan create:mapped-resources + ``` + +When using `resource-file:create`, `resource-file:from-database` or `resource-file:delete` the `resources_map.json` file is updated behind the scenes. This options create multiple resources for all the resources found in the `resources/laravel-code-generator/sources/resources_map.json` at the same time. The resources can be invoked every time any of the resource-file is modified to recreate the resources all over again. + + | Option | Description | + | ----------- | ----------- | + | --controller-extends | [Described above](#controller-extends) | + | --with-auth | [Described above](#with-auth) | + | --models-per-page | [Described above](#models-per-page) | + | --with-form-request | [Described above](#with-form-request) | + | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | + | --form-request-directory | [Described above](#form-request-directory) | + | --table-exists | [Described above](#table-exists) | + | --translation-for | [Described above](#translation-for) | + | --primary-key | [Described above](#primary-key) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --with-migration | [Described above](#with-migration) | + | --connection-name | [Described above](#connection-name) | + | --engine-name | [Described above](#engine-name) | + | --controller-directory | [Described above](#controller-directory) | + | --model-directory | [Described above](#model-directory) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --mapping-filename | This option allows you to pass the name of the mapping-directory file. When this option is left out, the default `resources_map.json`` file will be used. | + | --force | This option will override the layout if one already exists. | +::: + + +### How to create a controller? + +:::note[Create a controller for your resource.] + + ``` + php artisan create:controller [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:controller Posts + ``` + + | Option | Description | + | ----------- | ----------- | + | --controller-name | [Described above](#controller-name) | + | --controller-directory | [Described above](#controller-directory) | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --models-per-page | [Described above](#models-per-page) | + | --language-filename | [Described above](#language-filename) | + | --with-auth | [Described above](#with-auth) | + | --with-form-request | [Described above](#with-form-request) | + | --without-form-request | [Described above](#without-form-request) | + | --form-request-directory | [Described above](#form-request-directory) | + | --model-directory | [Described above](#model-directory) | + | --views-directory | [Described above](#views-directory) | + | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | + | --without-model | Allow you to create all the resources excluding the model. | + | --without-views | Allow you to create all the resources excluding the views. | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + + + +### How to create a model? + +:::note[Create a model.] + + ``` + php artisan create:model [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:model Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --table-name | [Described above](#table-name) | + | --primary-key | [Described above](#primary-key) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --model-directory | [Described above](#model-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create routes? + +:::note[Create routes for your CRUD operations.] + + ``` + php artisan create:routes [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:routes Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --controller-name | [Described above](#controller-name) | + | --routes-prefix | [Described above](#routes-prefix) | + | --table-name | [Described above](#table-name) | + | --template-name | [Described above](#template-name) | +::: + +### How to create all standard CRUD views (i.e. Create, Read, Update and Delete)? + +> When creating views using the `create:views`, `create:create-view` or `create:update-view` an additional view called "form-view" is created. The "form-view" contains the form fields to prevent code duplication. + +:::note[Create routes for views for CRUD operations.] + + ``` + php artisan create:views [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:views Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | + | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the Create Operation? + +:::note[Create a create-view.] + + ``` + php artisan create:create-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:create-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + + +### How to create a view for the Edit Operation? + +:::note[Create an edit-view.] + + ``` + php artisan create:edit-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:edit-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the List Operation? + +:::note[Create an index-view.] + + ``` + php artisan create:index-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:index-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the Display Operation? + +:::note[Create an show-view.] + + ``` + php artisan create:show-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:show-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a form-view? + +:::note[Create an form-view.] + + ``` + php artisan create:form-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a database migration? + +:::note[Create a database migration.] + + ``` + php artisan create:migration [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:migration Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --table-name | [Described above](#table-name) | + | --resource-file | [Described above](#resource-file) | + | --migration-class-name | [Described above](#migration-class-name) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --connection-name | [Described above](#connection-name) | + | --engine-name | [Described above](#engine-name) | + | --template-name | [Described above](#template-name) | + | --force | This option will override the file if it already exists. | +::: + +### How to create form-request? + +:::note[Create a form-request for request validation.] + + ``` + php artisan create:form-request [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-request Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --class-name | [Described above](#class-name) | + | --resource-file | [Described above](#resource-file) | + | --with-auth | [Described above](#with-auth) | + | --routes-prefix | [Described above](#routes-prefix) | + | --form-request-directory | [Described above](#form-request-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a language file? + +:::note[Create a new language file.] + + ``` + php artisan create:language [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:language Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --language-filename | [Described above](#language-filename) | + | --resource-file | [Described above](#resource-file) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: diff --git a/docs/versioned_docs/version-2.0.0/configurations.md b/docs/versioned_docs/version-2.0.0/configurations.md new file mode 100644 index 0000000..7ce093f --- /dev/null +++ b/docs/versioned_docs/version-2.0.0/configurations.md @@ -0,0 +1,12 @@ +--- +sidebar_position: 5 +title: Configurations +--- + +## Configurations + +Laravel-Code-Generator ships with lots of configurable option to give you control of the generated code. It is strongly recommended that you read the comments block above each option in the config/codegenerator.php file to get familiar with all available options. + +Starting at version 2.2 it ships with a unique way to override/extend the default settings to prevent you from losing your setting when upgrading the package. The config/codegenerator_custom.php is a dedicated file to store your options. This file will always be controlled by you and will never be overridden by the package. To override any configuration found in config/codegenerator.php, simple add the same option in your custom file. The generator will look at the your configuration before falling back to the default config. Note, any array based option will be extended not overridden. For more info read the comment block in the config/codegenerator_custom.php + +The most important option in the configuration file is common_definitions. This option allows you to set the default properties of new field using the name of that field. Your goal should be to generate 100% ready resource-file using this config. It will save you lots of time since all your fields will get generated using the desired properties. In another words, when using `resource-file:create`, `resource-file:append` or `resource-file:from-database` to create resource file, the generated JSON will be 100% ready for you without any manual modification. diff --git a/docs/versioned_docs/version-2.0.0/get-started.md b/docs/versioned_docs/version-2.0.0/get-started.md new file mode 100644 index 0000000..3931537 --- /dev/null +++ b/docs/versioned_docs/version-2.0.0/get-started.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 2 +title: Getting Started +--- + +# Getting Started + +### Installation + +1. To download this package into your Laravel project, use the command-line to execute the following command + +``` +composer require crestapps/laravel-code-generator --dev +``` + +2. (You may skip this step when using Laravel >= 5.5)** To bootstrap the packages into your project while using command-line only, open the app/Providers/AppServiceProvider.php file in your project. Then, add the following code to the `register()` method. + +``` +if ($this->app->runningInConsole()) { + $this->app->register('CrestApps\CodeGenerator\CodeGeneratorServiceProvider'); +} +``` + +3. Execute the following command from the command-line to publish the package's config and the default template to start generating awesome code. + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default +``` + +A layout is required for the default views! The code generator allows you to create a layout using the command-line. Of course you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/) in your layout for the default templates to work properly. Additionally, you can chose to design your own templates using a different or no css framework. For more info on how to create a custom template [click here](https://crestapps.com/laravel-code-generator/docs/2.2#how-to-create-custom-template)! + +### Demo + +Below a video to demonstrate how to use most of the package commands. + + + diff --git a/docs/versioned_docs/version-2.0.0/intro.md b/docs/versioned_docs/version-2.0.0/intro.md new file mode 100644 index 0000000..8523b27 --- /dev/null +++ b/docs/versioned_docs/version-2.0.0/intro.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 1 +title: Introduction +--- + +## CrestApps - Laravel Code Generator + +### Introduction + +Enhance your Laravel development experience with our sophisticated code generator! This powerful tool is designed to streamline your workflow and save you valuable time. Whether you need to create views, controllers, routes, migrations, languages, or request forms, this versatile generator has got you covered – all in just seconds! + +Experience the ultimate flexibility and customization options to cater to a wide range of use cases. Our code generator comes with a cross-browser compatible template and includes client-side validation to bring a modern touch to your application. + +Explore the project's source code on [GitHub](https://github.com/CrestApps/laravel-code-generator), available under the permissive [MIT license](https://opensource.org/licenses/MIT). Upgrade your Laravel development with efficiency and style! + + +### Features + +- Craft clean, reusable, and highly readable code for seamless development. +- Generate complete resources effortlessly with a single command, supporting both migration and existing database scenarios. +- Streamline resource creation for all existing database tables with a single command. +- Save and recreate fields using a JSON file, ensuring adaptability to changing business needs. +- Leverage JSON-based resource files for easy regeneration, even when business rules evolve. +- Generate standard CRUD controllers with simple or form-request validation. +- Customize view templates to alter the standard look and feel of your application. +- Create models with relations for comprehensive data representation. +- Establish named routes with and without grouping for efficient navigation. +- Generate standard CRUD views to facilitate a consistent user experience. +- Smart migration engine tracks generated migrations to only create necessary ones. +- Intelligent handling of model relations to simplify development. +- Highly flexible with rich configurable options to suit diverse needs. +- Easy commands for resource-file creation, addition, or reduction. +- Full support for generating multi-language applications. +- Implement client-side validation for enhanced user interaction. +- Efficiently handle file uploading and store multiple responses in the database. +- Generate form-request to clean up controllers and boost code reusability. +- Create view layouts with and without client-side validation. +- Change templates at runtime for diverse view generation. +- Ability to generate views with or without Laravel-Collective integration. +- Seamless handling of date, time, or datetime fields. +- Automatic management of boolean fields for hassle-free development. + + +### Dependencies + +#### Prerequisite + + - **[Laravel >= 5.1 framework.](https://laravel.com/)** + - **[Composer](https://getcomposer.org/)** installed on your local workstation. + +#### Default template dependencies + + - **[CSS bootstrap Framework.](http://getbootstrap.com/)** This is only required with the default template. You are free to make your own template. + +#### (Optional) Client-side validation dependencies + + - **[jQuery.](https://jquery.com/)** Required only if you want to take advantage of the client + - **[jQuery Validation Plugin.](https://jqueryvalidation.org/)** Only if you want to take advantage of the client side validation. + +#### (Optional) Using Laravel-Collective + +Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](using-laravel-collective.md) diff --git a/docs/docs/laravel-collective.md b/docs/versioned_docs/version-2.0.0/laravel-collective.md similarity index 100% rename from docs/docs/laravel-collective.md rename to docs/versioned_docs/version-2.0.0/laravel-collective.md diff --git a/docs/versioned_docs/version-2.0.0/release-notes.md b/docs/versioned_docs/version-2.0.0/release-notes.md new file mode 100644 index 0000000..a193f4c --- /dev/null +++ b/docs/versioned_docs/version-2.0.0/release-notes.md @@ -0,0 +1,103 @@ +--- +sidebar_position: 6 +title: Release Notes +--- + +## Release Notes + +Version 2.2 introduces very exciting features, more flexibility and less work for you out of the box! It also, adds support for the new features that were introduced in Laravel 5.5. Follow is a list of all new features and changes that were introduced. + +### New Futures + +#### Smart Migrations Engine + +> Whaaaat?!! Yup that's right, version 2.2 introduce a very powerful feature which keeps track of all your migrations. After migrating, each time, you add/delete a field/index from your resource file, the code-generator will only generate a migration to add/drop and drop/add columns as needed! Keep in mind that you still have to tell the generator that you need to create a new migration using `create:migration` command or the `--with-migration` option for the `create:resources` command. +> +> Another migration related feature was to organizing your migration files! When uses migrations heavily, finding a specific migration may be overwhelming due to the number of file. This feature, allow you to group all your migrations into sub-folders. Please note that this feature is off by default, to turn it on, set organize\_migrations to true. +> +> You're probably thinking "Laravel only detects migrations in the main folder... boooo!" That is correct! However, if you are using Laravel 5.3+, version 2.2 of Laravel-code-generator include five new commands to help you interact with migration from all folders. Check out the "Command Changes" below for more info about the new commands. + +Previously Laravel-Code-Generator was limited to `belongsTo()` type relation. Now, when creating resources from existing database's table, the code-generator is able to create `hasOne()` and `hasMany()` relations by scanning the database's constrains and analyzing its existing data. +In the resource-file you can now define any [Eloquent relations](https://laravel.com/docs/5.5/eloquent-relationships). Each relation should follow the [foreign-relation](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#foreign-relations) schema below. Additionally, you can define [composite/multi-columns](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#composite-indexes) indexes! Each index should follow the [index schema](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#composite-indexes) listed below. +> +> When using Laravel 5.5, you can pass custom Validation Rule object directly in you resource file and the generator will add it to the validation rules! For more info [check out the validation option below](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#field-validation) +> +> Improved the file uploading process to allow you to delete uploaded file +> +> `--indexes` and `--relations` have been added to the following commands `resource-file:create`, `resource-file:append`, or `resource-file:reduce` to allow you to interact with the resource-file freely. +> +> The options `--fields`, `--indexes` and `--relations` for the `resource-file:create`, `resource-file:append`, or `resource-file:reduce` commands accept complex string to allow you to pass more values to add to the resource-file. For example, `--fields="name:colors;html-type:select;options:blue|yellow|green|red|white,name:second_field_name"` + +#### More configurations so you can type less and do more! + +> **plural\_names\_for** was added to the configuration file to allow you to set your own plural-form vs singular-form preference when naming controller, form-request, resource-file, language file, table-name and route group. If you like your controllers to be in a plural-form, you can simply change the default behavior from the configuration file! +> +> **controller\_name\_postfix** was added to the configuration file to allow you to change the controller's postfix. If you don't like to post fix your controllers with the word Controller, you can set this to an empty string or any other value. +> +> **form\_request\_name\_postfix** was added to the configuration file to allow you to change the form-request's postfix. If you don't like to post fix your form-request with the word FormRequest, you can set this to an empty string or any other value. +> +> **irregular\_plurals** was added to the configuration file. The code-generator heavily uses Laravel helpers `str_plural()` and `str_singular()` to generate readable code to make your code spectacular. The problem is the both generate incorrect words for irregular plurals. If you are using a language other than English, you can define a word with each with its plural-form to help the generator keep your code readable. +> +> **create\_move\_file\_method** was added to the configuration file. This option will allow the user to chose not to create moveFile method on every CRUD when file-upload is required. If you set this to false, it is your responsibility make sure that the moveFile method exists in a higher level of your code like `App\Http\Controllers\Controller`. +> +> New configuration file (i.e `config/code_generator_custom.php`) was added to allow you to override the default configuration. This way, you won't lose any of your custom configuration when upgrading which is important! For more info, read the config file. + +### Cleaner! + +> In addition to storing fields in the JSON file, indexes and relations can be stored in the same file too! For that reason, the option \--fields-file have been renamed to \--resource-file in all the commands. +> +> Version 2.2 completely dropped support for raw fields, indexes, and relations as announced in previous documents. Storing resources in JSON file is much better, easier to manage, easier to regenerate resources in the future, shorter/cleaner commands, and much more flexible! +> +> Thanks to the request validation improvement in Laravel 5.5, the controller code is much cleaner. +> +> When the `ConvertEmptyStringsToNull` middleware is registered, we no longer convert empty string to null manually since the middleware will do just that. +> +> The `--without-migration` option with `php artisan create:resources` command has been reversed. It is now `--with-migration` and should only be passed when you need a new migration created. +> +> For consistency, the \--lang-file-name option have been renamed to \--language-filename. +> +> The options `--names` in the `resource-file:create`, `resource-file:append`, and `resource-file:reduce` has been renamed to `--fields`. + +### Command Changes + +> _The following commands were renamed_ +> +> The command `create:fields-file` has been renamed to `resource-file:from-database` +> +> The command `fields-file:create` has been renamed to `resource-file:create` +> +> The command `fields-file:delete` has been renamed to `resource-file:delete` +> +> The command `fields-file:append` has been renamed to `resource-file:append` +> +> The command `fields-file:reduce` has been renamed to `resource-file:reduce` +> +> _The following commands were added_ +> +> `php artisan migrate-all` command was added. It allow you to run all of your outstanding migrations from all folders +> +> `php artisan migrate:rollback-all` command was added and it allows you to rolls back the last "batch" of migrations, which may include multiple migration from all folders. +> +> `php artisan migrate:reset-all` command was added to allow you to roll back all of your application's migrations from all folder. +> +> `php artisan migrate:refresh-all` command was added to allow you to invoke the `migrate:rollback-all` command then immediately invokes the `migrate:migrate-all` command. +> +> `php artisan migrate:status-all` command was added to allow you to checks the status of all your migration from all folders. + +### Bug Free! + +> All known bugs have been addressed! + +## Upgrade Guide + + - In your composer.json file, update the `crestapps/laravel-code-generator` dependency to `2.2.*`. + - Using the command-line, execute the following two commands to upgrade to the latest version of v2.2 + - `composer update` + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default --force` + - If you will be using **Laravel-Collective**, execute the following commands update the default-collective template. + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective --force` + - Move any custom template "if any" from `resources/codegenerator-templates` to `resources/laravel-code-generator/templates`. **IMPORTANT** do not copy the default and default-collective folders. + - Move all the file that are located in `resources/codegenerator-files` to `resources/laravel-code-generator/sources`. Now you should be able to delete the following two folders since they have been relocated `resources/codegenerator-templates` and `resources/codegenerator-files`. + - Finally, there are some changes to the layout stub which are required. To override your existing layout call the following code`php artisan create:layout "My New App"`. If you are using your own layout, you may want to create a temporary layout and extract the updated css/js code into your own layout/assets. The following command will create a new file called "app\_temp.blade.php" `php artisan create:layout "My New App" --layout-filename=app_temp` + +* * * \ No newline at end of file diff --git a/docs/versioned_docs/version-2.0.0/resource-file.md b/docs/versioned_docs/version-2.0.0/resource-file.md new file mode 100644 index 0000000..52d8448 --- /dev/null +++ b/docs/versioned_docs/version-2.0.0/resource-file.md @@ -0,0 +1,318 @@ +--- +sidebar_position: 4 +title: Resource File +--- + +## Resource Files + +A JSON based file that allows you to define how you like your resource generated. You can define your fields, indexes, and model relations. + +## Available Commands to Manage Resource Files + +The option in between the square brackets `[]` must be replaced with a variable of your choice. + - php artisan resource-file:create \[model-name\] + - php artisan resource-file:append \[model-name\] + - php artisan resource-file:reduce \[model-name\] + - php artisan resource-file:delete \[model-name\] + +### How to create resource-file? + +:::note[Create a new resource file.] + + ``` + php artisan resource-file:create [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:create Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | + | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | + | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | + | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| + | --translation-for | [Described above](#translation-for) | + | --force | This option will override any file that already exist. | +::: + +### How to add resources to existing resource-file? + +:::note[Appends a new fields, indexes, or relations to an existing resource-file. If the resource-file does not exists one will be created] + + ``` + php artisan resource-file:append Post --fields=notes,created_by + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-request Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | + | --translation-for | [Described above](#translation-for) | +::: + +### How to remove resources to existing resource-file? + + > If the resource-file becomes empty, it will automatically get deleted by calling the `resource-file:delete` command. + +:::note[Removes fields, indexes, or relations to an existing resource-file.] + + ``` + php artisan resource-file:reduce [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:reduce Post --fields=notes,created_by + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | +::: + +### How to delete existing resource-file? + +> It is recommended to use this command to delete file instead of manually deleting it. This command will also delete the mapped relation in the resource_map file. + +:::note[Delete existing resource-file. ] + + ``` + php artisan resource-file:delete [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:delete Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | +::: + +### How to create a resource's file from existing database? + +> Are you looking to convert existing application to Laravel framework? Or, looking to use database-first instead of code-first approach? No problem! This package allows you to create a resource's file from existing database. +> +> You can easily take advantage of this feature by passing `--table-exists` option to the `create:resources` command to automatically generate all the resources from existing database's table. + +:::note[Convert your existing database into resource file, then the create:resources command is used to generate the resources] + + ``` + php artisan resource-file:from-database [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:from-database Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --table-name | [Described above](#table-name) | + | --database-name | [Described above](#database-name) | + | --resource-file | [Described above](#resource-file) | + | --resource-filename| [Described above](#resource-filename) | + | --translation-for| [Described above](#translation-for) | + | --force | This option will override any file that already exist. | + +::: + + +### Fields + +> The minimum requirement for creating a field is a unique name. However, the code-generator is very flexible and allows you to have full control on the fields. Below all the available properties for defining a field + +#### HTML Properties + | Property name | Description | + | ----------- | ----------- | + | name | A unique name for the field. This is a required field. | + | label | A user-friendly title to describe the field. If this option is left out, the field's name is used to generate a title. | + | validation | You can pass any valid Laravel validation rule. The rules should be separated by bar `\|`.

    For example: `required\|string\|min:2\|max:255`

    Start with Laravel 5.5, you can define custom validation rules and pass them as well. For example, to use a custom validation rule called Uppercase in addition to the required rule, you can pass this string required|new Uppercase.

    To learn more about the valid options please visit [Laravel documentation](https://laravel.com/docs/master/validation#available-validation-rules).

    When the rule `required` is not used, the field in the migration file will automatically become nullable. | + | html-type | Default value: `text`. A valid property will be one of the following options
    `text`, `textarea`, `password`,`email`,`checkbox`,`radio`,`number`,`select`,`hidden`,`file`,`selectRange`,`selectMonth`, or `multipleSelect`.

    Note: when using file type, after the file is uploaded to the designated path, the filename is stored in the database by default. For everything to work properly, the data-type must be of some sort of a string type. Or modify the behavior of moveFile method to handle the new file.

    By default this process stores the uploaded file in the path defined in config file.

    Note: when using checkbox, or multipleSelect, the items are stored in the database as JSON string. Additionally, the items in the index or form views are displayed separated by the value provided in the delimiter property. | + | delimiter | Default value: "; ". When generating a form with checkbox or a select menu that accepts multiple answers, we need either store the results in a foreign model or store the records in a string field. By default, the code generator will convert the multiple options that a user selected into a JSON string before the results are stored using a Eloquent-mutator method.

    When the data is presented on the show and/or index views, the options are displayed separated by the value of the delimiter. Of course, you can always change this behavior to fit your needs by removing the accessor and mutator methods in the model and modifying the views accordingly. | + | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."`` property. Classes that are already set in the views will not be replaced. | + | date-format | Default value: "m/d/Y H:i A". Any field with the type date, time or datetime can be formatted different when it is displayed. You can change the display format using this option. | + | html-value | A default value to set the field to. When using multiple options based html-type like checkbox, multipleSelect you can set this property to array of values to set multiple values by default. Ex, `["Red","Green"]` | + | options | If you used select, checkbox, or radio for the html-type property, this is where you provide the options. Here are some example of the schema.

    A simple array: In this option, the value will be the numeric index value of the item in the array.
    ```"options": ["Prefer not to say","Male","Female"]```.
    Using explicit values
    ```"options": { "": Prefer not to say", "male": "Male","female": "Female"}```.
    Using multiple language phrases for each option
    ```"options": {"en":{"":"Prefer not to say","male":"Male","female":"Female"},"ar":{"":"Prefer not to say in Arabic","male":"Male in Arabic","female":"Female in Arabic"},"fr":{"":"Prefer not to say in French","male":"Male in French","female":"Female in French"}}``` | + | is-inline-options | Default value: false. If the html-type is set to radio or checkbox, setting this option to true will put the items next to each other instead of a vertical list. | + | placeholder or place-holder | You can set a placeholder value when html-type is set to text, number, email, textarea or select. | + | is-on-index | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index view. | + | is-on-form | Default value: `true`. Setting the value to `false` will prevent from adding this field to the form view. | + | is-on-show | Default value: `true`. Setting the value to `false` will prevent from adding this field to the show view. | + | is-on-views | Default value: `true`. Setting the value to `false`` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | + | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns`` in the configuration file, allow you to list the common field name to automatically set them as header. | + + #### Database Properties + | Property name | Description | + | ----------- | ----------- | + | data-type | Default is `varchar`. The database column type. The following are valid types:
    ```'char', 'date', 'datetime', 'datetimetz', 'biginteger', 'bigint', 'blob', 'binary', 'bool', 'boolean', 'decimal', 'double', 'enum', 'list', 'float', 'int', 'integer', 'ipaddress', 'json', 'jsonb', 'longtext', 'macaddress', 'mediuminteger', 'mediumint', 'mediumtext', 'morphs', 'string', 'varchar', 'nvarchar', 'text', 'time', 'timetz', 'tinyinteger', 'tinyint', 'timestamp', 'timestamptz', 'unsignedbiginteger', 'unsignedbigint', 'unsignedInteger', 'unsignedint', 'unsignedmediuminteger', 'unsignedmediumint', 'unsignedsmallinteger', 'unsignedsmallint', 'unsignedtinyinteger', 'uuid', 'uuid'```

    Note: you can add short cuts if needed to in the `laravel-code-generator.php` config file.You can add new mapping to the eloquent_type_to_method array. | + | data-type-params | This option allows you to specify parameters for the data type. Please ensure you provide valid parameters otherwise unexpected behavior will occur. For example, varchar and char will only need a maximum of one integer parameter where double, decimal and float require two integer parameters.

    Command line example with specifying a decimal precision and scale: `data-type-params=5,2`. JSON file example `"data-type-params": [5,2]`

    If this option left out while some sort of a string data-type was used along with a max validation rule, the max value is used to limit the length of the sting in the database when a migration is generated | + | data-value | Default value is null. The default value for the database column. | + | is-auto-increment | Default value is false. Setting this value to true will make this column a primary with auto increment identity. | + | is-primary | Default value is false. You can set this field as the primary for retrieving records from the database. You can only set one column as the primary. If you set multiple fields are primary, the first one will be selected and the rest will be ignored.

    Note: if you set the is-auto-increment field, this option will automatically get set. Ths only time this can be used is to create a primary field you don't wish for the database to auto assign it. | + | is-index | Default value is false. Setting this value to true will add index to this column. | + | is-unique | Default value is false. Setting this value to true will add a unique index to this column. | + | is-nullable | Default value is false. Setting this value to true will make this column nullable.

    Note: when setting this option to true, the default value will be set to NULL unless you pass a different value to data-value.

    When the validation rule contains "nullable", "required_if", "required_unless", "required_with", "required_with_all", "required_without", "required_without_all" or does NOT contains "required" rule, this flag will automatically gets set. | + | is-unsigned | Default value is false. Setting this value to true will make this column unsigned. This option should only be used with numeric types only. | + | comment | This option will allow you to add meta description of the field in the database. | + | is-data | This option will allow you to casts a data filed to a Carbon object. | + | cast-as | This option will allow you to cast a field to php's native type. | + | foreign-relation | This option will allow you to create a foreign relation between the models.

    ```json {"name":"creator","type":"belongsTo","params":["App\\User","created_by"],"field":"name"}``` | + | foreign-constraint | This option will allow you to create a foreign relation between the models.

    ```json {"field":"user_id","references":"id","on":"users","on-delete":"cascade","on-update":"cascade","references-model":"App\\Models\\User"} ``` | + | on-store | This option allows you to set a fixed value on the store action. For example, Illuminate\Support\Facades\Auth::Id(); will set the value to the current user id when the model is first created. Assuming you're using [Laravel Authentication](https://laravel.com/docs/master/authentication). | + | on-update | Similar to on-storeThis option allows you to set a fixed value on the update action. | + + +### Managing fields using JSON file + +Storing the field's specification in a JSON file enables you to easily reuse the field with multiple commands. It also allows you to recreate the resources in the future if you decided to add/remove fields after the views have been crafted. The JSON files are typically stored in /resources/laravel-generator. If you don’t like where these files are kept, you can change that path from the config/laravelgenerator.php file. + +The following command should be used to manage the resource-file to make this process easier. + + - php artisan resource-file:from-database [model-name] + - php artisan resource-file:create [model-name] + - php artisan resource-file:append [model-name] + - php artisan resource-file:reduce [model-name] + - php artisan resource-file:delete [model-name] + +### Resources mapping file + +The resources-map file, is a JSON file that is used to keep track of the fields-file and the model classes to allow you to create the resources all at once. + +The default file name is `resources_map.json` and can be changed from the configuration file. + +When using `resource-file:create`, `resource-file:from-database` or `resource-file:delete` commands, a file called resources_map.json is automatically updated. + +The following is the structure of the file. + +```json + { + { + "model-name": "Brand", + "resource-file": "brands.json" + }, + { + "model-name": "Customer", + "resource-file": "customers.json", + "table-name": "customers_table" + } +} +``` + + All option that are available to the `create:resources` can be used in the mapping file to make creating resources for all models customizable. Here is an example + + ```json + { + { + "model-name": "Customer", + "resource-file": "customers.json", + "table-name": "customers_table", + "routes-prefix" "customers_prefix" + } +} + ``` + +To generate all the resources mapped in the resources_map.json file, use the following command + +``` +php artisan create:mapped-resources [model-name] +``` + +### Generating clean and complete fields out of the box! + +When using the commands that generate fields, our goal is to generate fields configured and ready for use without having to make any change to the generated fields. + +While it is not possible to cover 100% of the use cases, Laravel-code-generator is shipped with a powerful configuration option to allow you to add conditions to handle your own use case. + +The key `common_definitions` in the `config/laravel-code-generator.php` file allows you match field name using pattern then set the properties accordingly. + +For example, you may want to add a global date, time, or datetime picker using javascript for any field where its name ends with `_at`. + +You can do that by adding the following entry + +```json +[ + 'match' => ['*_at'], + 'set' => [ + 'class' => 'datetime-picker', + ] +] +``` + +The same thing can be done for any field that ends with `_date` or starts with `date_of`` +```json +[ + 'match' => ['*_date','date_of_*'], + 'set' => [ + 'class' => 'date-picker', + ] +] +``` + +Of course, you can set any of the field's option like html-type, data-type, data-type-params or foreign relation. You can set the configuration as fits your environment, then you'll be able to create fields-file ready to generate resources with minimal work! + +The conditions are applied to each field top to bottom, the configuration at the bottom of the array will take presence over the once on the top in case multiple conditions were matched. + + +:::info +It is strongly recommended to read the comments above each option in the configuration file to help you understand and customize the generator to fit your needs! +::: + + +### Foreign Relations + +If you're using a code-first-approach and like to define relations between your models, you can easily define that in the relations keyword entry of the resource-file. Each relation can be defined using the following schema + +```json +{ + "name": "posts", // the name of the relation + "type": "hasMany", // the type of the relation + "params": [ // the parameters for the used relation. + "App\\Models\\Comment", + "post_id", + "id" + ], + "field": "name" // the name of the field on the foreign model to use as display value +} +``` +:::info +When creating `hasOne()` or `belongsTo()` relations, it be best to define them at the field level using the foreign-relation option. +Composite Indexes +::: + + +### Composite Indexes +If you're using a code-first-approach and like to define indexes with multiple columns, you can easily do that by adding these indexed to the Indexes keyword entry in the resource-file file. Each composite index can be defined using the following schema + +```json +{ + "name": "owner", // The name of the index to use, if no name is set a one will be generated. + "type": "unique", // Valid index type is one of the following 'index','unique' or 'primary'. If the type is not provided, 'index' is used. + "columns": [ // List of the columns' names to be included in the index left to right. + "first_name", + "last_name" + ] +} +``` diff --git a/docs/versioned_docs/version-2.0.0/upgrade-guide.md b/docs/versioned_docs/version-2.0.0/upgrade-guide.md new file mode 100644 index 0000000..c1ef8fb --- /dev/null +++ b/docs/versioned_docs/version-2.0.0/upgrade-guide.md @@ -0,0 +1,16 @@ +--- +sidebar_position: 5 +title: Upgrade Guide +--- + +## Upgrade Guide + + - In your composer.json file, update the `crestapps/laravel-code-generator` dependency to `2.2.*`. + - Using the command-line, execute the following two commands to upgrade to the latest version of v2.2 + - `composer update` + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default --force` + - If you will be using **Laravel-Collective**, execute the following commands update the default-collective template. + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective --force` + - Move any custom template "if any" from `resources/codegenerator-templates` to `resources/laravel-code-generator/templates`. **IMPORTANT** do not copy the default and default-collective folders. + - Move all the file that are located in `resources/codegenerator-files` to `resources/laravel-code-generator/sources`. Now you should be able to delete the following two folders since they have been relocated `resources/codegenerator-templates` and `resources/codegenerator-files`. + - Finally, there are some changes to the layout stub which are required. To override your existing layout call the following code`php artisan create:layout "My New App"`. If you are using your own layout, you may want to create a temporary layout and extract the updated css/js code into your own layout/assets. The following command will create a new file called "app\_temp.blade.php" `php artisan create:layout "My New App" --layout-filename=app_temp` diff --git a/docs/versioned_docs/version-2.1.0/available-commands.md b/docs/versioned_docs/version-2.1.0/available-commands.md new file mode 100644 index 0000000..8ea9488 --- /dev/null +++ b/docs/versioned_docs/version-2.1.0/available-commands.md @@ -0,0 +1,577 @@ +--- +sidebar_position: 3 +title: Available Commands +--- + +## Available Commands + +The option in between the square brackets `[]` must be replaced with a variable of your choice. + + - **Main commands** + - php artisan create:layout \[application-name\] + - php artisan create:resources \[model-name\] + - php artisan create:controller \[model-name\] + - php artisan create:model \[model-name\] + - php artisan create:form-request \[model-name\] + - php artisan create:routes \[model-name\] + - php artisan create:migration \[model-name\] + - php artisan create:language \[model-name\] + - php artisan create:mapped-resources + - **Views commands** + - php artisan create:views \[model-name\] + - php artisan create:index-view \[model-name\] + - php artisan create:create-view \[model-name\] + - php artisan create:edit-view \[model-name\] + - php artisan create:show-view \[model-name\] + - php artisan create:form-view \[model-name\] + - **Resource's files commands** + - php artisan resource-file:from-database \[model-name\] + - php artisan resource-file:create \[model-name\] + - php artisan resource-file:append \[model-name\] + - php artisan resource-file:reduce \[model-name\] + - php artisan resource-file:delete \[model-name\] + - **Migration commands** + - php artisan migrate-all + - php artisan migrate:rollback-all + - php artisan migrate:reset-all + - php artisan migrate:refresh-all + - php artisan migrate:status-all + +## Important Naming Convention + +Laravel-Code-Generator strive to generate highly readable, and error free code. In order to keep your code readable, it is important to follow a good naming convention when choosing names for your models, fields, tables, relations and so on. Here is a list of recommendation that we believe is important to keep your code clean and highly readable. + +1. Since each model represents a single object/row in a list/database, naming the model should be written in singular-form while using [Studly Case](https://laravel.com/docs/5.5/helpers#method-studly-case). For example, `Post` and `PostCategory`... +2. Since a database is a collection of model's object, table naming should always be plural and written in lowercase while using [Snake Case](https://en.wikipedia.org/wiki/Snake_case). For example, `users`, `post_categories`... +3. Primary keys should be named `id` in the table. +4. Since the foreign key represents a foreign/other table, the name should always end with `_id`. For example, `post_id`, `user_id`, `post_category_id`... +5. Field naming should always be in a singular-form and written in lowercase while using [Snake Case](https://en.wikipedia.org/wiki/Snake_case). For example, `title`, `first_name`, `description`... + + +## Examples + +The following example assumes that we are trying to create a CRUD called AssetCategory with the fields listed below. + + - id + - name + - description + - is_active + + +### Basic example + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +``` +php artisan create:resources AssetCategory``` +``` +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example using translations for English and Arabic + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active --translation-for=en,ar +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +``` +php artisan create:resources AssetCategory +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example with form-request + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +``` +php artisan create:resources AssetCategory --with-form-request +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example with soft-delete and migration + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json`` + +``` +php artisan create:resources AssetCategory --with-soft-delete --with-migration +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Creating resources from existing database. + +``` +php artisan create:resources AssetCategory --table-exists +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + +You may also create a resource-file from existing database separately using `php artisan resource-file:form-database AssetCategory` + + +### Creating resources from existing database with translation for English and Arabic + +``` +php artisan create:resources AssetCategory --table-exists --translation-for=en,ar +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json`` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + +You may also create a [resource-file](./resource-file.md) from existing database separately using + +``` +php artisan resource-file:form-database AssetCategory --translation-for=en,ar +``` + +### Creating resources from existing database with translation for English and Arabic in two step for better control over the fields! + +``` +php artisan resource-file:form-database AssetCategory --translation-for=en,ar +php artisan create:resources AssetCategory +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + + + +## How To + +::: Info +All examples below assumes that you already created a [resource-file](./resource-file.md) (i.e resources/codegenerator-fields/posts.json. This file can be created using the following command `php artisan resource-file:create Post --fields=id,title,details,is_active`) +::: + +### How to create "views-layout"? + +:::note[To create a new layout for your application.] + + ``` + php artisan create:layout [application-name] + ``` + + The argument `[application-name]` should be replaced with the name of the application you are creating. For example: + + ``` + php artisan create:layout "My New Laravel App" + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --layout-filename | The name of the layout file to be used. | `app` (i.e, creates `app.blade.php`) | + | --layout-directory | The directory to create the layout under. | `layouts` | + | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | + | --force | This option will override the layout if one already exists. | | + +::: + + +### How to create resources (complete CRUD)? + +:::note[Create multiple resources at the same time. It can be invoked every time the resource-file is modified to recreate the resources all over again.] + + ``` + php artisan create:resources [model-name] + ``` + + The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:resources Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | + | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | + | --controller-extends | Specify which class should the controller extends. Note: the default value can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `Http\Controllers\Controller` | + | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | + | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | + | --models-per-page | How many models to show per page on the index view. | `25` | + | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | + | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | + | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | + | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | + | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | + | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | + | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | + | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | + | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | + | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | + | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | + | --engine-name | A specific engine name for the database's table can be provided here. | | + | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | + | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | + | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | + | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --template-name | [Described above](#template-name) | | + | --force | This option will override the layout if one already exists. | | + +::: + + +### How to create multiple resources at once? + +:::note[Create multiple resources at the same time] + + ``` + php artisan create:mapped-resources + ``` + +When using `resource-file:create`, `resource-file:from-database` or `resource-file:delete` the `resources_map.json` file is updated behind the scenes. This options create multiple resources for all the resources found in the `resources/laravel-code-generator/sources/resources_map.json` at the same time. The resources can be invoked every time any of the resource-file is modified to recreate the resources all over again. + + | Option | Description | + | ----------- | ----------- | + | --controller-extends | [Described above](#controller-extends) | + | --with-auth | [Described above](#with-auth) | + | --models-per-page | [Described above](#models-per-page) | + | --with-form-request | [Described above](#with-form-request) | + | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | + | --form-request-directory | [Described above](#form-request-directory) | + | --table-exists | [Described above](#table-exists) | + | --translation-for | [Described above](#translation-for) | + | --primary-key | [Described above](#primary-key) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --with-migration | [Described above](#with-migration) | + | --connection-name | [Described above](#connection-name) | + | --engine-name | [Described above](#engine-name) | + | --controller-directory | [Described above](#controller-directory) | + | --model-directory | [Described above](#model-directory) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --mapping-filename | This option allows you to pass the name of the mapping-directory file. When this option is left out, the default `resources_map.json`` file will be used. | + | --force | This option will override the layout if one already exists. | +::: + + +### How to create a controller? + +:::note[Create a controller for your resource.] + + ``` + php artisan create:controller [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:controller Posts + ``` + + | Option | Description | + | ----------- | ----------- | + | --controller-name | [Described above](#controller-name) | + | --controller-directory | [Described above](#controller-directory) | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --models-per-page | [Described above](#models-per-page) | + | --language-filename | [Described above](#language-filename) | + | --with-auth | [Described above](#with-auth) | + | --with-form-request | [Described above](#with-form-request) | + | --without-form-request | [Described above](#without-form-request) | + | --form-request-directory | [Described above](#form-request-directory) | + | --model-directory | [Described above](#model-directory) | + | --views-directory | [Described above](#views-directory) | + | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | + | --without-model | Allow you to create all the resources excluding the model. | + | --without-views | Allow you to create all the resources excluding the views. | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + + + +### How to create a model? + +:::note[Create a model.] + + ``` + php artisan create:model [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:model Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --table-name | [Described above](#table-name) | + | --primary-key | [Described above](#primary-key) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --model-directory | [Described above](#model-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create routes? + +:::note[Create routes for your CRUD operations.] + + ``` + php artisan create:routes [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:routes Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --controller-name | [Described above](#controller-name) | + | --routes-prefix | [Described above](#routes-prefix) | + | --table-name | [Described above](#table-name) | + | --template-name | [Described above](#template-name) | +::: + +### How to create all standard CRUD views (i.e. Create, Read, Update and Delete)? + +> When creating views using the `create:views`, `create:create-view` or `create:update-view` an additional view called "form-view" is created. The "form-view" contains the form fields to prevent code duplication. + +:::note[Create routes for views for CRUD operations.] + + ``` + php artisan create:views [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:views Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | + | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the Create Operation? + +:::note[Create a create-view.] + + ``` + php artisan create:create-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:create-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + + +### How to create a view for the Edit Operation? + +:::note[Create an edit-view.] + + ``` + php artisan create:edit-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:edit-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the List Operation? + +:::note[Create an index-view.] + + ``` + php artisan create:index-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:index-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the Display Operation? + +:::note[Create an show-view.] + + ``` + php artisan create:show-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:show-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a form-view? + +:::note[Create an form-view.] + + ``` + php artisan create:form-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a database migration? + +:::note[Create a database migration.] + + ``` + php artisan create:migration [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:migration Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --table-name | [Described above](#table-name) | + | --resource-file | [Described above](#resource-file) | + | --migration-class-name | [Described above](#migration-class-name) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --connection-name | [Described above](#connection-name) | + | --engine-name | [Described above](#engine-name) | + | --template-name | [Described above](#template-name) | + | --force | This option will override the file if it already exists. | +::: + +### How to create form-request? + +:::note[Create a form-request for request validation.] + + ``` + php artisan create:form-request [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-request Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --class-name | [Described above](#class-name) | + | --resource-file | [Described above](#resource-file) | + | --with-auth | [Described above](#with-auth) | + | --routes-prefix | [Described above](#routes-prefix) | + | --form-request-directory | [Described above](#form-request-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a language file? + +:::note[Create a new language file.] + + ``` + php artisan create:language [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:language Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --language-filename | [Described above](#language-filename) | + | --resource-file | [Described above](#resource-file) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: diff --git a/docs/versioned_docs/version-2.1.0/configurations.md b/docs/versioned_docs/version-2.1.0/configurations.md new file mode 100644 index 0000000..7ce093f --- /dev/null +++ b/docs/versioned_docs/version-2.1.0/configurations.md @@ -0,0 +1,12 @@ +--- +sidebar_position: 5 +title: Configurations +--- + +## Configurations + +Laravel-Code-Generator ships with lots of configurable option to give you control of the generated code. It is strongly recommended that you read the comments block above each option in the config/codegenerator.php file to get familiar with all available options. + +Starting at version 2.2 it ships with a unique way to override/extend the default settings to prevent you from losing your setting when upgrading the package. The config/codegenerator_custom.php is a dedicated file to store your options. This file will always be controlled by you and will never be overridden by the package. To override any configuration found in config/codegenerator.php, simple add the same option in your custom file. The generator will look at the your configuration before falling back to the default config. Note, any array based option will be extended not overridden. For more info read the comment block in the config/codegenerator_custom.php + +The most important option in the configuration file is common_definitions. This option allows you to set the default properties of new field using the name of that field. Your goal should be to generate 100% ready resource-file using this config. It will save you lots of time since all your fields will get generated using the desired properties. In another words, when using `resource-file:create`, `resource-file:append` or `resource-file:from-database` to create resource file, the generated JSON will be 100% ready for you without any manual modification. diff --git a/docs/versioned_docs/version-2.1.0/get-started.md b/docs/versioned_docs/version-2.1.0/get-started.md new file mode 100644 index 0000000..3931537 --- /dev/null +++ b/docs/versioned_docs/version-2.1.0/get-started.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 2 +title: Getting Started +--- + +# Getting Started + +### Installation + +1. To download this package into your Laravel project, use the command-line to execute the following command + +``` +composer require crestapps/laravel-code-generator --dev +``` + +2. (You may skip this step when using Laravel >= 5.5)** To bootstrap the packages into your project while using command-line only, open the app/Providers/AppServiceProvider.php file in your project. Then, add the following code to the `register()` method. + +``` +if ($this->app->runningInConsole()) { + $this->app->register('CrestApps\CodeGenerator\CodeGeneratorServiceProvider'); +} +``` + +3. Execute the following command from the command-line to publish the package's config and the default template to start generating awesome code. + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default +``` + +A layout is required for the default views! The code generator allows you to create a layout using the command-line. Of course you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/) in your layout for the default templates to work properly. Additionally, you can chose to design your own templates using a different or no css framework. For more info on how to create a custom template [click here](https://crestapps.com/laravel-code-generator/docs/2.2#how-to-create-custom-template)! + +### Demo + +Below a video to demonstrate how to use most of the package commands. + + + diff --git a/docs/versioned_docs/version-2.1.0/intro.md b/docs/versioned_docs/version-2.1.0/intro.md new file mode 100644 index 0000000..8523b27 --- /dev/null +++ b/docs/versioned_docs/version-2.1.0/intro.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 1 +title: Introduction +--- + +## CrestApps - Laravel Code Generator + +### Introduction + +Enhance your Laravel development experience with our sophisticated code generator! This powerful tool is designed to streamline your workflow and save you valuable time. Whether you need to create views, controllers, routes, migrations, languages, or request forms, this versatile generator has got you covered – all in just seconds! + +Experience the ultimate flexibility and customization options to cater to a wide range of use cases. Our code generator comes with a cross-browser compatible template and includes client-side validation to bring a modern touch to your application. + +Explore the project's source code on [GitHub](https://github.com/CrestApps/laravel-code-generator), available under the permissive [MIT license](https://opensource.org/licenses/MIT). Upgrade your Laravel development with efficiency and style! + + +### Features + +- Craft clean, reusable, and highly readable code for seamless development. +- Generate complete resources effortlessly with a single command, supporting both migration and existing database scenarios. +- Streamline resource creation for all existing database tables with a single command. +- Save and recreate fields using a JSON file, ensuring adaptability to changing business needs. +- Leverage JSON-based resource files for easy regeneration, even when business rules evolve. +- Generate standard CRUD controllers with simple or form-request validation. +- Customize view templates to alter the standard look and feel of your application. +- Create models with relations for comprehensive data representation. +- Establish named routes with and without grouping for efficient navigation. +- Generate standard CRUD views to facilitate a consistent user experience. +- Smart migration engine tracks generated migrations to only create necessary ones. +- Intelligent handling of model relations to simplify development. +- Highly flexible with rich configurable options to suit diverse needs. +- Easy commands for resource-file creation, addition, or reduction. +- Full support for generating multi-language applications. +- Implement client-side validation for enhanced user interaction. +- Efficiently handle file uploading and store multiple responses in the database. +- Generate form-request to clean up controllers and boost code reusability. +- Create view layouts with and without client-side validation. +- Change templates at runtime for diverse view generation. +- Ability to generate views with or without Laravel-Collective integration. +- Seamless handling of date, time, or datetime fields. +- Automatic management of boolean fields for hassle-free development. + + +### Dependencies + +#### Prerequisite + + - **[Laravel >= 5.1 framework.](https://laravel.com/)** + - **[Composer](https://getcomposer.org/)** installed on your local workstation. + +#### Default template dependencies + + - **[CSS bootstrap Framework.](http://getbootstrap.com/)** This is only required with the default template. You are free to make your own template. + +#### (Optional) Client-side validation dependencies + + - **[jQuery.](https://jquery.com/)** Required only if you want to take advantage of the client + - **[jQuery Validation Plugin.](https://jqueryvalidation.org/)** Only if you want to take advantage of the client side validation. + +#### (Optional) Using Laravel-Collective + +Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](using-laravel-collective.md) diff --git a/docs/versioned_docs/version-2.1.0/laravel-collective.md b/docs/versioned_docs/version-2.1.0/laravel-collective.md new file mode 100644 index 0000000..a19e9aa --- /dev/null +++ b/docs/versioned_docs/version-2.1.0/laravel-collective.md @@ -0,0 +1,36 @@ +--- +sidebar_position: 10 +title: Laravel Collective +--- + +## Using Laravel-Collective to generate views + +:::info + To use Laravel-Collective to generate view, you'll have to install the [Laravel-Collective](https://github.com/LaravelCollective/html) package. + ::: + + Laravel-Code-Generator is capable of fully generating views using Laravel-Collective package. In fact, it is shipped with a template based on Laravel-collective called "default-collective". + +By default, the template "default-collective" is not published to the resources folder as it is not needed out of the box. To publish it, use the command-line to execute the following command. + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective +``` + +### How to generate views using the Laravel-Collective package? + +There are two ways to generate views using Laravel-Collective + +- Via the package configuration + + > Open the config file of the package /config/codegenerator.php change the value of the key template to default-collective + +- Or, via command-line + + > Change the template name at run time. In another words, pass the following option--template-name=default-collective from command-line + +### How to create a new template based on Laravel-Collective? + +First, duplicate the folder `/resources/codegenerator-templates/default-collective`` and name it anything your like. + +Second, open up the package config file and add the new template name to the `laravel_collective_templates` array. diff --git a/docs/versioned_docs/version-2.1.0/release-notes.md b/docs/versioned_docs/version-2.1.0/release-notes.md new file mode 100644 index 0000000..a193f4c --- /dev/null +++ b/docs/versioned_docs/version-2.1.0/release-notes.md @@ -0,0 +1,103 @@ +--- +sidebar_position: 6 +title: Release Notes +--- + +## Release Notes + +Version 2.2 introduces very exciting features, more flexibility and less work for you out of the box! It also, adds support for the new features that were introduced in Laravel 5.5. Follow is a list of all new features and changes that were introduced. + +### New Futures + +#### Smart Migrations Engine + +> Whaaaat?!! Yup that's right, version 2.2 introduce a very powerful feature which keeps track of all your migrations. After migrating, each time, you add/delete a field/index from your resource file, the code-generator will only generate a migration to add/drop and drop/add columns as needed! Keep in mind that you still have to tell the generator that you need to create a new migration using `create:migration` command or the `--with-migration` option for the `create:resources` command. +> +> Another migration related feature was to organizing your migration files! When uses migrations heavily, finding a specific migration may be overwhelming due to the number of file. This feature, allow you to group all your migrations into sub-folders. Please note that this feature is off by default, to turn it on, set organize\_migrations to true. +> +> You're probably thinking "Laravel only detects migrations in the main folder... boooo!" That is correct! However, if you are using Laravel 5.3+, version 2.2 of Laravel-code-generator include five new commands to help you interact with migration from all folders. Check out the "Command Changes" below for more info about the new commands. + +Previously Laravel-Code-Generator was limited to `belongsTo()` type relation. Now, when creating resources from existing database's table, the code-generator is able to create `hasOne()` and `hasMany()` relations by scanning the database's constrains and analyzing its existing data. +In the resource-file you can now define any [Eloquent relations](https://laravel.com/docs/5.5/eloquent-relationships). Each relation should follow the [foreign-relation](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#foreign-relations) schema below. Additionally, you can define [composite/multi-columns](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#composite-indexes) indexes! Each index should follow the [index schema](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#composite-indexes) listed below. +> +> When using Laravel 5.5, you can pass custom Validation Rule object directly in you resource file and the generator will add it to the validation rules! For more info [check out the validation option below](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#field-validation) +> +> Improved the file uploading process to allow you to delete uploaded file +> +> `--indexes` and `--relations` have been added to the following commands `resource-file:create`, `resource-file:append`, or `resource-file:reduce` to allow you to interact with the resource-file freely. +> +> The options `--fields`, `--indexes` and `--relations` for the `resource-file:create`, `resource-file:append`, or `resource-file:reduce` commands accept complex string to allow you to pass more values to add to the resource-file. For example, `--fields="name:colors;html-type:select;options:blue|yellow|green|red|white,name:second_field_name"` + +#### More configurations so you can type less and do more! + +> **plural\_names\_for** was added to the configuration file to allow you to set your own plural-form vs singular-form preference when naming controller, form-request, resource-file, language file, table-name and route group. If you like your controllers to be in a plural-form, you can simply change the default behavior from the configuration file! +> +> **controller\_name\_postfix** was added to the configuration file to allow you to change the controller's postfix. If you don't like to post fix your controllers with the word Controller, you can set this to an empty string or any other value. +> +> **form\_request\_name\_postfix** was added to the configuration file to allow you to change the form-request's postfix. If you don't like to post fix your form-request with the word FormRequest, you can set this to an empty string or any other value. +> +> **irregular\_plurals** was added to the configuration file. The code-generator heavily uses Laravel helpers `str_plural()` and `str_singular()` to generate readable code to make your code spectacular. The problem is the both generate incorrect words for irregular plurals. If you are using a language other than English, you can define a word with each with its plural-form to help the generator keep your code readable. +> +> **create\_move\_file\_method** was added to the configuration file. This option will allow the user to chose not to create moveFile method on every CRUD when file-upload is required. If you set this to false, it is your responsibility make sure that the moveFile method exists in a higher level of your code like `App\Http\Controllers\Controller`. +> +> New configuration file (i.e `config/code_generator_custom.php`) was added to allow you to override the default configuration. This way, you won't lose any of your custom configuration when upgrading which is important! For more info, read the config file. + +### Cleaner! + +> In addition to storing fields in the JSON file, indexes and relations can be stored in the same file too! For that reason, the option \--fields-file have been renamed to \--resource-file in all the commands. +> +> Version 2.2 completely dropped support for raw fields, indexes, and relations as announced in previous documents. Storing resources in JSON file is much better, easier to manage, easier to regenerate resources in the future, shorter/cleaner commands, and much more flexible! +> +> Thanks to the request validation improvement in Laravel 5.5, the controller code is much cleaner. +> +> When the `ConvertEmptyStringsToNull` middleware is registered, we no longer convert empty string to null manually since the middleware will do just that. +> +> The `--without-migration` option with `php artisan create:resources` command has been reversed. It is now `--with-migration` and should only be passed when you need a new migration created. +> +> For consistency, the \--lang-file-name option have been renamed to \--language-filename. +> +> The options `--names` in the `resource-file:create`, `resource-file:append`, and `resource-file:reduce` has been renamed to `--fields`. + +### Command Changes + +> _The following commands were renamed_ +> +> The command `create:fields-file` has been renamed to `resource-file:from-database` +> +> The command `fields-file:create` has been renamed to `resource-file:create` +> +> The command `fields-file:delete` has been renamed to `resource-file:delete` +> +> The command `fields-file:append` has been renamed to `resource-file:append` +> +> The command `fields-file:reduce` has been renamed to `resource-file:reduce` +> +> _The following commands were added_ +> +> `php artisan migrate-all` command was added. It allow you to run all of your outstanding migrations from all folders +> +> `php artisan migrate:rollback-all` command was added and it allows you to rolls back the last "batch" of migrations, which may include multiple migration from all folders. +> +> `php artisan migrate:reset-all` command was added to allow you to roll back all of your application's migrations from all folder. +> +> `php artisan migrate:refresh-all` command was added to allow you to invoke the `migrate:rollback-all` command then immediately invokes the `migrate:migrate-all` command. +> +> `php artisan migrate:status-all` command was added to allow you to checks the status of all your migration from all folders. + +### Bug Free! + +> All known bugs have been addressed! + +## Upgrade Guide + + - In your composer.json file, update the `crestapps/laravel-code-generator` dependency to `2.2.*`. + - Using the command-line, execute the following two commands to upgrade to the latest version of v2.2 + - `composer update` + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default --force` + - If you will be using **Laravel-Collective**, execute the following commands update the default-collective template. + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective --force` + - Move any custom template "if any" from `resources/codegenerator-templates` to `resources/laravel-code-generator/templates`. **IMPORTANT** do not copy the default and default-collective folders. + - Move all the file that are located in `resources/codegenerator-files` to `resources/laravel-code-generator/sources`. Now you should be able to delete the following two folders since they have been relocated `resources/codegenerator-templates` and `resources/codegenerator-files`. + - Finally, there are some changes to the layout stub which are required. To override your existing layout call the following code`php artisan create:layout "My New App"`. If you are using your own layout, you may want to create a temporary layout and extract the updated css/js code into your own layout/assets. The following command will create a new file called "app\_temp.blade.php" `php artisan create:layout "My New App" --layout-filename=app_temp` + +* * * \ No newline at end of file diff --git a/docs/versioned_docs/version-2.1.0/resource-file.md b/docs/versioned_docs/version-2.1.0/resource-file.md new file mode 100644 index 0000000..52d8448 --- /dev/null +++ b/docs/versioned_docs/version-2.1.0/resource-file.md @@ -0,0 +1,318 @@ +--- +sidebar_position: 4 +title: Resource File +--- + +## Resource Files + +A JSON based file that allows you to define how you like your resource generated. You can define your fields, indexes, and model relations. + +## Available Commands to Manage Resource Files + +The option in between the square brackets `[]` must be replaced with a variable of your choice. + - php artisan resource-file:create \[model-name\] + - php artisan resource-file:append \[model-name\] + - php artisan resource-file:reduce \[model-name\] + - php artisan resource-file:delete \[model-name\] + +### How to create resource-file? + +:::note[Create a new resource file.] + + ``` + php artisan resource-file:create [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:create Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | + | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | + | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | + | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| + | --translation-for | [Described above](#translation-for) | + | --force | This option will override any file that already exist. | +::: + +### How to add resources to existing resource-file? + +:::note[Appends a new fields, indexes, or relations to an existing resource-file. If the resource-file does not exists one will be created] + + ``` + php artisan resource-file:append Post --fields=notes,created_by + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-request Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | + | --translation-for | [Described above](#translation-for) | +::: + +### How to remove resources to existing resource-file? + + > If the resource-file becomes empty, it will automatically get deleted by calling the `resource-file:delete` command. + +:::note[Removes fields, indexes, or relations to an existing resource-file.] + + ``` + php artisan resource-file:reduce [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:reduce Post --fields=notes,created_by + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | +::: + +### How to delete existing resource-file? + +> It is recommended to use this command to delete file instead of manually deleting it. This command will also delete the mapped relation in the resource_map file. + +:::note[Delete existing resource-file. ] + + ``` + php artisan resource-file:delete [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:delete Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | +::: + +### How to create a resource's file from existing database? + +> Are you looking to convert existing application to Laravel framework? Or, looking to use database-first instead of code-first approach? No problem! This package allows you to create a resource's file from existing database. +> +> You can easily take advantage of this feature by passing `--table-exists` option to the `create:resources` command to automatically generate all the resources from existing database's table. + +:::note[Convert your existing database into resource file, then the create:resources command is used to generate the resources] + + ``` + php artisan resource-file:from-database [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:from-database Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --table-name | [Described above](#table-name) | + | --database-name | [Described above](#database-name) | + | --resource-file | [Described above](#resource-file) | + | --resource-filename| [Described above](#resource-filename) | + | --translation-for| [Described above](#translation-for) | + | --force | This option will override any file that already exist. | + +::: + + +### Fields + +> The minimum requirement for creating a field is a unique name. However, the code-generator is very flexible and allows you to have full control on the fields. Below all the available properties for defining a field + +#### HTML Properties + | Property name | Description | + | ----------- | ----------- | + | name | A unique name for the field. This is a required field. | + | label | A user-friendly title to describe the field. If this option is left out, the field's name is used to generate a title. | + | validation | You can pass any valid Laravel validation rule. The rules should be separated by bar `\|`.

    For example: `required\|string\|min:2\|max:255`

    Start with Laravel 5.5, you can define custom validation rules and pass them as well. For example, to use a custom validation rule called Uppercase in addition to the required rule, you can pass this string required|new Uppercase.

    To learn more about the valid options please visit [Laravel documentation](https://laravel.com/docs/master/validation#available-validation-rules).

    When the rule `required` is not used, the field in the migration file will automatically become nullable. | + | html-type | Default value: `text`. A valid property will be one of the following options
    `text`, `textarea`, `password`,`email`,`checkbox`,`radio`,`number`,`select`,`hidden`,`file`,`selectRange`,`selectMonth`, or `multipleSelect`.

    Note: when using file type, after the file is uploaded to the designated path, the filename is stored in the database by default. For everything to work properly, the data-type must be of some sort of a string type. Or modify the behavior of moveFile method to handle the new file.

    By default this process stores the uploaded file in the path defined in config file.

    Note: when using checkbox, or multipleSelect, the items are stored in the database as JSON string. Additionally, the items in the index or form views are displayed separated by the value provided in the delimiter property. | + | delimiter | Default value: "; ". When generating a form with checkbox or a select menu that accepts multiple answers, we need either store the results in a foreign model or store the records in a string field. By default, the code generator will convert the multiple options that a user selected into a JSON string before the results are stored using a Eloquent-mutator method.

    When the data is presented on the show and/or index views, the options are displayed separated by the value of the delimiter. Of course, you can always change this behavior to fit your needs by removing the accessor and mutator methods in the model and modifying the views accordingly. | + | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."`` property. Classes that are already set in the views will not be replaced. | + | date-format | Default value: "m/d/Y H:i A". Any field with the type date, time or datetime can be formatted different when it is displayed. You can change the display format using this option. | + | html-value | A default value to set the field to. When using multiple options based html-type like checkbox, multipleSelect you can set this property to array of values to set multiple values by default. Ex, `["Red","Green"]` | + | options | If you used select, checkbox, or radio for the html-type property, this is where you provide the options. Here are some example of the schema.

    A simple array: In this option, the value will be the numeric index value of the item in the array.
    ```"options": ["Prefer not to say","Male","Female"]```.
    Using explicit values
    ```"options": { "": Prefer not to say", "male": "Male","female": "Female"}```.
    Using multiple language phrases for each option
    ```"options": {"en":{"":"Prefer not to say","male":"Male","female":"Female"},"ar":{"":"Prefer not to say in Arabic","male":"Male in Arabic","female":"Female in Arabic"},"fr":{"":"Prefer not to say in French","male":"Male in French","female":"Female in French"}}``` | + | is-inline-options | Default value: false. If the html-type is set to radio or checkbox, setting this option to true will put the items next to each other instead of a vertical list. | + | placeholder or place-holder | You can set a placeholder value when html-type is set to text, number, email, textarea or select. | + | is-on-index | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index view. | + | is-on-form | Default value: `true`. Setting the value to `false` will prevent from adding this field to the form view. | + | is-on-show | Default value: `true`. Setting the value to `false` will prevent from adding this field to the show view. | + | is-on-views | Default value: `true`. Setting the value to `false`` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | + | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns`` in the configuration file, allow you to list the common field name to automatically set them as header. | + + #### Database Properties + | Property name | Description | + | ----------- | ----------- | + | data-type | Default is `varchar`. The database column type. The following are valid types:
    ```'char', 'date', 'datetime', 'datetimetz', 'biginteger', 'bigint', 'blob', 'binary', 'bool', 'boolean', 'decimal', 'double', 'enum', 'list', 'float', 'int', 'integer', 'ipaddress', 'json', 'jsonb', 'longtext', 'macaddress', 'mediuminteger', 'mediumint', 'mediumtext', 'morphs', 'string', 'varchar', 'nvarchar', 'text', 'time', 'timetz', 'tinyinteger', 'tinyint', 'timestamp', 'timestamptz', 'unsignedbiginteger', 'unsignedbigint', 'unsignedInteger', 'unsignedint', 'unsignedmediuminteger', 'unsignedmediumint', 'unsignedsmallinteger', 'unsignedsmallint', 'unsignedtinyinteger', 'uuid', 'uuid'```

    Note: you can add short cuts if needed to in the `laravel-code-generator.php` config file.You can add new mapping to the eloquent_type_to_method array. | + | data-type-params | This option allows you to specify parameters for the data type. Please ensure you provide valid parameters otherwise unexpected behavior will occur. For example, varchar and char will only need a maximum of one integer parameter where double, decimal and float require two integer parameters.

    Command line example with specifying a decimal precision and scale: `data-type-params=5,2`. JSON file example `"data-type-params": [5,2]`

    If this option left out while some sort of a string data-type was used along with a max validation rule, the max value is used to limit the length of the sting in the database when a migration is generated | + | data-value | Default value is null. The default value for the database column. | + | is-auto-increment | Default value is false. Setting this value to true will make this column a primary with auto increment identity. | + | is-primary | Default value is false. You can set this field as the primary for retrieving records from the database. You can only set one column as the primary. If you set multiple fields are primary, the first one will be selected and the rest will be ignored.

    Note: if you set the is-auto-increment field, this option will automatically get set. Ths only time this can be used is to create a primary field you don't wish for the database to auto assign it. | + | is-index | Default value is false. Setting this value to true will add index to this column. | + | is-unique | Default value is false. Setting this value to true will add a unique index to this column. | + | is-nullable | Default value is false. Setting this value to true will make this column nullable.

    Note: when setting this option to true, the default value will be set to NULL unless you pass a different value to data-value.

    When the validation rule contains "nullable", "required_if", "required_unless", "required_with", "required_with_all", "required_without", "required_without_all" or does NOT contains "required" rule, this flag will automatically gets set. | + | is-unsigned | Default value is false. Setting this value to true will make this column unsigned. This option should only be used with numeric types only. | + | comment | This option will allow you to add meta description of the field in the database. | + | is-data | This option will allow you to casts a data filed to a Carbon object. | + | cast-as | This option will allow you to cast a field to php's native type. | + | foreign-relation | This option will allow you to create a foreign relation between the models.

    ```json {"name":"creator","type":"belongsTo","params":["App\\User","created_by"],"field":"name"}``` | + | foreign-constraint | This option will allow you to create a foreign relation between the models.

    ```json {"field":"user_id","references":"id","on":"users","on-delete":"cascade","on-update":"cascade","references-model":"App\\Models\\User"} ``` | + | on-store | This option allows you to set a fixed value on the store action. For example, Illuminate\Support\Facades\Auth::Id(); will set the value to the current user id when the model is first created. Assuming you're using [Laravel Authentication](https://laravel.com/docs/master/authentication). | + | on-update | Similar to on-storeThis option allows you to set a fixed value on the update action. | + + +### Managing fields using JSON file + +Storing the field's specification in a JSON file enables you to easily reuse the field with multiple commands. It also allows you to recreate the resources in the future if you decided to add/remove fields after the views have been crafted. The JSON files are typically stored in /resources/laravel-generator. If you don’t like where these files are kept, you can change that path from the config/laravelgenerator.php file. + +The following command should be used to manage the resource-file to make this process easier. + + - php artisan resource-file:from-database [model-name] + - php artisan resource-file:create [model-name] + - php artisan resource-file:append [model-name] + - php artisan resource-file:reduce [model-name] + - php artisan resource-file:delete [model-name] + +### Resources mapping file + +The resources-map file, is a JSON file that is used to keep track of the fields-file and the model classes to allow you to create the resources all at once. + +The default file name is `resources_map.json` and can be changed from the configuration file. + +When using `resource-file:create`, `resource-file:from-database` or `resource-file:delete` commands, a file called resources_map.json is automatically updated. + +The following is the structure of the file. + +```json + { + { + "model-name": "Brand", + "resource-file": "brands.json" + }, + { + "model-name": "Customer", + "resource-file": "customers.json", + "table-name": "customers_table" + } +} +``` + + All option that are available to the `create:resources` can be used in the mapping file to make creating resources for all models customizable. Here is an example + + ```json + { + { + "model-name": "Customer", + "resource-file": "customers.json", + "table-name": "customers_table", + "routes-prefix" "customers_prefix" + } +} + ``` + +To generate all the resources mapped in the resources_map.json file, use the following command + +``` +php artisan create:mapped-resources [model-name] +``` + +### Generating clean and complete fields out of the box! + +When using the commands that generate fields, our goal is to generate fields configured and ready for use without having to make any change to the generated fields. + +While it is not possible to cover 100% of the use cases, Laravel-code-generator is shipped with a powerful configuration option to allow you to add conditions to handle your own use case. + +The key `common_definitions` in the `config/laravel-code-generator.php` file allows you match field name using pattern then set the properties accordingly. + +For example, you may want to add a global date, time, or datetime picker using javascript for any field where its name ends with `_at`. + +You can do that by adding the following entry + +```json +[ + 'match' => ['*_at'], + 'set' => [ + 'class' => 'datetime-picker', + ] +] +``` + +The same thing can be done for any field that ends with `_date` or starts with `date_of`` +```json +[ + 'match' => ['*_date','date_of_*'], + 'set' => [ + 'class' => 'date-picker', + ] +] +``` + +Of course, you can set any of the field's option like html-type, data-type, data-type-params or foreign relation. You can set the configuration as fits your environment, then you'll be able to create fields-file ready to generate resources with minimal work! + +The conditions are applied to each field top to bottom, the configuration at the bottom of the array will take presence over the once on the top in case multiple conditions were matched. + + +:::info +It is strongly recommended to read the comments above each option in the configuration file to help you understand and customize the generator to fit your needs! +::: + + +### Foreign Relations + +If you're using a code-first-approach and like to define relations between your models, you can easily define that in the relations keyword entry of the resource-file. Each relation can be defined using the following schema + +```json +{ + "name": "posts", // the name of the relation + "type": "hasMany", // the type of the relation + "params": [ // the parameters for the used relation. + "App\\Models\\Comment", + "post_id", + "id" + ], + "field": "name" // the name of the field on the foreign model to use as display value +} +``` +:::info +When creating `hasOne()` or `belongsTo()` relations, it be best to define them at the field level using the foreign-relation option. +Composite Indexes +::: + + +### Composite Indexes +If you're using a code-first-approach and like to define indexes with multiple columns, you can easily do that by adding these indexed to the Indexes keyword entry in the resource-file file. Each composite index can be defined using the following schema + +```json +{ + "name": "owner", // The name of the index to use, if no name is set a one will be generated. + "type": "unique", // Valid index type is one of the following 'index','unique' or 'primary'. If the type is not provided, 'index' is used. + "columns": [ // List of the columns' names to be included in the index left to right. + "first_name", + "last_name" + ] +} +``` diff --git a/docs/versioned_docs/version-2.1.0/upgrade-guide.md b/docs/versioned_docs/version-2.1.0/upgrade-guide.md new file mode 100644 index 0000000..c1ef8fb --- /dev/null +++ b/docs/versioned_docs/version-2.1.0/upgrade-guide.md @@ -0,0 +1,16 @@ +--- +sidebar_position: 5 +title: Upgrade Guide +--- + +## Upgrade Guide + + - In your composer.json file, update the `crestapps/laravel-code-generator` dependency to `2.2.*`. + - Using the command-line, execute the following two commands to upgrade to the latest version of v2.2 + - `composer update` + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default --force` + - If you will be using **Laravel-Collective**, execute the following commands update the default-collective template. + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective --force` + - Move any custom template "if any" from `resources/codegenerator-templates` to `resources/laravel-code-generator/templates`. **IMPORTANT** do not copy the default and default-collective folders. + - Move all the file that are located in `resources/codegenerator-files` to `resources/laravel-code-generator/sources`. Now you should be able to delete the following two folders since they have been relocated `resources/codegenerator-templates` and `resources/codegenerator-files`. + - Finally, there are some changes to the layout stub which are required. To override your existing layout call the following code`php artisan create:layout "My New App"`. If you are using your own layout, you may want to create a temporary layout and extract the updated css/js code into your own layout/assets. The following command will create a new file called "app\_temp.blade.php" `php artisan create:layout "My New App" --layout-filename=app_temp` diff --git a/docs/versioned_docs/version-2.2.0/available-commands.md b/docs/versioned_docs/version-2.2.0/available-commands.md new file mode 100644 index 0000000..8ea9488 --- /dev/null +++ b/docs/versioned_docs/version-2.2.0/available-commands.md @@ -0,0 +1,577 @@ +--- +sidebar_position: 3 +title: Available Commands +--- + +## Available Commands + +The option in between the square brackets `[]` must be replaced with a variable of your choice. + + - **Main commands** + - php artisan create:layout \[application-name\] + - php artisan create:resources \[model-name\] + - php artisan create:controller \[model-name\] + - php artisan create:model \[model-name\] + - php artisan create:form-request \[model-name\] + - php artisan create:routes \[model-name\] + - php artisan create:migration \[model-name\] + - php artisan create:language \[model-name\] + - php artisan create:mapped-resources + - **Views commands** + - php artisan create:views \[model-name\] + - php artisan create:index-view \[model-name\] + - php artisan create:create-view \[model-name\] + - php artisan create:edit-view \[model-name\] + - php artisan create:show-view \[model-name\] + - php artisan create:form-view \[model-name\] + - **Resource's files commands** + - php artisan resource-file:from-database \[model-name\] + - php artisan resource-file:create \[model-name\] + - php artisan resource-file:append \[model-name\] + - php artisan resource-file:reduce \[model-name\] + - php artisan resource-file:delete \[model-name\] + - **Migration commands** + - php artisan migrate-all + - php artisan migrate:rollback-all + - php artisan migrate:reset-all + - php artisan migrate:refresh-all + - php artisan migrate:status-all + +## Important Naming Convention + +Laravel-Code-Generator strive to generate highly readable, and error free code. In order to keep your code readable, it is important to follow a good naming convention when choosing names for your models, fields, tables, relations and so on. Here is a list of recommendation that we believe is important to keep your code clean and highly readable. + +1. Since each model represents a single object/row in a list/database, naming the model should be written in singular-form while using [Studly Case](https://laravel.com/docs/5.5/helpers#method-studly-case). For example, `Post` and `PostCategory`... +2. Since a database is a collection of model's object, table naming should always be plural and written in lowercase while using [Snake Case](https://en.wikipedia.org/wiki/Snake_case). For example, `users`, `post_categories`... +3. Primary keys should be named `id` in the table. +4. Since the foreign key represents a foreign/other table, the name should always end with `_id`. For example, `post_id`, `user_id`, `post_category_id`... +5. Field naming should always be in a singular-form and written in lowercase while using [Snake Case](https://en.wikipedia.org/wiki/Snake_case). For example, `title`, `first_name`, `description`... + + +## Examples + +The following example assumes that we are trying to create a CRUD called AssetCategory with the fields listed below. + + - id + - name + - description + - is_active + + +### Basic example + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +``` +php artisan create:resources AssetCategory``` +``` +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example using translations for English and Arabic + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active --translation-for=en,ar +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +``` +php artisan create:resources AssetCategory +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example with form-request + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +``` +php artisan create:resources AssetCategory --with-form-request +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example with soft-delete and migration + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json`` + +``` +php artisan create:resources AssetCategory --with-soft-delete --with-migration +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Creating resources from existing database. + +``` +php artisan create:resources AssetCategory --table-exists +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + +You may also create a resource-file from existing database separately using `php artisan resource-file:form-database AssetCategory` + + +### Creating resources from existing database with translation for English and Arabic + +``` +php artisan create:resources AssetCategory --table-exists --translation-for=en,ar +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json`` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + +You may also create a [resource-file](./resource-file.md) from existing database separately using + +``` +php artisan resource-file:form-database AssetCategory --translation-for=en,ar +``` + +### Creating resources from existing database with translation for English and Arabic in two step for better control over the fields! + +``` +php artisan resource-file:form-database AssetCategory --translation-for=en,ar +php artisan create:resources AssetCategory +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + + + +## How To + +::: Info +All examples below assumes that you already created a [resource-file](./resource-file.md) (i.e resources/codegenerator-fields/posts.json. This file can be created using the following command `php artisan resource-file:create Post --fields=id,title,details,is_active`) +::: + +### How to create "views-layout"? + +:::note[To create a new layout for your application.] + + ``` + php artisan create:layout [application-name] + ``` + + The argument `[application-name]` should be replaced with the name of the application you are creating. For example: + + ``` + php artisan create:layout "My New Laravel App" + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --layout-filename | The name of the layout file to be used. | `app` (i.e, creates `app.blade.php`) | + | --layout-directory | The directory to create the layout under. | `layouts` | + | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | + | --force | This option will override the layout if one already exists. | | + +::: + + +### How to create resources (complete CRUD)? + +:::note[Create multiple resources at the same time. It can be invoked every time the resource-file is modified to recreate the resources all over again.] + + ``` + php artisan create:resources [model-name] + ``` + + The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:resources Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | + | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | + | --controller-extends | Specify which class should the controller extends. Note: the default value can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `Http\Controllers\Controller` | + | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | + | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | + | --models-per-page | How many models to show per page on the index view. | `25` | + | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | + | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | + | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | + | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | + | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | + | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | + | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | + | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | + | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | + | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | + | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | + | --engine-name | A specific engine name for the database's table can be provided here. | | + | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | + | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | + | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | + | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --template-name | [Described above](#template-name) | | + | --force | This option will override the layout if one already exists. | | + +::: + + +### How to create multiple resources at once? + +:::note[Create multiple resources at the same time] + + ``` + php artisan create:mapped-resources + ``` + +When using `resource-file:create`, `resource-file:from-database` or `resource-file:delete` the `resources_map.json` file is updated behind the scenes. This options create multiple resources for all the resources found in the `resources/laravel-code-generator/sources/resources_map.json` at the same time. The resources can be invoked every time any of the resource-file is modified to recreate the resources all over again. + + | Option | Description | + | ----------- | ----------- | + | --controller-extends | [Described above](#controller-extends) | + | --with-auth | [Described above](#with-auth) | + | --models-per-page | [Described above](#models-per-page) | + | --with-form-request | [Described above](#with-form-request) | + | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | + | --form-request-directory | [Described above](#form-request-directory) | + | --table-exists | [Described above](#table-exists) | + | --translation-for | [Described above](#translation-for) | + | --primary-key | [Described above](#primary-key) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --with-migration | [Described above](#with-migration) | + | --connection-name | [Described above](#connection-name) | + | --engine-name | [Described above](#engine-name) | + | --controller-directory | [Described above](#controller-directory) | + | --model-directory | [Described above](#model-directory) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --mapping-filename | This option allows you to pass the name of the mapping-directory file. When this option is left out, the default `resources_map.json`` file will be used. | + | --force | This option will override the layout if one already exists. | +::: + + +### How to create a controller? + +:::note[Create a controller for your resource.] + + ``` + php artisan create:controller [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:controller Posts + ``` + + | Option | Description | + | ----------- | ----------- | + | --controller-name | [Described above](#controller-name) | + | --controller-directory | [Described above](#controller-directory) | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --models-per-page | [Described above](#models-per-page) | + | --language-filename | [Described above](#language-filename) | + | --with-auth | [Described above](#with-auth) | + | --with-form-request | [Described above](#with-form-request) | + | --without-form-request | [Described above](#without-form-request) | + | --form-request-directory | [Described above](#form-request-directory) | + | --model-directory | [Described above](#model-directory) | + | --views-directory | [Described above](#views-directory) | + | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | + | --without-model | Allow you to create all the resources excluding the model. | + | --without-views | Allow you to create all the resources excluding the views. | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + + + +### How to create a model? + +:::note[Create a model.] + + ``` + php artisan create:model [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:model Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --table-name | [Described above](#table-name) | + | --primary-key | [Described above](#primary-key) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --model-directory | [Described above](#model-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create routes? + +:::note[Create routes for your CRUD operations.] + + ``` + php artisan create:routes [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:routes Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --controller-name | [Described above](#controller-name) | + | --routes-prefix | [Described above](#routes-prefix) | + | --table-name | [Described above](#table-name) | + | --template-name | [Described above](#template-name) | +::: + +### How to create all standard CRUD views (i.e. Create, Read, Update and Delete)? + +> When creating views using the `create:views`, `create:create-view` or `create:update-view` an additional view called "form-view" is created. The "form-view" contains the form fields to prevent code duplication. + +:::note[Create routes for views for CRUD operations.] + + ``` + php artisan create:views [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:views Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | + | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the Create Operation? + +:::note[Create a create-view.] + + ``` + php artisan create:create-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:create-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + + +### How to create a view for the Edit Operation? + +:::note[Create an edit-view.] + + ``` + php artisan create:edit-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:edit-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the List Operation? + +:::note[Create an index-view.] + + ``` + php artisan create:index-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:index-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the Display Operation? + +:::note[Create an show-view.] + + ``` + php artisan create:show-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:show-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a form-view? + +:::note[Create an form-view.] + + ``` + php artisan create:form-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a database migration? + +:::note[Create a database migration.] + + ``` + php artisan create:migration [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:migration Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --table-name | [Described above](#table-name) | + | --resource-file | [Described above](#resource-file) | + | --migration-class-name | [Described above](#migration-class-name) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --connection-name | [Described above](#connection-name) | + | --engine-name | [Described above](#engine-name) | + | --template-name | [Described above](#template-name) | + | --force | This option will override the file if it already exists. | +::: + +### How to create form-request? + +:::note[Create a form-request for request validation.] + + ``` + php artisan create:form-request [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-request Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --class-name | [Described above](#class-name) | + | --resource-file | [Described above](#resource-file) | + | --with-auth | [Described above](#with-auth) | + | --routes-prefix | [Described above](#routes-prefix) | + | --form-request-directory | [Described above](#form-request-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a language file? + +:::note[Create a new language file.] + + ``` + php artisan create:language [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:language Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --language-filename | [Described above](#language-filename) | + | --resource-file | [Described above](#resource-file) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: diff --git a/docs/versioned_docs/version-2.2.0/configurations.md b/docs/versioned_docs/version-2.2.0/configurations.md new file mode 100644 index 0000000..7ce093f --- /dev/null +++ b/docs/versioned_docs/version-2.2.0/configurations.md @@ -0,0 +1,12 @@ +--- +sidebar_position: 5 +title: Configurations +--- + +## Configurations + +Laravel-Code-Generator ships with lots of configurable option to give you control of the generated code. It is strongly recommended that you read the comments block above each option in the config/codegenerator.php file to get familiar with all available options. + +Starting at version 2.2 it ships with a unique way to override/extend the default settings to prevent you from losing your setting when upgrading the package. The config/codegenerator_custom.php is a dedicated file to store your options. This file will always be controlled by you and will never be overridden by the package. To override any configuration found in config/codegenerator.php, simple add the same option in your custom file. The generator will look at the your configuration before falling back to the default config. Note, any array based option will be extended not overridden. For more info read the comment block in the config/codegenerator_custom.php + +The most important option in the configuration file is common_definitions. This option allows you to set the default properties of new field using the name of that field. Your goal should be to generate 100% ready resource-file using this config. It will save you lots of time since all your fields will get generated using the desired properties. In another words, when using `resource-file:create`, `resource-file:append` or `resource-file:from-database` to create resource file, the generated JSON will be 100% ready for you without any manual modification. diff --git a/docs/versioned_docs/version-2.2.0/get-started.md b/docs/versioned_docs/version-2.2.0/get-started.md new file mode 100644 index 0000000..3931537 --- /dev/null +++ b/docs/versioned_docs/version-2.2.0/get-started.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 2 +title: Getting Started +--- + +# Getting Started + +### Installation + +1. To download this package into your Laravel project, use the command-line to execute the following command + +``` +composer require crestapps/laravel-code-generator --dev +``` + +2. (You may skip this step when using Laravel >= 5.5)** To bootstrap the packages into your project while using command-line only, open the app/Providers/AppServiceProvider.php file in your project. Then, add the following code to the `register()` method. + +``` +if ($this->app->runningInConsole()) { + $this->app->register('CrestApps\CodeGenerator\CodeGeneratorServiceProvider'); +} +``` + +3. Execute the following command from the command-line to publish the package's config and the default template to start generating awesome code. + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default +``` + +A layout is required for the default views! The code generator allows you to create a layout using the command-line. Of course you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/) in your layout for the default templates to work properly. Additionally, you can chose to design your own templates using a different or no css framework. For more info on how to create a custom template [click here](https://crestapps.com/laravel-code-generator/docs/2.2#how-to-create-custom-template)! + +### Demo + +Below a video to demonstrate how to use most of the package commands. + + + diff --git a/docs/versioned_docs/version-2.2.0/intro.md b/docs/versioned_docs/version-2.2.0/intro.md new file mode 100644 index 0000000..8523b27 --- /dev/null +++ b/docs/versioned_docs/version-2.2.0/intro.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 1 +title: Introduction +--- + +## CrestApps - Laravel Code Generator + +### Introduction + +Enhance your Laravel development experience with our sophisticated code generator! This powerful tool is designed to streamline your workflow and save you valuable time. Whether you need to create views, controllers, routes, migrations, languages, or request forms, this versatile generator has got you covered – all in just seconds! + +Experience the ultimate flexibility and customization options to cater to a wide range of use cases. Our code generator comes with a cross-browser compatible template and includes client-side validation to bring a modern touch to your application. + +Explore the project's source code on [GitHub](https://github.com/CrestApps/laravel-code-generator), available under the permissive [MIT license](https://opensource.org/licenses/MIT). Upgrade your Laravel development with efficiency and style! + + +### Features + +- Craft clean, reusable, and highly readable code for seamless development. +- Generate complete resources effortlessly with a single command, supporting both migration and existing database scenarios. +- Streamline resource creation for all existing database tables with a single command. +- Save and recreate fields using a JSON file, ensuring adaptability to changing business needs. +- Leverage JSON-based resource files for easy regeneration, even when business rules evolve. +- Generate standard CRUD controllers with simple or form-request validation. +- Customize view templates to alter the standard look and feel of your application. +- Create models with relations for comprehensive data representation. +- Establish named routes with and without grouping for efficient navigation. +- Generate standard CRUD views to facilitate a consistent user experience. +- Smart migration engine tracks generated migrations to only create necessary ones. +- Intelligent handling of model relations to simplify development. +- Highly flexible with rich configurable options to suit diverse needs. +- Easy commands for resource-file creation, addition, or reduction. +- Full support for generating multi-language applications. +- Implement client-side validation for enhanced user interaction. +- Efficiently handle file uploading and store multiple responses in the database. +- Generate form-request to clean up controllers and boost code reusability. +- Create view layouts with and without client-side validation. +- Change templates at runtime for diverse view generation. +- Ability to generate views with or without Laravel-Collective integration. +- Seamless handling of date, time, or datetime fields. +- Automatic management of boolean fields for hassle-free development. + + +### Dependencies + +#### Prerequisite + + - **[Laravel >= 5.1 framework.](https://laravel.com/)** + - **[Composer](https://getcomposer.org/)** installed on your local workstation. + +#### Default template dependencies + + - **[CSS bootstrap Framework.](http://getbootstrap.com/)** This is only required with the default template. You are free to make your own template. + +#### (Optional) Client-side validation dependencies + + - **[jQuery.](https://jquery.com/)** Required only if you want to take advantage of the client + - **[jQuery Validation Plugin.](https://jqueryvalidation.org/)** Only if you want to take advantage of the client side validation. + +#### (Optional) Using Laravel-Collective + +Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](using-laravel-collective.md) diff --git a/docs/versioned_docs/version-2.2.0/laravel-collective.md b/docs/versioned_docs/version-2.2.0/laravel-collective.md new file mode 100644 index 0000000..a19e9aa --- /dev/null +++ b/docs/versioned_docs/version-2.2.0/laravel-collective.md @@ -0,0 +1,36 @@ +--- +sidebar_position: 10 +title: Laravel Collective +--- + +## Using Laravel-Collective to generate views + +:::info + To use Laravel-Collective to generate view, you'll have to install the [Laravel-Collective](https://github.com/LaravelCollective/html) package. + ::: + + Laravel-Code-Generator is capable of fully generating views using Laravel-Collective package. In fact, it is shipped with a template based on Laravel-collective called "default-collective". + +By default, the template "default-collective" is not published to the resources folder as it is not needed out of the box. To publish it, use the command-line to execute the following command. + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective +``` + +### How to generate views using the Laravel-Collective package? + +There are two ways to generate views using Laravel-Collective + +- Via the package configuration + + > Open the config file of the package /config/codegenerator.php change the value of the key template to default-collective + +- Or, via command-line + + > Change the template name at run time. In another words, pass the following option--template-name=default-collective from command-line + +### How to create a new template based on Laravel-Collective? + +First, duplicate the folder `/resources/codegenerator-templates/default-collective`` and name it anything your like. + +Second, open up the package config file and add the new template name to the `laravel_collective_templates` array. diff --git a/docs/versioned_docs/version-2.2.0/release-notes.md b/docs/versioned_docs/version-2.2.0/release-notes.md new file mode 100644 index 0000000..a193f4c --- /dev/null +++ b/docs/versioned_docs/version-2.2.0/release-notes.md @@ -0,0 +1,103 @@ +--- +sidebar_position: 6 +title: Release Notes +--- + +## Release Notes + +Version 2.2 introduces very exciting features, more flexibility and less work for you out of the box! It also, adds support for the new features that were introduced in Laravel 5.5. Follow is a list of all new features and changes that were introduced. + +### New Futures + +#### Smart Migrations Engine + +> Whaaaat?!! Yup that's right, version 2.2 introduce a very powerful feature which keeps track of all your migrations. After migrating, each time, you add/delete a field/index from your resource file, the code-generator will only generate a migration to add/drop and drop/add columns as needed! Keep in mind that you still have to tell the generator that you need to create a new migration using `create:migration` command or the `--with-migration` option for the `create:resources` command. +> +> Another migration related feature was to organizing your migration files! When uses migrations heavily, finding a specific migration may be overwhelming due to the number of file. This feature, allow you to group all your migrations into sub-folders. Please note that this feature is off by default, to turn it on, set organize\_migrations to true. +> +> You're probably thinking "Laravel only detects migrations in the main folder... boooo!" That is correct! However, if you are using Laravel 5.3+, version 2.2 of Laravel-code-generator include five new commands to help you interact with migration from all folders. Check out the "Command Changes" below for more info about the new commands. + +Previously Laravel-Code-Generator was limited to `belongsTo()` type relation. Now, when creating resources from existing database's table, the code-generator is able to create `hasOne()` and `hasMany()` relations by scanning the database's constrains and analyzing its existing data. +In the resource-file you can now define any [Eloquent relations](https://laravel.com/docs/5.5/eloquent-relationships). Each relation should follow the [foreign-relation](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#foreign-relations) schema below. Additionally, you can define [composite/multi-columns](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#composite-indexes) indexes! Each index should follow the [index schema](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#composite-indexes) listed below. +> +> When using Laravel 5.5, you can pass custom Validation Rule object directly in you resource file and the generator will add it to the validation rules! For more info [check out the validation option below](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#field-validation) +> +> Improved the file uploading process to allow you to delete uploaded file +> +> `--indexes` and `--relations` have been added to the following commands `resource-file:create`, `resource-file:append`, or `resource-file:reduce` to allow you to interact with the resource-file freely. +> +> The options `--fields`, `--indexes` and `--relations` for the `resource-file:create`, `resource-file:append`, or `resource-file:reduce` commands accept complex string to allow you to pass more values to add to the resource-file. For example, `--fields="name:colors;html-type:select;options:blue|yellow|green|red|white,name:second_field_name"` + +#### More configurations so you can type less and do more! + +> **plural\_names\_for** was added to the configuration file to allow you to set your own plural-form vs singular-form preference when naming controller, form-request, resource-file, language file, table-name and route group. If you like your controllers to be in a plural-form, you can simply change the default behavior from the configuration file! +> +> **controller\_name\_postfix** was added to the configuration file to allow you to change the controller's postfix. If you don't like to post fix your controllers with the word Controller, you can set this to an empty string or any other value. +> +> **form\_request\_name\_postfix** was added to the configuration file to allow you to change the form-request's postfix. If you don't like to post fix your form-request with the word FormRequest, you can set this to an empty string or any other value. +> +> **irregular\_plurals** was added to the configuration file. The code-generator heavily uses Laravel helpers `str_plural()` and `str_singular()` to generate readable code to make your code spectacular. The problem is the both generate incorrect words for irregular plurals. If you are using a language other than English, you can define a word with each with its plural-form to help the generator keep your code readable. +> +> **create\_move\_file\_method** was added to the configuration file. This option will allow the user to chose not to create moveFile method on every CRUD when file-upload is required. If you set this to false, it is your responsibility make sure that the moveFile method exists in a higher level of your code like `App\Http\Controllers\Controller`. +> +> New configuration file (i.e `config/code_generator_custom.php`) was added to allow you to override the default configuration. This way, you won't lose any of your custom configuration when upgrading which is important! For more info, read the config file. + +### Cleaner! + +> In addition to storing fields in the JSON file, indexes and relations can be stored in the same file too! For that reason, the option \--fields-file have been renamed to \--resource-file in all the commands. +> +> Version 2.2 completely dropped support for raw fields, indexes, and relations as announced in previous documents. Storing resources in JSON file is much better, easier to manage, easier to regenerate resources in the future, shorter/cleaner commands, and much more flexible! +> +> Thanks to the request validation improvement in Laravel 5.5, the controller code is much cleaner. +> +> When the `ConvertEmptyStringsToNull` middleware is registered, we no longer convert empty string to null manually since the middleware will do just that. +> +> The `--without-migration` option with `php artisan create:resources` command has been reversed. It is now `--with-migration` and should only be passed when you need a new migration created. +> +> For consistency, the \--lang-file-name option have been renamed to \--language-filename. +> +> The options `--names` in the `resource-file:create`, `resource-file:append`, and `resource-file:reduce` has been renamed to `--fields`. + +### Command Changes + +> _The following commands were renamed_ +> +> The command `create:fields-file` has been renamed to `resource-file:from-database` +> +> The command `fields-file:create` has been renamed to `resource-file:create` +> +> The command `fields-file:delete` has been renamed to `resource-file:delete` +> +> The command `fields-file:append` has been renamed to `resource-file:append` +> +> The command `fields-file:reduce` has been renamed to `resource-file:reduce` +> +> _The following commands were added_ +> +> `php artisan migrate-all` command was added. It allow you to run all of your outstanding migrations from all folders +> +> `php artisan migrate:rollback-all` command was added and it allows you to rolls back the last "batch" of migrations, which may include multiple migration from all folders. +> +> `php artisan migrate:reset-all` command was added to allow you to roll back all of your application's migrations from all folder. +> +> `php artisan migrate:refresh-all` command was added to allow you to invoke the `migrate:rollback-all` command then immediately invokes the `migrate:migrate-all` command. +> +> `php artisan migrate:status-all` command was added to allow you to checks the status of all your migration from all folders. + +### Bug Free! + +> All known bugs have been addressed! + +## Upgrade Guide + + - In your composer.json file, update the `crestapps/laravel-code-generator` dependency to `2.2.*`. + - Using the command-line, execute the following two commands to upgrade to the latest version of v2.2 + - `composer update` + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default --force` + - If you will be using **Laravel-Collective**, execute the following commands update the default-collective template. + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective --force` + - Move any custom template "if any" from `resources/codegenerator-templates` to `resources/laravel-code-generator/templates`. **IMPORTANT** do not copy the default and default-collective folders. + - Move all the file that are located in `resources/codegenerator-files` to `resources/laravel-code-generator/sources`. Now you should be able to delete the following two folders since they have been relocated `resources/codegenerator-templates` and `resources/codegenerator-files`. + - Finally, there are some changes to the layout stub which are required. To override your existing layout call the following code`php artisan create:layout "My New App"`. If you are using your own layout, you may want to create a temporary layout and extract the updated css/js code into your own layout/assets. The following command will create a new file called "app\_temp.blade.php" `php artisan create:layout "My New App" --layout-filename=app_temp` + +* * * \ No newline at end of file diff --git a/docs/versioned_docs/version-2.2.0/resource-file.md b/docs/versioned_docs/version-2.2.0/resource-file.md new file mode 100644 index 0000000..52d8448 --- /dev/null +++ b/docs/versioned_docs/version-2.2.0/resource-file.md @@ -0,0 +1,318 @@ +--- +sidebar_position: 4 +title: Resource File +--- + +## Resource Files + +A JSON based file that allows you to define how you like your resource generated. You can define your fields, indexes, and model relations. + +## Available Commands to Manage Resource Files + +The option in between the square brackets `[]` must be replaced with a variable of your choice. + - php artisan resource-file:create \[model-name\] + - php artisan resource-file:append \[model-name\] + - php artisan resource-file:reduce \[model-name\] + - php artisan resource-file:delete \[model-name\] + +### How to create resource-file? + +:::note[Create a new resource file.] + + ``` + php artisan resource-file:create [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:create Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | + | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | + | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | + | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| + | --translation-for | [Described above](#translation-for) | + | --force | This option will override any file that already exist. | +::: + +### How to add resources to existing resource-file? + +:::note[Appends a new fields, indexes, or relations to an existing resource-file. If the resource-file does not exists one will be created] + + ``` + php artisan resource-file:append Post --fields=notes,created_by + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-request Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | + | --translation-for | [Described above](#translation-for) | +::: + +### How to remove resources to existing resource-file? + + > If the resource-file becomes empty, it will automatically get deleted by calling the `resource-file:delete` command. + +:::note[Removes fields, indexes, or relations to an existing resource-file.] + + ``` + php artisan resource-file:reduce [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:reduce Post --fields=notes,created_by + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | +::: + +### How to delete existing resource-file? + +> It is recommended to use this command to delete file instead of manually deleting it. This command will also delete the mapped relation in the resource_map file. + +:::note[Delete existing resource-file. ] + + ``` + php artisan resource-file:delete [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:delete Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | +::: + +### How to create a resource's file from existing database? + +> Are you looking to convert existing application to Laravel framework? Or, looking to use database-first instead of code-first approach? No problem! This package allows you to create a resource's file from existing database. +> +> You can easily take advantage of this feature by passing `--table-exists` option to the `create:resources` command to automatically generate all the resources from existing database's table. + +:::note[Convert your existing database into resource file, then the create:resources command is used to generate the resources] + + ``` + php artisan resource-file:from-database [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:from-database Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --table-name | [Described above](#table-name) | + | --database-name | [Described above](#database-name) | + | --resource-file | [Described above](#resource-file) | + | --resource-filename| [Described above](#resource-filename) | + | --translation-for| [Described above](#translation-for) | + | --force | This option will override any file that already exist. | + +::: + + +### Fields + +> The minimum requirement for creating a field is a unique name. However, the code-generator is very flexible and allows you to have full control on the fields. Below all the available properties for defining a field + +#### HTML Properties + | Property name | Description | + | ----------- | ----------- | + | name | A unique name for the field. This is a required field. | + | label | A user-friendly title to describe the field. If this option is left out, the field's name is used to generate a title. | + | validation | You can pass any valid Laravel validation rule. The rules should be separated by bar `\|`.

    For example: `required\|string\|min:2\|max:255`

    Start with Laravel 5.5, you can define custom validation rules and pass them as well. For example, to use a custom validation rule called Uppercase in addition to the required rule, you can pass this string required|new Uppercase.

    To learn more about the valid options please visit [Laravel documentation](https://laravel.com/docs/master/validation#available-validation-rules).

    When the rule `required` is not used, the field in the migration file will automatically become nullable. | + | html-type | Default value: `text`. A valid property will be one of the following options
    `text`, `textarea`, `password`,`email`,`checkbox`,`radio`,`number`,`select`,`hidden`,`file`,`selectRange`,`selectMonth`, or `multipleSelect`.

    Note: when using file type, after the file is uploaded to the designated path, the filename is stored in the database by default. For everything to work properly, the data-type must be of some sort of a string type. Or modify the behavior of moveFile method to handle the new file.

    By default this process stores the uploaded file in the path defined in config file.

    Note: when using checkbox, or multipleSelect, the items are stored in the database as JSON string. Additionally, the items in the index or form views are displayed separated by the value provided in the delimiter property. | + | delimiter | Default value: "; ". When generating a form with checkbox or a select menu that accepts multiple answers, we need either store the results in a foreign model or store the records in a string field. By default, the code generator will convert the multiple options that a user selected into a JSON string before the results are stored using a Eloquent-mutator method.

    When the data is presented on the show and/or index views, the options are displayed separated by the value of the delimiter. Of course, you can always change this behavior to fit your needs by removing the accessor and mutator methods in the model and modifying the views accordingly. | + | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."`` property. Classes that are already set in the views will not be replaced. | + | date-format | Default value: "m/d/Y H:i A". Any field with the type date, time or datetime can be formatted different when it is displayed. You can change the display format using this option. | + | html-value | A default value to set the field to. When using multiple options based html-type like checkbox, multipleSelect you can set this property to array of values to set multiple values by default. Ex, `["Red","Green"]` | + | options | If you used select, checkbox, or radio for the html-type property, this is where you provide the options. Here are some example of the schema.

    A simple array: In this option, the value will be the numeric index value of the item in the array.
    ```"options": ["Prefer not to say","Male","Female"]```.
    Using explicit values
    ```"options": { "": Prefer not to say", "male": "Male","female": "Female"}```.
    Using multiple language phrases for each option
    ```"options": {"en":{"":"Prefer not to say","male":"Male","female":"Female"},"ar":{"":"Prefer not to say in Arabic","male":"Male in Arabic","female":"Female in Arabic"},"fr":{"":"Prefer not to say in French","male":"Male in French","female":"Female in French"}}``` | + | is-inline-options | Default value: false. If the html-type is set to radio or checkbox, setting this option to true will put the items next to each other instead of a vertical list. | + | placeholder or place-holder | You can set a placeholder value when html-type is set to text, number, email, textarea or select. | + | is-on-index | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index view. | + | is-on-form | Default value: `true`. Setting the value to `false` will prevent from adding this field to the form view. | + | is-on-show | Default value: `true`. Setting the value to `false` will prevent from adding this field to the show view. | + | is-on-views | Default value: `true`. Setting the value to `false`` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | + | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns`` in the configuration file, allow you to list the common field name to automatically set them as header. | + + #### Database Properties + | Property name | Description | + | ----------- | ----------- | + | data-type | Default is `varchar`. The database column type. The following are valid types:
    ```'char', 'date', 'datetime', 'datetimetz', 'biginteger', 'bigint', 'blob', 'binary', 'bool', 'boolean', 'decimal', 'double', 'enum', 'list', 'float', 'int', 'integer', 'ipaddress', 'json', 'jsonb', 'longtext', 'macaddress', 'mediuminteger', 'mediumint', 'mediumtext', 'morphs', 'string', 'varchar', 'nvarchar', 'text', 'time', 'timetz', 'tinyinteger', 'tinyint', 'timestamp', 'timestamptz', 'unsignedbiginteger', 'unsignedbigint', 'unsignedInteger', 'unsignedint', 'unsignedmediuminteger', 'unsignedmediumint', 'unsignedsmallinteger', 'unsignedsmallint', 'unsignedtinyinteger', 'uuid', 'uuid'```

    Note: you can add short cuts if needed to in the `laravel-code-generator.php` config file.You can add new mapping to the eloquent_type_to_method array. | + | data-type-params | This option allows you to specify parameters for the data type. Please ensure you provide valid parameters otherwise unexpected behavior will occur. For example, varchar and char will only need a maximum of one integer parameter where double, decimal and float require two integer parameters.

    Command line example with specifying a decimal precision and scale: `data-type-params=5,2`. JSON file example `"data-type-params": [5,2]`

    If this option left out while some sort of a string data-type was used along with a max validation rule, the max value is used to limit the length of the sting in the database when a migration is generated | + | data-value | Default value is null. The default value for the database column. | + | is-auto-increment | Default value is false. Setting this value to true will make this column a primary with auto increment identity. | + | is-primary | Default value is false. You can set this field as the primary for retrieving records from the database. You can only set one column as the primary. If you set multiple fields are primary, the first one will be selected and the rest will be ignored.

    Note: if you set the is-auto-increment field, this option will automatically get set. Ths only time this can be used is to create a primary field you don't wish for the database to auto assign it. | + | is-index | Default value is false. Setting this value to true will add index to this column. | + | is-unique | Default value is false. Setting this value to true will add a unique index to this column. | + | is-nullable | Default value is false. Setting this value to true will make this column nullable.

    Note: when setting this option to true, the default value will be set to NULL unless you pass a different value to data-value.

    When the validation rule contains "nullable", "required_if", "required_unless", "required_with", "required_with_all", "required_without", "required_without_all" or does NOT contains "required" rule, this flag will automatically gets set. | + | is-unsigned | Default value is false. Setting this value to true will make this column unsigned. This option should only be used with numeric types only. | + | comment | This option will allow you to add meta description of the field in the database. | + | is-data | This option will allow you to casts a data filed to a Carbon object. | + | cast-as | This option will allow you to cast a field to php's native type. | + | foreign-relation | This option will allow you to create a foreign relation between the models.

    ```json {"name":"creator","type":"belongsTo","params":["App\\User","created_by"],"field":"name"}``` | + | foreign-constraint | This option will allow you to create a foreign relation between the models.

    ```json {"field":"user_id","references":"id","on":"users","on-delete":"cascade","on-update":"cascade","references-model":"App\\Models\\User"} ``` | + | on-store | This option allows you to set a fixed value on the store action. For example, Illuminate\Support\Facades\Auth::Id(); will set the value to the current user id when the model is first created. Assuming you're using [Laravel Authentication](https://laravel.com/docs/master/authentication). | + | on-update | Similar to on-storeThis option allows you to set a fixed value on the update action. | + + +### Managing fields using JSON file + +Storing the field's specification in a JSON file enables you to easily reuse the field with multiple commands. It also allows you to recreate the resources in the future if you decided to add/remove fields after the views have been crafted. The JSON files are typically stored in /resources/laravel-generator. If you don’t like where these files are kept, you can change that path from the config/laravelgenerator.php file. + +The following command should be used to manage the resource-file to make this process easier. + + - php artisan resource-file:from-database [model-name] + - php artisan resource-file:create [model-name] + - php artisan resource-file:append [model-name] + - php artisan resource-file:reduce [model-name] + - php artisan resource-file:delete [model-name] + +### Resources mapping file + +The resources-map file, is a JSON file that is used to keep track of the fields-file and the model classes to allow you to create the resources all at once. + +The default file name is `resources_map.json` and can be changed from the configuration file. + +When using `resource-file:create`, `resource-file:from-database` or `resource-file:delete` commands, a file called resources_map.json is automatically updated. + +The following is the structure of the file. + +```json + { + { + "model-name": "Brand", + "resource-file": "brands.json" + }, + { + "model-name": "Customer", + "resource-file": "customers.json", + "table-name": "customers_table" + } +} +``` + + All option that are available to the `create:resources` can be used in the mapping file to make creating resources for all models customizable. Here is an example + + ```json + { + { + "model-name": "Customer", + "resource-file": "customers.json", + "table-name": "customers_table", + "routes-prefix" "customers_prefix" + } +} + ``` + +To generate all the resources mapped in the resources_map.json file, use the following command + +``` +php artisan create:mapped-resources [model-name] +``` + +### Generating clean and complete fields out of the box! + +When using the commands that generate fields, our goal is to generate fields configured and ready for use without having to make any change to the generated fields. + +While it is not possible to cover 100% of the use cases, Laravel-code-generator is shipped with a powerful configuration option to allow you to add conditions to handle your own use case. + +The key `common_definitions` in the `config/laravel-code-generator.php` file allows you match field name using pattern then set the properties accordingly. + +For example, you may want to add a global date, time, or datetime picker using javascript for any field where its name ends with `_at`. + +You can do that by adding the following entry + +```json +[ + 'match' => ['*_at'], + 'set' => [ + 'class' => 'datetime-picker', + ] +] +``` + +The same thing can be done for any field that ends with `_date` or starts with `date_of`` +```json +[ + 'match' => ['*_date','date_of_*'], + 'set' => [ + 'class' => 'date-picker', + ] +] +``` + +Of course, you can set any of the field's option like html-type, data-type, data-type-params or foreign relation. You can set the configuration as fits your environment, then you'll be able to create fields-file ready to generate resources with minimal work! + +The conditions are applied to each field top to bottom, the configuration at the bottom of the array will take presence over the once on the top in case multiple conditions were matched. + + +:::info +It is strongly recommended to read the comments above each option in the configuration file to help you understand and customize the generator to fit your needs! +::: + + +### Foreign Relations + +If you're using a code-first-approach and like to define relations between your models, you can easily define that in the relations keyword entry of the resource-file. Each relation can be defined using the following schema + +```json +{ + "name": "posts", // the name of the relation + "type": "hasMany", // the type of the relation + "params": [ // the parameters for the used relation. + "App\\Models\\Comment", + "post_id", + "id" + ], + "field": "name" // the name of the field on the foreign model to use as display value +} +``` +:::info +When creating `hasOne()` or `belongsTo()` relations, it be best to define them at the field level using the foreign-relation option. +Composite Indexes +::: + + +### Composite Indexes +If you're using a code-first-approach and like to define indexes with multiple columns, you can easily do that by adding these indexed to the Indexes keyword entry in the resource-file file. Each composite index can be defined using the following schema + +```json +{ + "name": "owner", // The name of the index to use, if no name is set a one will be generated. + "type": "unique", // Valid index type is one of the following 'index','unique' or 'primary'. If the type is not provided, 'index' is used. + "columns": [ // List of the columns' names to be included in the index left to right. + "first_name", + "last_name" + ] +} +``` diff --git a/docs/versioned_docs/version-2.2.0/upgrade-guide.md b/docs/versioned_docs/version-2.2.0/upgrade-guide.md new file mode 100644 index 0000000..c1ef8fb --- /dev/null +++ b/docs/versioned_docs/version-2.2.0/upgrade-guide.md @@ -0,0 +1,16 @@ +--- +sidebar_position: 5 +title: Upgrade Guide +--- + +## Upgrade Guide + + - In your composer.json file, update the `crestapps/laravel-code-generator` dependency to `2.2.*`. + - Using the command-line, execute the following two commands to upgrade to the latest version of v2.2 + - `composer update` + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default --force` + - If you will be using **Laravel-Collective**, execute the following commands update the default-collective template. + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective --force` + - Move any custom template "if any" from `resources/codegenerator-templates` to `resources/laravel-code-generator/templates`. **IMPORTANT** do not copy the default and default-collective folders. + - Move all the file that are located in `resources/codegenerator-files` to `resources/laravel-code-generator/sources`. Now you should be able to delete the following two folders since they have been relocated `resources/codegenerator-templates` and `resources/codegenerator-files`. + - Finally, there are some changes to the layout stub which are required. To override your existing layout call the following code`php artisan create:layout "My New App"`. If you are using your own layout, you may want to create a temporary layout and extract the updated css/js code into your own layout/assets. The following command will create a new file called "app\_temp.blade.php" `php artisan create:layout "My New App" --layout-filename=app_temp` diff --git a/docs/versioned_docs/version-2.3.0/available-commands.md b/docs/versioned_docs/version-2.3.0/available-commands.md new file mode 100644 index 0000000..8ea9488 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/available-commands.md @@ -0,0 +1,577 @@ +--- +sidebar_position: 3 +title: Available Commands +--- + +## Available Commands + +The option in between the square brackets `[]` must be replaced with a variable of your choice. + + - **Main commands** + - php artisan create:layout \[application-name\] + - php artisan create:resources \[model-name\] + - php artisan create:controller \[model-name\] + - php artisan create:model \[model-name\] + - php artisan create:form-request \[model-name\] + - php artisan create:routes \[model-name\] + - php artisan create:migration \[model-name\] + - php artisan create:language \[model-name\] + - php artisan create:mapped-resources + - **Views commands** + - php artisan create:views \[model-name\] + - php artisan create:index-view \[model-name\] + - php artisan create:create-view \[model-name\] + - php artisan create:edit-view \[model-name\] + - php artisan create:show-view \[model-name\] + - php artisan create:form-view \[model-name\] + - **Resource's files commands** + - php artisan resource-file:from-database \[model-name\] + - php artisan resource-file:create \[model-name\] + - php artisan resource-file:append \[model-name\] + - php artisan resource-file:reduce \[model-name\] + - php artisan resource-file:delete \[model-name\] + - **Migration commands** + - php artisan migrate-all + - php artisan migrate:rollback-all + - php artisan migrate:reset-all + - php artisan migrate:refresh-all + - php artisan migrate:status-all + +## Important Naming Convention + +Laravel-Code-Generator strive to generate highly readable, and error free code. In order to keep your code readable, it is important to follow a good naming convention when choosing names for your models, fields, tables, relations and so on. Here is a list of recommendation that we believe is important to keep your code clean and highly readable. + +1. Since each model represents a single object/row in a list/database, naming the model should be written in singular-form while using [Studly Case](https://laravel.com/docs/5.5/helpers#method-studly-case). For example, `Post` and `PostCategory`... +2. Since a database is a collection of model's object, table naming should always be plural and written in lowercase while using [Snake Case](https://en.wikipedia.org/wiki/Snake_case). For example, `users`, `post_categories`... +3. Primary keys should be named `id` in the table. +4. Since the foreign key represents a foreign/other table, the name should always end with `_id`. For example, `post_id`, `user_id`, `post_category_id`... +5. Field naming should always be in a singular-form and written in lowercase while using [Snake Case](https://en.wikipedia.org/wiki/Snake_case). For example, `title`, `first_name`, `description`... + + +## Examples + +The following example assumes that we are trying to create a CRUD called AssetCategory with the fields listed below. + + - id + - name + - description + - is_active + + +### Basic example + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +``` +php artisan create:resources AssetCategory``` +``` +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example using translations for English and Arabic + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active --translation-for=en,ar +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +``` +php artisan create:resources AssetCategory +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example with form-request + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +``` +php artisan create:resources AssetCategory --with-form-request +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example with soft-delete and migration + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json`` + +``` +php artisan create:resources AssetCategory --with-soft-delete --with-migration +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Creating resources from existing database. + +``` +php artisan create:resources AssetCategory --table-exists +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + +You may also create a resource-file from existing database separately using `php artisan resource-file:form-database AssetCategory` + + +### Creating resources from existing database with translation for English and Arabic + +``` +php artisan create:resources AssetCategory --table-exists --translation-for=en,ar +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json`` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + +You may also create a [resource-file](./resource-file.md) from existing database separately using + +``` +php artisan resource-file:form-database AssetCategory --translation-for=en,ar +``` + +### Creating resources from existing database with translation for English and Arabic in two step for better control over the fields! + +``` +php artisan resource-file:form-database AssetCategory --translation-for=en,ar +php artisan create:resources AssetCategory +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/codegenerator-files/asset_categories.json` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + + + +## How To + +::: Info +All examples below assumes that you already created a [resource-file](./resource-file.md) (i.e resources/codegenerator-fields/posts.json. This file can be created using the following command `php artisan resource-file:create Post --fields=id,title,details,is_active`) +::: + +### How to create "views-layout"? + +:::note[To create a new layout for your application.] + + ``` + php artisan create:layout [application-name] + ``` + + The argument `[application-name]` should be replaced with the name of the application you are creating. For example: + + ``` + php artisan create:layout "My New Laravel App" + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --layout-filename | The name of the layout file to be used. | `app` (i.e, creates `app.blade.php`) | + | --layout-directory | The directory to create the layout under. | `layouts` | + | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | + | --force | This option will override the layout if one already exists. | | + +::: + + +### How to create resources (complete CRUD)? + +:::note[Create multiple resources at the same time. It can be invoked every time the resource-file is modified to recreate the resources all over again.] + + ``` + php artisan create:resources [model-name] + ``` + + The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:resources Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | + | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | + | --controller-extends | Specify which class should the controller extends. Note: the default value can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `Http\Controllers\Controller` | + | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | + | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | + | --models-per-page | How many models to show per page on the index view. | `25` | + | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | + | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | + | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | + | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | + | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | + | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | + | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | + | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | + | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | + | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | + | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | + | --engine-name | A specific engine name for the database's table can be provided here. | | + | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | + | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | + | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | + | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --template-name | [Described above](#template-name) | | + | --force | This option will override the layout if one already exists. | | + +::: + + +### How to create multiple resources at once? + +:::note[Create multiple resources at the same time] + + ``` + php artisan create:mapped-resources + ``` + +When using `resource-file:create`, `resource-file:from-database` or `resource-file:delete` the `resources_map.json` file is updated behind the scenes. This options create multiple resources for all the resources found in the `resources/laravel-code-generator/sources/resources_map.json` at the same time. The resources can be invoked every time any of the resource-file is modified to recreate the resources all over again. + + | Option | Description | + | ----------- | ----------- | + | --controller-extends | [Described above](#controller-extends) | + | --with-auth | [Described above](#with-auth) | + | --models-per-page | [Described above](#models-per-page) | + | --with-form-request | [Described above](#with-form-request) | + | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | + | --form-request-directory | [Described above](#form-request-directory) | + | --table-exists | [Described above](#table-exists) | + | --translation-for | [Described above](#translation-for) | + | --primary-key | [Described above](#primary-key) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --with-migration | [Described above](#with-migration) | + | --connection-name | [Described above](#connection-name) | + | --engine-name | [Described above](#engine-name) | + | --controller-directory | [Described above](#controller-directory) | + | --model-directory | [Described above](#model-directory) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --mapping-filename | This option allows you to pass the name of the mapping-directory file. When this option is left out, the default `resources_map.json`` file will be used. | + | --force | This option will override the layout if one already exists. | +::: + + +### How to create a controller? + +:::note[Create a controller for your resource.] + + ``` + php artisan create:controller [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:controller Posts + ``` + + | Option | Description | + | ----------- | ----------- | + | --controller-name | [Described above](#controller-name) | + | --controller-directory | [Described above](#controller-directory) | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --models-per-page | [Described above](#models-per-page) | + | --language-filename | [Described above](#language-filename) | + | --with-auth | [Described above](#with-auth) | + | --with-form-request | [Described above](#with-form-request) | + | --without-form-request | [Described above](#without-form-request) | + | --form-request-directory | [Described above](#form-request-directory) | + | --model-directory | [Described above](#model-directory) | + | --views-directory | [Described above](#views-directory) | + | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | + | --without-model | Allow you to create all the resources excluding the model. | + | --without-views | Allow you to create all the resources excluding the views. | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + + + +### How to create a model? + +:::note[Create a model.] + + ``` + php artisan create:model [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:model Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --table-name | [Described above](#table-name) | + | --primary-key | [Described above](#primary-key) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --model-directory | [Described above](#model-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create routes? + +:::note[Create routes for your CRUD operations.] + + ``` + php artisan create:routes [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:routes Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --controller-name | [Described above](#controller-name) | + | --routes-prefix | [Described above](#routes-prefix) | + | --table-name | [Described above](#table-name) | + | --template-name | [Described above](#template-name) | +::: + +### How to create all standard CRUD views (i.e. Create, Read, Update and Delete)? + +> When creating views using the `create:views`, `create:create-view` or `create:update-view` an additional view called "form-view" is created. The "form-view" contains the form fields to prevent code duplication. + +:::note[Create routes for views for CRUD operations.] + + ``` + php artisan create:views [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:views Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | + | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the Create Operation? + +:::note[Create a create-view.] + + ``` + php artisan create:create-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:create-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + + +### How to create a view for the Edit Operation? + +:::note[Create an edit-view.] + + ``` + php artisan create:edit-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:edit-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the List Operation? + +:::note[Create an index-view.] + + ``` + php artisan create:index-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:index-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the Display Operation? + +:::note[Create an show-view.] + + ``` + php artisan create:show-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:show-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a form-view? + +:::note[Create an form-view.] + + ``` + php artisan create:form-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a database migration? + +:::note[Create a database migration.] + + ``` + php artisan create:migration [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:migration Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --table-name | [Described above](#table-name) | + | --resource-file | [Described above](#resource-file) | + | --migration-class-name | [Described above](#migration-class-name) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --connection-name | [Described above](#connection-name) | + | --engine-name | [Described above](#engine-name) | + | --template-name | [Described above](#template-name) | + | --force | This option will override the file if it already exists. | +::: + +### How to create form-request? + +:::note[Create a form-request for request validation.] + + ``` + php artisan create:form-request [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-request Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --class-name | [Described above](#class-name) | + | --resource-file | [Described above](#resource-file) | + | --with-auth | [Described above](#with-auth) | + | --routes-prefix | [Described above](#routes-prefix) | + | --form-request-directory | [Described above](#form-request-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a language file? + +:::note[Create a new language file.] + + ``` + php artisan create:language [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:language Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --language-filename | [Described above](#language-filename) | + | --resource-file | [Described above](#resource-file) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: diff --git a/docs/versioned_docs/version-2.3.0/configurations.md b/docs/versioned_docs/version-2.3.0/configurations.md new file mode 100644 index 0000000..7ce093f --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/configurations.md @@ -0,0 +1,12 @@ +--- +sidebar_position: 5 +title: Configurations +--- + +## Configurations + +Laravel-Code-Generator ships with lots of configurable option to give you control of the generated code. It is strongly recommended that you read the comments block above each option in the config/codegenerator.php file to get familiar with all available options. + +Starting at version 2.2 it ships with a unique way to override/extend the default settings to prevent you from losing your setting when upgrading the package. The config/codegenerator_custom.php is a dedicated file to store your options. This file will always be controlled by you and will never be overridden by the package. To override any configuration found in config/codegenerator.php, simple add the same option in your custom file. The generator will look at the your configuration before falling back to the default config. Note, any array based option will be extended not overridden. For more info read the comment block in the config/codegenerator_custom.php + +The most important option in the configuration file is common_definitions. This option allows you to set the default properties of new field using the name of that field. Your goal should be to generate 100% ready resource-file using this config. It will save you lots of time since all your fields will get generated using the desired properties. In another words, when using `resource-file:create`, `resource-file:append` or `resource-file:from-database` to create resource file, the generated JSON will be 100% ready for you without any manual modification. diff --git a/docs/versioned_docs/version-2.3.0/get-started.md b/docs/versioned_docs/version-2.3.0/get-started.md new file mode 100644 index 0000000..3931537 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/get-started.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 2 +title: Getting Started +--- + +# Getting Started + +### Installation + +1. To download this package into your Laravel project, use the command-line to execute the following command + +``` +composer require crestapps/laravel-code-generator --dev +``` + +2. (You may skip this step when using Laravel >= 5.5)** To bootstrap the packages into your project while using command-line only, open the app/Providers/AppServiceProvider.php file in your project. Then, add the following code to the `register()` method. + +``` +if ($this->app->runningInConsole()) { + $this->app->register('CrestApps\CodeGenerator\CodeGeneratorServiceProvider'); +} +``` + +3. Execute the following command from the command-line to publish the package's config and the default template to start generating awesome code. + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default +``` + +A layout is required for the default views! The code generator allows you to create a layout using the command-line. Of course you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/) in your layout for the default templates to work properly. Additionally, you can chose to design your own templates using a different or no css framework. For more info on how to create a custom template [click here](https://crestapps.com/laravel-code-generator/docs/2.2#how-to-create-custom-template)! + +### Demo + +Below a video to demonstrate how to use most of the package commands. + + + diff --git a/docs/versioned_docs/version-2.3.0/intro.md b/docs/versioned_docs/version-2.3.0/intro.md new file mode 100644 index 0000000..8523b27 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/intro.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 1 +title: Introduction +--- + +## CrestApps - Laravel Code Generator + +### Introduction + +Enhance your Laravel development experience with our sophisticated code generator! This powerful tool is designed to streamline your workflow and save you valuable time. Whether you need to create views, controllers, routes, migrations, languages, or request forms, this versatile generator has got you covered – all in just seconds! + +Experience the ultimate flexibility and customization options to cater to a wide range of use cases. Our code generator comes with a cross-browser compatible template and includes client-side validation to bring a modern touch to your application. + +Explore the project's source code on [GitHub](https://github.com/CrestApps/laravel-code-generator), available under the permissive [MIT license](https://opensource.org/licenses/MIT). Upgrade your Laravel development with efficiency and style! + + +### Features + +- Craft clean, reusable, and highly readable code for seamless development. +- Generate complete resources effortlessly with a single command, supporting both migration and existing database scenarios. +- Streamline resource creation for all existing database tables with a single command. +- Save and recreate fields using a JSON file, ensuring adaptability to changing business needs. +- Leverage JSON-based resource files for easy regeneration, even when business rules evolve. +- Generate standard CRUD controllers with simple or form-request validation. +- Customize view templates to alter the standard look and feel of your application. +- Create models with relations for comprehensive data representation. +- Establish named routes with and without grouping for efficient navigation. +- Generate standard CRUD views to facilitate a consistent user experience. +- Smart migration engine tracks generated migrations to only create necessary ones. +- Intelligent handling of model relations to simplify development. +- Highly flexible with rich configurable options to suit diverse needs. +- Easy commands for resource-file creation, addition, or reduction. +- Full support for generating multi-language applications. +- Implement client-side validation for enhanced user interaction. +- Efficiently handle file uploading and store multiple responses in the database. +- Generate form-request to clean up controllers and boost code reusability. +- Create view layouts with and without client-side validation. +- Change templates at runtime for diverse view generation. +- Ability to generate views with or without Laravel-Collective integration. +- Seamless handling of date, time, or datetime fields. +- Automatic management of boolean fields for hassle-free development. + + +### Dependencies + +#### Prerequisite + + - **[Laravel >= 5.1 framework.](https://laravel.com/)** + - **[Composer](https://getcomposer.org/)** installed on your local workstation. + +#### Default template dependencies + + - **[CSS bootstrap Framework.](http://getbootstrap.com/)** This is only required with the default template. You are free to make your own template. + +#### (Optional) Client-side validation dependencies + + - **[jQuery.](https://jquery.com/)** Required only if you want to take advantage of the client + - **[jQuery Validation Plugin.](https://jqueryvalidation.org/)** Only if you want to take advantage of the client side validation. + +#### (Optional) Using Laravel-Collective + +Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](using-laravel-collective.md) diff --git a/docs/versioned_docs/version-2.3.0/laravel-collective.md b/docs/versioned_docs/version-2.3.0/laravel-collective.md new file mode 100644 index 0000000..a19e9aa --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/laravel-collective.md @@ -0,0 +1,36 @@ +--- +sidebar_position: 10 +title: Laravel Collective +--- + +## Using Laravel-Collective to generate views + +:::info + To use Laravel-Collective to generate view, you'll have to install the [Laravel-Collective](https://github.com/LaravelCollective/html) package. + ::: + + Laravel-Code-Generator is capable of fully generating views using Laravel-Collective package. In fact, it is shipped with a template based on Laravel-collective called "default-collective". + +By default, the template "default-collective" is not published to the resources folder as it is not needed out of the box. To publish it, use the command-line to execute the following command. + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective +``` + +### How to generate views using the Laravel-Collective package? + +There are two ways to generate views using Laravel-Collective + +- Via the package configuration + + > Open the config file of the package /config/codegenerator.php change the value of the key template to default-collective + +- Or, via command-line + + > Change the template name at run time. In another words, pass the following option--template-name=default-collective from command-line + +### How to create a new template based on Laravel-Collective? + +First, duplicate the folder `/resources/codegenerator-templates/default-collective`` and name it anything your like. + +Second, open up the package config file and add the new template name to the `laravel_collective_templates` array. diff --git a/docs/versioned_docs/version-2.3.0/release-notes.md b/docs/versioned_docs/version-2.3.0/release-notes.md new file mode 100644 index 0000000..a193f4c --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/release-notes.md @@ -0,0 +1,103 @@ +--- +sidebar_position: 6 +title: Release Notes +--- + +## Release Notes + +Version 2.2 introduces very exciting features, more flexibility and less work for you out of the box! It also, adds support for the new features that were introduced in Laravel 5.5. Follow is a list of all new features and changes that were introduced. + +### New Futures + +#### Smart Migrations Engine + +> Whaaaat?!! Yup that's right, version 2.2 introduce a very powerful feature which keeps track of all your migrations. After migrating, each time, you add/delete a field/index from your resource file, the code-generator will only generate a migration to add/drop and drop/add columns as needed! Keep in mind that you still have to tell the generator that you need to create a new migration using `create:migration` command or the `--with-migration` option for the `create:resources` command. +> +> Another migration related feature was to organizing your migration files! When uses migrations heavily, finding a specific migration may be overwhelming due to the number of file. This feature, allow you to group all your migrations into sub-folders. Please note that this feature is off by default, to turn it on, set organize\_migrations to true. +> +> You're probably thinking "Laravel only detects migrations in the main folder... boooo!" That is correct! However, if you are using Laravel 5.3+, version 2.2 of Laravel-code-generator include five new commands to help you interact with migration from all folders. Check out the "Command Changes" below for more info about the new commands. + +Previously Laravel-Code-Generator was limited to `belongsTo()` type relation. Now, when creating resources from existing database's table, the code-generator is able to create `hasOne()` and `hasMany()` relations by scanning the database's constrains and analyzing its existing data. +In the resource-file you can now define any [Eloquent relations](https://laravel.com/docs/5.5/eloquent-relationships). Each relation should follow the [foreign-relation](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#foreign-relations) schema below. Additionally, you can define [composite/multi-columns](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#composite-indexes) indexes! Each index should follow the [index schema](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#composite-indexes) listed below. +> +> When using Laravel 5.5, you can pass custom Validation Rule object directly in you resource file and the generator will add it to the validation rules! For more info [check out the validation option below](https://crestapps.com/%7B!!%20URL::route($routeName,%20['version'%20=%3E%20$version])%20!!%7D#field-validation) +> +> Improved the file uploading process to allow you to delete uploaded file +> +> `--indexes` and `--relations` have been added to the following commands `resource-file:create`, `resource-file:append`, or `resource-file:reduce` to allow you to interact with the resource-file freely. +> +> The options `--fields`, `--indexes` and `--relations` for the `resource-file:create`, `resource-file:append`, or `resource-file:reduce` commands accept complex string to allow you to pass more values to add to the resource-file. For example, `--fields="name:colors;html-type:select;options:blue|yellow|green|red|white,name:second_field_name"` + +#### More configurations so you can type less and do more! + +> **plural\_names\_for** was added to the configuration file to allow you to set your own plural-form vs singular-form preference when naming controller, form-request, resource-file, language file, table-name and route group. If you like your controllers to be in a plural-form, you can simply change the default behavior from the configuration file! +> +> **controller\_name\_postfix** was added to the configuration file to allow you to change the controller's postfix. If you don't like to post fix your controllers with the word Controller, you can set this to an empty string or any other value. +> +> **form\_request\_name\_postfix** was added to the configuration file to allow you to change the form-request's postfix. If you don't like to post fix your form-request with the word FormRequest, you can set this to an empty string or any other value. +> +> **irregular\_plurals** was added to the configuration file. The code-generator heavily uses Laravel helpers `str_plural()` and `str_singular()` to generate readable code to make your code spectacular. The problem is the both generate incorrect words for irregular plurals. If you are using a language other than English, you can define a word with each with its plural-form to help the generator keep your code readable. +> +> **create\_move\_file\_method** was added to the configuration file. This option will allow the user to chose not to create moveFile method on every CRUD when file-upload is required. If you set this to false, it is your responsibility make sure that the moveFile method exists in a higher level of your code like `App\Http\Controllers\Controller`. +> +> New configuration file (i.e `config/code_generator_custom.php`) was added to allow you to override the default configuration. This way, you won't lose any of your custom configuration when upgrading which is important! For more info, read the config file. + +### Cleaner! + +> In addition to storing fields in the JSON file, indexes and relations can be stored in the same file too! For that reason, the option \--fields-file have been renamed to \--resource-file in all the commands. +> +> Version 2.2 completely dropped support for raw fields, indexes, and relations as announced in previous documents. Storing resources in JSON file is much better, easier to manage, easier to regenerate resources in the future, shorter/cleaner commands, and much more flexible! +> +> Thanks to the request validation improvement in Laravel 5.5, the controller code is much cleaner. +> +> When the `ConvertEmptyStringsToNull` middleware is registered, we no longer convert empty string to null manually since the middleware will do just that. +> +> The `--without-migration` option with `php artisan create:resources` command has been reversed. It is now `--with-migration` and should only be passed when you need a new migration created. +> +> For consistency, the \--lang-file-name option have been renamed to \--language-filename. +> +> The options `--names` in the `resource-file:create`, `resource-file:append`, and `resource-file:reduce` has been renamed to `--fields`. + +### Command Changes + +> _The following commands were renamed_ +> +> The command `create:fields-file` has been renamed to `resource-file:from-database` +> +> The command `fields-file:create` has been renamed to `resource-file:create` +> +> The command `fields-file:delete` has been renamed to `resource-file:delete` +> +> The command `fields-file:append` has been renamed to `resource-file:append` +> +> The command `fields-file:reduce` has been renamed to `resource-file:reduce` +> +> _The following commands were added_ +> +> `php artisan migrate-all` command was added. It allow you to run all of your outstanding migrations from all folders +> +> `php artisan migrate:rollback-all` command was added and it allows you to rolls back the last "batch" of migrations, which may include multiple migration from all folders. +> +> `php artisan migrate:reset-all` command was added to allow you to roll back all of your application's migrations from all folder. +> +> `php artisan migrate:refresh-all` command was added to allow you to invoke the `migrate:rollback-all` command then immediately invokes the `migrate:migrate-all` command. +> +> `php artisan migrate:status-all` command was added to allow you to checks the status of all your migration from all folders. + +### Bug Free! + +> All known bugs have been addressed! + +## Upgrade Guide + + - In your composer.json file, update the `crestapps/laravel-code-generator` dependency to `2.2.*`. + - Using the command-line, execute the following two commands to upgrade to the latest version of v2.2 + - `composer update` + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default --force` + - If you will be using **Laravel-Collective**, execute the following commands update the default-collective template. + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective --force` + - Move any custom template "if any" from `resources/codegenerator-templates` to `resources/laravel-code-generator/templates`. **IMPORTANT** do not copy the default and default-collective folders. + - Move all the file that are located in `resources/codegenerator-files` to `resources/laravel-code-generator/sources`. Now you should be able to delete the following two folders since they have been relocated `resources/codegenerator-templates` and `resources/codegenerator-files`. + - Finally, there are some changes to the layout stub which are required. To override your existing layout call the following code`php artisan create:layout "My New App"`. If you are using your own layout, you may want to create a temporary layout and extract the updated css/js code into your own layout/assets. The following command will create a new file called "app\_temp.blade.php" `php artisan create:layout "My New App" --layout-filename=app_temp` + +* * * \ No newline at end of file diff --git a/docs/versioned_docs/version-2.3.0/resource-file.md b/docs/versioned_docs/version-2.3.0/resource-file.md new file mode 100644 index 0000000..52d8448 --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/resource-file.md @@ -0,0 +1,318 @@ +--- +sidebar_position: 4 +title: Resource File +--- + +## Resource Files + +A JSON based file that allows you to define how you like your resource generated. You can define your fields, indexes, and model relations. + +## Available Commands to Manage Resource Files + +The option in between the square brackets `[]` must be replaced with a variable of your choice. + - php artisan resource-file:create \[model-name\] + - php artisan resource-file:append \[model-name\] + - php artisan resource-file:reduce \[model-name\] + - php artisan resource-file:delete \[model-name\] + +### How to create resource-file? + +:::note[Create a new resource file.] + + ``` + php artisan resource-file:create [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:create Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | + | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | + | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | + | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| + | --translation-for | [Described above](#translation-for) | + | --force | This option will override any file that already exist. | +::: + +### How to add resources to existing resource-file? + +:::note[Appends a new fields, indexes, or relations to an existing resource-file. If the resource-file does not exists one will be created] + + ``` + php artisan resource-file:append Post --fields=notes,created_by + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-request Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | + | --translation-for | [Described above](#translation-for) | +::: + +### How to remove resources to existing resource-file? + + > If the resource-file becomes empty, it will automatically get deleted by calling the `resource-file:delete` command. + +:::note[Removes fields, indexes, or relations to an existing resource-file.] + + ``` + php artisan resource-file:reduce [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:reduce Post --fields=notes,created_by + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | +::: + +### How to delete existing resource-file? + +> It is recommended to use this command to delete file instead of manually deleting it. This command will also delete the mapped relation in the resource_map file. + +:::note[Delete existing resource-file. ] + + ``` + php artisan resource-file:delete [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:delete Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | +::: + +### How to create a resource's file from existing database? + +> Are you looking to convert existing application to Laravel framework? Or, looking to use database-first instead of code-first approach? No problem! This package allows you to create a resource's file from existing database. +> +> You can easily take advantage of this feature by passing `--table-exists` option to the `create:resources` command to automatically generate all the resources from existing database's table. + +:::note[Convert your existing database into resource file, then the create:resources command is used to generate the resources] + + ``` + php artisan resource-file:from-database [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:from-database Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --table-name | [Described above](#table-name) | + | --database-name | [Described above](#database-name) | + | --resource-file | [Described above](#resource-file) | + | --resource-filename| [Described above](#resource-filename) | + | --translation-for| [Described above](#translation-for) | + | --force | This option will override any file that already exist. | + +::: + + +### Fields + +> The minimum requirement for creating a field is a unique name. However, the code-generator is very flexible and allows you to have full control on the fields. Below all the available properties for defining a field + +#### HTML Properties + | Property name | Description | + | ----------- | ----------- | + | name | A unique name for the field. This is a required field. | + | label | A user-friendly title to describe the field. If this option is left out, the field's name is used to generate a title. | + | validation | You can pass any valid Laravel validation rule. The rules should be separated by bar `\|`.

    For example: `required\|string\|min:2\|max:255`

    Start with Laravel 5.5, you can define custom validation rules and pass them as well. For example, to use a custom validation rule called Uppercase in addition to the required rule, you can pass this string required|new Uppercase.

    To learn more about the valid options please visit [Laravel documentation](https://laravel.com/docs/master/validation#available-validation-rules).

    When the rule `required` is not used, the field in the migration file will automatically become nullable. | + | html-type | Default value: `text`. A valid property will be one of the following options
    `text`, `textarea`, `password`,`email`,`checkbox`,`radio`,`number`,`select`,`hidden`,`file`,`selectRange`,`selectMonth`, or `multipleSelect`.

    Note: when using file type, after the file is uploaded to the designated path, the filename is stored in the database by default. For everything to work properly, the data-type must be of some sort of a string type. Or modify the behavior of moveFile method to handle the new file.

    By default this process stores the uploaded file in the path defined in config file.

    Note: when using checkbox, or multipleSelect, the items are stored in the database as JSON string. Additionally, the items in the index or form views are displayed separated by the value provided in the delimiter property. | + | delimiter | Default value: "; ". When generating a form with checkbox or a select menu that accepts multiple answers, we need either store the results in a foreign model or store the records in a string field. By default, the code generator will convert the multiple options that a user selected into a JSON string before the results are stored using a Eloquent-mutator method.

    When the data is presented on the show and/or index views, the options are displayed separated by the value of the delimiter. Of course, you can always change this behavior to fit your needs by removing the accessor and mutator methods in the model and modifying the views accordingly. | + | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."`` property. Classes that are already set in the views will not be replaced. | + | date-format | Default value: "m/d/Y H:i A". Any field with the type date, time or datetime can be formatted different when it is displayed. You can change the display format using this option. | + | html-value | A default value to set the field to. When using multiple options based html-type like checkbox, multipleSelect you can set this property to array of values to set multiple values by default. Ex, `["Red","Green"]` | + | options | If you used select, checkbox, or radio for the html-type property, this is where you provide the options. Here are some example of the schema.

    A simple array: In this option, the value will be the numeric index value of the item in the array.
    ```"options": ["Prefer not to say","Male","Female"]```.
    Using explicit values
    ```"options": { "": Prefer not to say", "male": "Male","female": "Female"}```.
    Using multiple language phrases for each option
    ```"options": {"en":{"":"Prefer not to say","male":"Male","female":"Female"},"ar":{"":"Prefer not to say in Arabic","male":"Male in Arabic","female":"Female in Arabic"},"fr":{"":"Prefer not to say in French","male":"Male in French","female":"Female in French"}}``` | + | is-inline-options | Default value: false. If the html-type is set to radio or checkbox, setting this option to true will put the items next to each other instead of a vertical list. | + | placeholder or place-holder | You can set a placeholder value when html-type is set to text, number, email, textarea or select. | + | is-on-index | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index view. | + | is-on-form | Default value: `true`. Setting the value to `false` will prevent from adding this field to the form view. | + | is-on-show | Default value: `true`. Setting the value to `false` will prevent from adding this field to the show view. | + | is-on-views | Default value: `true`. Setting the value to `false`` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | + | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns`` in the configuration file, allow you to list the common field name to automatically set them as header. | + + #### Database Properties + | Property name | Description | + | ----------- | ----------- | + | data-type | Default is `varchar`. The database column type. The following are valid types:
    ```'char', 'date', 'datetime', 'datetimetz', 'biginteger', 'bigint', 'blob', 'binary', 'bool', 'boolean', 'decimal', 'double', 'enum', 'list', 'float', 'int', 'integer', 'ipaddress', 'json', 'jsonb', 'longtext', 'macaddress', 'mediuminteger', 'mediumint', 'mediumtext', 'morphs', 'string', 'varchar', 'nvarchar', 'text', 'time', 'timetz', 'tinyinteger', 'tinyint', 'timestamp', 'timestamptz', 'unsignedbiginteger', 'unsignedbigint', 'unsignedInteger', 'unsignedint', 'unsignedmediuminteger', 'unsignedmediumint', 'unsignedsmallinteger', 'unsignedsmallint', 'unsignedtinyinteger', 'uuid', 'uuid'```

    Note: you can add short cuts if needed to in the `laravel-code-generator.php` config file.You can add new mapping to the eloquent_type_to_method array. | + | data-type-params | This option allows you to specify parameters for the data type. Please ensure you provide valid parameters otherwise unexpected behavior will occur. For example, varchar and char will only need a maximum of one integer parameter where double, decimal and float require two integer parameters.

    Command line example with specifying a decimal precision and scale: `data-type-params=5,2`. JSON file example `"data-type-params": [5,2]`

    If this option left out while some sort of a string data-type was used along with a max validation rule, the max value is used to limit the length of the sting in the database when a migration is generated | + | data-value | Default value is null. The default value for the database column. | + | is-auto-increment | Default value is false. Setting this value to true will make this column a primary with auto increment identity. | + | is-primary | Default value is false. You can set this field as the primary for retrieving records from the database. You can only set one column as the primary. If you set multiple fields are primary, the first one will be selected and the rest will be ignored.

    Note: if you set the is-auto-increment field, this option will automatically get set. Ths only time this can be used is to create a primary field you don't wish for the database to auto assign it. | + | is-index | Default value is false. Setting this value to true will add index to this column. | + | is-unique | Default value is false. Setting this value to true will add a unique index to this column. | + | is-nullable | Default value is false. Setting this value to true will make this column nullable.

    Note: when setting this option to true, the default value will be set to NULL unless you pass a different value to data-value.

    When the validation rule contains "nullable", "required_if", "required_unless", "required_with", "required_with_all", "required_without", "required_without_all" or does NOT contains "required" rule, this flag will automatically gets set. | + | is-unsigned | Default value is false. Setting this value to true will make this column unsigned. This option should only be used with numeric types only. | + | comment | This option will allow you to add meta description of the field in the database. | + | is-data | This option will allow you to casts a data filed to a Carbon object. | + | cast-as | This option will allow you to cast a field to php's native type. | + | foreign-relation | This option will allow you to create a foreign relation between the models.

    ```json {"name":"creator","type":"belongsTo","params":["App\\User","created_by"],"field":"name"}``` | + | foreign-constraint | This option will allow you to create a foreign relation between the models.

    ```json {"field":"user_id","references":"id","on":"users","on-delete":"cascade","on-update":"cascade","references-model":"App\\Models\\User"} ``` | + | on-store | This option allows you to set a fixed value on the store action. For example, Illuminate\Support\Facades\Auth::Id(); will set the value to the current user id when the model is first created. Assuming you're using [Laravel Authentication](https://laravel.com/docs/master/authentication). | + | on-update | Similar to on-storeThis option allows you to set a fixed value on the update action. | + + +### Managing fields using JSON file + +Storing the field's specification in a JSON file enables you to easily reuse the field with multiple commands. It also allows you to recreate the resources in the future if you decided to add/remove fields after the views have been crafted. The JSON files are typically stored in /resources/laravel-generator. If you don’t like where these files are kept, you can change that path from the config/laravelgenerator.php file. + +The following command should be used to manage the resource-file to make this process easier. + + - php artisan resource-file:from-database [model-name] + - php artisan resource-file:create [model-name] + - php artisan resource-file:append [model-name] + - php artisan resource-file:reduce [model-name] + - php artisan resource-file:delete [model-name] + +### Resources mapping file + +The resources-map file, is a JSON file that is used to keep track of the fields-file and the model classes to allow you to create the resources all at once. + +The default file name is `resources_map.json` and can be changed from the configuration file. + +When using `resource-file:create`, `resource-file:from-database` or `resource-file:delete` commands, a file called resources_map.json is automatically updated. + +The following is the structure of the file. + +```json + { + { + "model-name": "Brand", + "resource-file": "brands.json" + }, + { + "model-name": "Customer", + "resource-file": "customers.json", + "table-name": "customers_table" + } +} +``` + + All option that are available to the `create:resources` can be used in the mapping file to make creating resources for all models customizable. Here is an example + + ```json + { + { + "model-name": "Customer", + "resource-file": "customers.json", + "table-name": "customers_table", + "routes-prefix" "customers_prefix" + } +} + ``` + +To generate all the resources mapped in the resources_map.json file, use the following command + +``` +php artisan create:mapped-resources [model-name] +``` + +### Generating clean and complete fields out of the box! + +When using the commands that generate fields, our goal is to generate fields configured and ready for use without having to make any change to the generated fields. + +While it is not possible to cover 100% of the use cases, Laravel-code-generator is shipped with a powerful configuration option to allow you to add conditions to handle your own use case. + +The key `common_definitions` in the `config/laravel-code-generator.php` file allows you match field name using pattern then set the properties accordingly. + +For example, you may want to add a global date, time, or datetime picker using javascript for any field where its name ends with `_at`. + +You can do that by adding the following entry + +```json +[ + 'match' => ['*_at'], + 'set' => [ + 'class' => 'datetime-picker', + ] +] +``` + +The same thing can be done for any field that ends with `_date` or starts with `date_of`` +```json +[ + 'match' => ['*_date','date_of_*'], + 'set' => [ + 'class' => 'date-picker', + ] +] +``` + +Of course, you can set any of the field's option like html-type, data-type, data-type-params or foreign relation. You can set the configuration as fits your environment, then you'll be able to create fields-file ready to generate resources with minimal work! + +The conditions are applied to each field top to bottom, the configuration at the bottom of the array will take presence over the once on the top in case multiple conditions were matched. + + +:::info +It is strongly recommended to read the comments above each option in the configuration file to help you understand and customize the generator to fit your needs! +::: + + +### Foreign Relations + +If you're using a code-first-approach and like to define relations between your models, you can easily define that in the relations keyword entry of the resource-file. Each relation can be defined using the following schema + +```json +{ + "name": "posts", // the name of the relation + "type": "hasMany", // the type of the relation + "params": [ // the parameters for the used relation. + "App\\Models\\Comment", + "post_id", + "id" + ], + "field": "name" // the name of the field on the foreign model to use as display value +} +``` +:::info +When creating `hasOne()` or `belongsTo()` relations, it be best to define them at the field level using the foreign-relation option. +Composite Indexes +::: + + +### Composite Indexes +If you're using a code-first-approach and like to define indexes with multiple columns, you can easily do that by adding these indexed to the Indexes keyword entry in the resource-file file. Each composite index can be defined using the following schema + +```json +{ + "name": "owner", // The name of the index to use, if no name is set a one will be generated. + "type": "unique", // Valid index type is one of the following 'index','unique' or 'primary'. If the type is not provided, 'index' is used. + "columns": [ // List of the columns' names to be included in the index left to right. + "first_name", + "last_name" + ] +} +``` diff --git a/docs/versioned_docs/version-2.3.0/upgrade-guide.md b/docs/versioned_docs/version-2.3.0/upgrade-guide.md new file mode 100644 index 0000000..c1ef8fb --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/upgrade-guide.md @@ -0,0 +1,16 @@ +--- +sidebar_position: 5 +title: Upgrade Guide +--- + +## Upgrade Guide + + - In your composer.json file, update the `crestapps/laravel-code-generator` dependency to `2.2.*`. + - Using the command-line, execute the following two commands to upgrade to the latest version of v2.2 + - `composer update` + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default --force` + - If you will be using **Laravel-Collective**, execute the following commands update the default-collective template. + - `php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective --force` + - Move any custom template "if any" from `resources/codegenerator-templates` to `resources/laravel-code-generator/templates`. **IMPORTANT** do not copy the default and default-collective folders. + - Move all the file that are located in `resources/codegenerator-files` to `resources/laravel-code-generator/sources`. Now you should be able to delete the following two folders since they have been relocated `resources/codegenerator-templates` and `resources/codegenerator-files`. + - Finally, there are some changes to the layout stub which are required. To override your existing layout call the following code`php artisan create:layout "My New App"`. If you are using your own layout, you may want to create a temporary layout and extract the updated css/js code into your own layout/assets. The following command will create a new file called "app\_temp.blade.php" `php artisan create:layout "My New App" --layout-filename=app_temp` diff --git a/docs/versioned_docs/version-2.4.0/available-commands.md b/docs/versioned_docs/version-2.4.0/available-commands.md new file mode 100644 index 0000000..2890d33 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/available-commands.md @@ -0,0 +1,588 @@ +--- +sidebar_position: 3 +title: Available Commands +--- + +## Available Commands + +The option in between the square brackets `[]` must be replaced with a variable of your choice. + + - **Main commands** + - php artisan create:layout \[application-name\] + - php artisan create:scaffold \[model-name\] + - php artisan create:controller \[model-name\] + - php artisan create:model \[model-name\] + - php artisan create:form-request \[model-name\] + - php artisan create:routes \[model-name\] + - php artisan create:migration \[model-name\] + - php artisan create:language \[model-name\] + - php artisan create:mapped-resources + - **Views commands** + - php artisan create:views \[model-name\] + - php artisan create:index-view \[model-name\] + - php artisan create:create-view \[model-name\] + - php artisan create:edit-view \[model-name\] + - php artisan create:show-view \[model-name\] + - php artisan create:form-view \[model-name\] + - **Resource's files commands** + - php artisan resource-file:from-database \[model-name\] + - php artisan resource-file:create \[model-name\] + - php artisan resource-file:append \[model-name\] + - php artisan resource-file:reduce \[model-name\] + - php artisan resource-file:delete \[model-name\] + - **Migration commands** + - php artisan migrate-all + - php artisan migrate:rollback-all + - php artisan migrate:reset-all + - php artisan migrate:refresh-all + - php artisan migrate:status-all + - **API generation commands** + - php artisan create:api-scaffold + - php artisan create:api-controller + - php artisan create:api-resource + - **API documentation generation commands** + - php artisan api-docs:scaffold + - php artisan api-docs:create-controller + - php artisan api-docs:create-view + +## Important Naming Convention + +Laravel-Code-Generator strive to generate highly readable, and error free code. In order to keep your code readable, it is important to follow a good naming convention when choosing names for your models, fields, tables, relations and so on. Here is a list of recommendation that we believe is important to keep your code clean and highly readable. + +1. Since each model represents a single object/row in a list/database, naming the model should be written in singular-form while using [Studly Case](https://laravel.com/docs/5.5/helpers#method-studly-case). For example, `Post` and `PostCategory`... +2. Since a database is a collection of model's object, table naming should always be plural and written in lowercase while using [Snake Case](https://en.wikipedia.org/wiki/Snake_case). For example, `users`, `post_categories`... +3. Primary keys should be named `id` in the table. +4. Since the foreign key represents a foreign/other table, the name should always end with `_id`. For example, `post_id`, `user_id`, `post_category_id`... +5. Field naming should always be in a singular-form and written in lowercase while using [Snake Case](https://en.wikipedia.org/wiki/Snake_case). For example, `title`, `first_name`, `description`... + + +## Examples + +The following example assumes that we are trying to create a CRUD called AssetCategory with the fields listed below. + + - id + - name + - description + - is_active + + +### Basic example + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` + +``` +php artisan create:scaffold AssetCategory +``` +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example using translations for English and Arabic + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active --translation-for=en,ar +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` + +``` +php artisan create:scaffold AssetCategory +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example with form-request + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` + +``` +php artisan create:scaffold AssetCategory --with-form-request +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example with soft-delete and migration + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json`` + +``` +php artisan create:scaffold AssetCategory --with-soft-delete --with-migration +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Creating resources from existing database. + +``` +php artisan create:scaffold AssetCategory --table-exists +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + +You may also create a resource-file from existing database separately using `php artisan resource-file:form-database AssetCategory` + + +### Creating resources from existing database with translation for English and Arabic + +``` +php artisan create:scaffold AssetCategory --table-exists --translation-for=en,ar +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json`` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + +You may also create a [resource-file](./resource-file.md) from existing database separately using + +``` +php artisan resource-file:form-database AssetCategory --translation-for=en,ar +``` + +### Creating resources from existing database with translation for English and Arabic in two step for better control over the fields! + +``` +php artisan resource-file:form-database AssetCategory --translation-for=en,ar +php artisan create:scaffold AssetCategory +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + + + +## How To + +::: Info +All examples below assumes that you already created a [resource-file](./resource-file.md) (i.e resources/codegenerator-fields/posts.json. This file can be created using the following command `php artisan resource-file:create Post --fields=id,title,details,is_active`) +::: + +### How to create "views-layout"? + +:::note[To create a new layout for your application.] + + ``` + php artisan create:layout [application-name] + ``` + + The argument `[application-name]` should be replaced with the name of the application you are creating. For example: + + ``` + php artisan create:layout "My New Laravel App" + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --layout-filename | The name of the layout file to be used. | `app` (i.e, creates `app.blade.php`) | + | --layout-directory | The directory to create the layout under. | `layouts` | + | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | + | --force | This option will override the layout if one already exists. | | + +::: + + +### How to create resources (complete CRUD)? + +:::note[Create multiple resources at the same time. It can be invoked every time the resource-file is modified to recreate the resources all over again.] + + ``` + php artisan create:scaffold [model-name] + ``` + + The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:scaffold Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | + | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | + | --controller-extends | Specify which class should the controller extends. Note: the default value is can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `default-controller` which means use the settings from the configurations by default `Http\Controllers\Controller` | + | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | + | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | + | --models-per-page | How many models to show per page on the index view. | `25` | + | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | + | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | + | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | + | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | + | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | + | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | + | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | + | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | + | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | + | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | + | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | + | --engine-name | A specific engine name for the database's table can be provided here. | | + | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | + | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | + | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | + | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --fields | [Described below](#fields) | | + | --template-name | [Described above](#template-name) | | + | --force | This option will override the layout if one already exists. | | +::: + + +### How to create multiple resources at once? + +:::note[Create multiple resources at the same time] + + ``` + php artisan create:mapped-resources + ``` + +When using `resource-file:create`, `resource-file:from-database` or `resource-file:delete` the `resources_map.json` file is updated behind the scenes. This options create multiple resources for all the resources found in the `resources/laravel-code-generator/sources/resources_map.json` at the same time. The resources can be invoked every time any of the resource-file is modified to recreate the resources all over again. + + | Option | Description | + | ----------- | ----------- | + | --controller-extends | [Described above](#controller-extends) | + | --with-auth | [Described above](#with-auth) | + | --models-per-page | [Described above](#models-per-page) | + | --with-form-request | [Described above](#with-form-request) | + | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | + | --form-request-directory | [Described above](#form-request-directory) | + | --table-exists | [Described above](#table-exists) | + | --translation-for | [Described above](#translation-for) | + | --primary-key | [Described above](#primary-key) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --with-migration | [Described above](#with-migration) | + | --connection-name | [Described above](#connection-name) | + | --engine-name | [Described above](#engine-name) | + | --controller-directory | [Described above](#controller-directory) | + | --model-directory | [Described above](#model-directory) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --mapping-filename | This option allows you to pass the name of the mapping-directory file. When this option is left out, the default `resources_map.json`` file will be used. | + | --force | This option will override the layout if one already exists. | +::: + + +### How to create a controller? + +:::note[Create a controller for your resource.] + + ``` + php artisan create:controller [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:controller Posts + ``` + + | Option | Description | + | ----------- | ----------- | + | --controller-name | [Described above](#controller-name) | + | --controller-directory | [Described above](#controller-directory) | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --models-per-page | [Described above](#models-per-page) | + | --language-filename | [Described above](#language-filename) | + | --with-auth | [Described above](#with-auth) | + | --with-form-request | [Described above](#with-form-request) | + | --without-form-request | [Described above](#without-form-request) | + | --form-request-directory | [Described above](#form-request-directory) | + | --model-directory | [Described above](#model-directory) | + | --views-directory | [Described above](#views-directory) | + | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | + | --without-model | Allow you to create all the resources excluding the model. | + | --without-views | Allow you to create all the resources excluding the views. | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + + + +### How to create a model? + +:::note[Create a model.] + + ``` + php artisan create:model [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:model Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --table-name | [Described above](#table-name) | + | --primary-key | [Described above](#primary-key) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --model-directory | [Described above](#model-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create routes? + +:::note[Create routes for your CRUD operations.] + + ``` + php artisan create:routes [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:routes Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --controller-name | [Described above](#controller-name) | + | --routes-prefix | [Described above](#routes-prefix) | + | --without-route-clause | Create the routes without where clause for the id. It may be used when the primary key is not an integer | + | --for-api | Create API based routes. | + | --for-version | provide the version of the api to create the routes for. | + | --table-name | [Described above](#table-name) | + | --template-name | [Described above](#template-name) | +::: + +### How to create all standard CRUD views (i.e. Create, Read, Update and Delete)? + +> When creating views using the `create:views`, `create:create-view` or `create:update-view` an additional view called "form-view" is created. The "form-view" contains the form fields to prevent code duplication. + +:::note[Create routes for views for CRUD operations.] + + ``` + php artisan create:views [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:views Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | + | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the Create Operation? + +:::note[Create a create-view.] + + ``` + php artisan create:create-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:create-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + + +### How to create a view for the Edit Operation? + +:::note[Create an edit-view.] + + ``` + php artisan create:edit-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:edit-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the List Operation? + +:::note[Create an index-view.] + + ``` + php artisan create:index-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:index-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the Display Operation? + +:::note[Create an show-view.] + + ``` + php artisan create:show-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:show-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a form-view? + +:::note[Create an form-view.] + + ``` + php artisan create:form-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a database migration? + +:::note[Create a database migration.] + + ``` + php artisan create:migration [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:migration Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --table-name | [Described above](#table-name) | + | --resource-file | [Described above](#resource-file) | + | --migration-class-name | [Described above](#migration-class-name) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --connection-name | [Described above](#connection-name) | + | --engine-name | [Described above](#engine-name) | + | --template-name | [Described above](#template-name) | + | --force | This option will override the file if it already exists. | +::: + +### How to create form-request? + +:::note[Create a form-request for request validation.] + + ``` + php artisan create:form-request [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-request Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --class-name | [Described above](#class-name) | + | --resource-file | [Described above](#resource-file) | + | --with-auth | [Described above](#with-auth) | + | --routes-prefix | [Described above](#routes-prefix) | + | --form-request-directory | [Described above](#form-request-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a language file? + +:::note[Create a new language file.] + + ``` + php artisan create:language [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:language Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --language-filename | [Described above](#language-filename) | + | --resource-file | [Described above](#resource-file) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: diff --git a/docs/versioned_docs/version-2.4.0/configurations.md b/docs/versioned_docs/version-2.4.0/configurations.md new file mode 100644 index 0000000..5df7583 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/configurations.md @@ -0,0 +1,12 @@ +--- +sidebar_position: 5 +title: Configurations +--- + +## Configurations + +Laravel-Code-Generator ships with lots of configurable option to give you control of the generated code. It is strongly recommended that you read the comments block above each option in the config/laravel-code-generator.php file to get familiar with all available options. + +To override or extend the default settings to prevent you from losing your setting when upgrading the package. The `config/laravel-code-generator.php` is a dedicated file to store your options. This file will always be controlled by you and will never be overridden by the package. To override any configuration found in `config/laravel-code-generator.php`, simple add the same option in your custom file. The generator will look at the your configuration before falling back to the default config. Note, any array based option will be extended not overridden. + +The most important option in the configuration file is `common_definitions`. This option allows you to set the default properties of new field using the name of that field. Your goal should be to generate 100% ready resource-file using this config. It will save you lots of time since all your fields will get generated using the desired properties. In another words, when using `resource-file:create`, `resource-file:append` or `resource-file:from-database` to create resource file, the generated JSON will be 100% ready for you without any manual modification. diff --git a/docs/versioned_docs/version-2.4.0/get-started.md b/docs/versioned_docs/version-2.4.0/get-started.md new file mode 100644 index 0000000..3931537 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/get-started.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 2 +title: Getting Started +--- + +# Getting Started + +### Installation + +1. To download this package into your Laravel project, use the command-line to execute the following command + +``` +composer require crestapps/laravel-code-generator --dev +``` + +2. (You may skip this step when using Laravel >= 5.5)** To bootstrap the packages into your project while using command-line only, open the app/Providers/AppServiceProvider.php file in your project. Then, add the following code to the `register()` method. + +``` +if ($this->app->runningInConsole()) { + $this->app->register('CrestApps\CodeGenerator\CodeGeneratorServiceProvider'); +} +``` + +3. Execute the following command from the command-line to publish the package's config and the default template to start generating awesome code. + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default +``` + +A layout is required for the default views! The code generator allows you to create a layout using the command-line. Of course you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/) in your layout for the default templates to work properly. Additionally, you can chose to design your own templates using a different or no css framework. For more info on how to create a custom template [click here](https://crestapps.com/laravel-code-generator/docs/2.2#how-to-create-custom-template)! + +### Demo + +Below a video to demonstrate how to use most of the package commands. + + + diff --git a/docs/versioned_docs/version-2.4.0/intro.md b/docs/versioned_docs/version-2.4.0/intro.md new file mode 100644 index 0000000..8523b27 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/intro.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 1 +title: Introduction +--- + +## CrestApps - Laravel Code Generator + +### Introduction + +Enhance your Laravel development experience with our sophisticated code generator! This powerful tool is designed to streamline your workflow and save you valuable time. Whether you need to create views, controllers, routes, migrations, languages, or request forms, this versatile generator has got you covered – all in just seconds! + +Experience the ultimate flexibility and customization options to cater to a wide range of use cases. Our code generator comes with a cross-browser compatible template and includes client-side validation to bring a modern touch to your application. + +Explore the project's source code on [GitHub](https://github.com/CrestApps/laravel-code-generator), available under the permissive [MIT license](https://opensource.org/licenses/MIT). Upgrade your Laravel development with efficiency and style! + + +### Features + +- Craft clean, reusable, and highly readable code for seamless development. +- Generate complete resources effortlessly with a single command, supporting both migration and existing database scenarios. +- Streamline resource creation for all existing database tables with a single command. +- Save and recreate fields using a JSON file, ensuring adaptability to changing business needs. +- Leverage JSON-based resource files for easy regeneration, even when business rules evolve. +- Generate standard CRUD controllers with simple or form-request validation. +- Customize view templates to alter the standard look and feel of your application. +- Create models with relations for comprehensive data representation. +- Establish named routes with and without grouping for efficient navigation. +- Generate standard CRUD views to facilitate a consistent user experience. +- Smart migration engine tracks generated migrations to only create necessary ones. +- Intelligent handling of model relations to simplify development. +- Highly flexible with rich configurable options to suit diverse needs. +- Easy commands for resource-file creation, addition, or reduction. +- Full support for generating multi-language applications. +- Implement client-side validation for enhanced user interaction. +- Efficiently handle file uploading and store multiple responses in the database. +- Generate form-request to clean up controllers and boost code reusability. +- Create view layouts with and without client-side validation. +- Change templates at runtime for diverse view generation. +- Ability to generate views with or without Laravel-Collective integration. +- Seamless handling of date, time, or datetime fields. +- Automatic management of boolean fields for hassle-free development. + + +### Dependencies + +#### Prerequisite + + - **[Laravel >= 5.1 framework.](https://laravel.com/)** + - **[Composer](https://getcomposer.org/)** installed on your local workstation. + +#### Default template dependencies + + - **[CSS bootstrap Framework.](http://getbootstrap.com/)** This is only required with the default template. You are free to make your own template. + +#### (Optional) Client-side validation dependencies + + - **[jQuery.](https://jquery.com/)** Required only if you want to take advantage of the client + - **[jQuery Validation Plugin.](https://jqueryvalidation.org/)** Only if you want to take advantage of the client side validation. + +#### (Optional) Using Laravel-Collective + +Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](using-laravel-collective.md) diff --git a/docs/versioned_docs/version-2.4.0/laravel-collective.md b/docs/versioned_docs/version-2.4.0/laravel-collective.md new file mode 100644 index 0000000..b7dc053 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/laravel-collective.md @@ -0,0 +1,36 @@ +--- +sidebar_position: 10 +title: Laravel Collective +--- + +## Using Laravel-Collective to generate views + +:::info + To use Laravel-Collective to generate view, you'll have to install the [Laravel-Collective](https://github.com/LaravelCollective/html) package. + ::: + + Laravel-Code-Generator is capable of fully generating views using Laravel-Collective package. In fact, it is shipped with a template based on Laravel-collective called "default-collective". + +By default, the template "default-collective" is not published to the resources folder as it is not needed out of the box. To publish it, use the command-line to execute the following command. + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-collective +``` + +### How to generate views using the Laravel-Collective package? + +There are two ways to generate views using Laravel-Collective + +- Via the package configuration + + > Open the config file of the package `/config/laravel-code-generator.php` change the value of the key template to default-collective + +- Or, via command-line + + > Change the template name at run time. In another words, pass the following option--template-name=default-collective from command-line + +### How to create a new template based on Laravel-Collective? + +First, duplicate the folder `/resources/laravel-code-generator/templates/default-collective` and name it anything your like. + +Second, open up the package config file and add the new template name to the `laravel_collective_templates` array. diff --git a/docs/versioned_docs/version-2.4.0/release-notes.md b/docs/versioned_docs/version-2.4.0/release-notes.md new file mode 100644 index 0000000..47391f7 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/release-notes.md @@ -0,0 +1,19 @@ +--- +sidebar_position: 6 +title: Release Notes +--- + +## Release Notes + +The following commands were added + + - **API generation commands** + - php artisan create:api-scaffold + - php artisan create:api-controller + - php artisan create:api-resource + - **API documentation generation commands** + - php artisan api-docs:scaffold + - php artisan api-docs:create-controller + - php artisan api-docs:create-view + +Multiple bugs were fixed. diff --git a/docs/versioned_docs/version-2.4.0/resource-file.md b/docs/versioned_docs/version-2.4.0/resource-file.md new file mode 100644 index 0000000..52d8448 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/resource-file.md @@ -0,0 +1,318 @@ +--- +sidebar_position: 4 +title: Resource File +--- + +## Resource Files + +A JSON based file that allows you to define how you like your resource generated. You can define your fields, indexes, and model relations. + +## Available Commands to Manage Resource Files + +The option in between the square brackets `[]` must be replaced with a variable of your choice. + - php artisan resource-file:create \[model-name\] + - php artisan resource-file:append \[model-name\] + - php artisan resource-file:reduce \[model-name\] + - php artisan resource-file:delete \[model-name\] + +### How to create resource-file? + +:::note[Create a new resource file.] + + ``` + php artisan resource-file:create [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:create Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | + | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | + | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | + | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| + | --translation-for | [Described above](#translation-for) | + | --force | This option will override any file that already exist. | +::: + +### How to add resources to existing resource-file? + +:::note[Appends a new fields, indexes, or relations to an existing resource-file. If the resource-file does not exists one will be created] + + ``` + php artisan resource-file:append Post --fields=notes,created_by + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-request Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | + | --translation-for | [Described above](#translation-for) | +::: + +### How to remove resources to existing resource-file? + + > If the resource-file becomes empty, it will automatically get deleted by calling the `resource-file:delete` command. + +:::note[Removes fields, indexes, or relations to an existing resource-file.] + + ``` + php artisan resource-file:reduce [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:reduce Post --fields=notes,created_by + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | +::: + +### How to delete existing resource-file? + +> It is recommended to use this command to delete file instead of manually deleting it. This command will also delete the mapped relation in the resource_map file. + +:::note[Delete existing resource-file. ] + + ``` + php artisan resource-file:delete [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:delete Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | +::: + +### How to create a resource's file from existing database? + +> Are you looking to convert existing application to Laravel framework? Or, looking to use database-first instead of code-first approach? No problem! This package allows you to create a resource's file from existing database. +> +> You can easily take advantage of this feature by passing `--table-exists` option to the `create:resources` command to automatically generate all the resources from existing database's table. + +:::note[Convert your existing database into resource file, then the create:resources command is used to generate the resources] + + ``` + php artisan resource-file:from-database [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:from-database Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --table-name | [Described above](#table-name) | + | --database-name | [Described above](#database-name) | + | --resource-file | [Described above](#resource-file) | + | --resource-filename| [Described above](#resource-filename) | + | --translation-for| [Described above](#translation-for) | + | --force | This option will override any file that already exist. | + +::: + + +### Fields + +> The minimum requirement for creating a field is a unique name. However, the code-generator is very flexible and allows you to have full control on the fields. Below all the available properties for defining a field + +#### HTML Properties + | Property name | Description | + | ----------- | ----------- | + | name | A unique name for the field. This is a required field. | + | label | A user-friendly title to describe the field. If this option is left out, the field's name is used to generate a title. | + | validation | You can pass any valid Laravel validation rule. The rules should be separated by bar `\|`.

    For example: `required\|string\|min:2\|max:255`

    Start with Laravel 5.5, you can define custom validation rules and pass them as well. For example, to use a custom validation rule called Uppercase in addition to the required rule, you can pass this string required|new Uppercase.

    To learn more about the valid options please visit [Laravel documentation](https://laravel.com/docs/master/validation#available-validation-rules).

    When the rule `required` is not used, the field in the migration file will automatically become nullable. | + | html-type | Default value: `text`. A valid property will be one of the following options
    `text`, `textarea`, `password`,`email`,`checkbox`,`radio`,`number`,`select`,`hidden`,`file`,`selectRange`,`selectMonth`, or `multipleSelect`.

    Note: when using file type, after the file is uploaded to the designated path, the filename is stored in the database by default. For everything to work properly, the data-type must be of some sort of a string type. Or modify the behavior of moveFile method to handle the new file.

    By default this process stores the uploaded file in the path defined in config file.

    Note: when using checkbox, or multipleSelect, the items are stored in the database as JSON string. Additionally, the items in the index or form views are displayed separated by the value provided in the delimiter property. | + | delimiter | Default value: "; ". When generating a form with checkbox or a select menu that accepts multiple answers, we need either store the results in a foreign model or store the records in a string field. By default, the code generator will convert the multiple options that a user selected into a JSON string before the results are stored using a Eloquent-mutator method.

    When the data is presented on the show and/or index views, the options are displayed separated by the value of the delimiter. Of course, you can always change this behavior to fit your needs by removing the accessor and mutator methods in the model and modifying the views accordingly. | + | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."`` property. Classes that are already set in the views will not be replaced. | + | date-format | Default value: "m/d/Y H:i A". Any field with the type date, time or datetime can be formatted different when it is displayed. You can change the display format using this option. | + | html-value | A default value to set the field to. When using multiple options based html-type like checkbox, multipleSelect you can set this property to array of values to set multiple values by default. Ex, `["Red","Green"]` | + | options | If you used select, checkbox, or radio for the html-type property, this is where you provide the options. Here are some example of the schema.

    A simple array: In this option, the value will be the numeric index value of the item in the array.
    ```"options": ["Prefer not to say","Male","Female"]```.
    Using explicit values
    ```"options": { "": Prefer not to say", "male": "Male","female": "Female"}```.
    Using multiple language phrases for each option
    ```"options": {"en":{"":"Prefer not to say","male":"Male","female":"Female"},"ar":{"":"Prefer not to say in Arabic","male":"Male in Arabic","female":"Female in Arabic"},"fr":{"":"Prefer not to say in French","male":"Male in French","female":"Female in French"}}``` | + | is-inline-options | Default value: false. If the html-type is set to radio or checkbox, setting this option to true will put the items next to each other instead of a vertical list. | + | placeholder or place-holder | You can set a placeholder value when html-type is set to text, number, email, textarea or select. | + | is-on-index | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index view. | + | is-on-form | Default value: `true`. Setting the value to `false` will prevent from adding this field to the form view. | + | is-on-show | Default value: `true`. Setting the value to `false` will prevent from adding this field to the show view. | + | is-on-views | Default value: `true`. Setting the value to `false`` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | + | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns`` in the configuration file, allow you to list the common field name to automatically set them as header. | + + #### Database Properties + | Property name | Description | + | ----------- | ----------- | + | data-type | Default is `varchar`. The database column type. The following are valid types:
    ```'char', 'date', 'datetime', 'datetimetz', 'biginteger', 'bigint', 'blob', 'binary', 'bool', 'boolean', 'decimal', 'double', 'enum', 'list', 'float', 'int', 'integer', 'ipaddress', 'json', 'jsonb', 'longtext', 'macaddress', 'mediuminteger', 'mediumint', 'mediumtext', 'morphs', 'string', 'varchar', 'nvarchar', 'text', 'time', 'timetz', 'tinyinteger', 'tinyint', 'timestamp', 'timestamptz', 'unsignedbiginteger', 'unsignedbigint', 'unsignedInteger', 'unsignedint', 'unsignedmediuminteger', 'unsignedmediumint', 'unsignedsmallinteger', 'unsignedsmallint', 'unsignedtinyinteger', 'uuid', 'uuid'```

    Note: you can add short cuts if needed to in the `laravel-code-generator.php` config file.You can add new mapping to the eloquent_type_to_method array. | + | data-type-params | This option allows you to specify parameters for the data type. Please ensure you provide valid parameters otherwise unexpected behavior will occur. For example, varchar and char will only need a maximum of one integer parameter where double, decimal and float require two integer parameters.

    Command line example with specifying a decimal precision and scale: `data-type-params=5,2`. JSON file example `"data-type-params": [5,2]`

    If this option left out while some sort of a string data-type was used along with a max validation rule, the max value is used to limit the length of the sting in the database when a migration is generated | + | data-value | Default value is null. The default value for the database column. | + | is-auto-increment | Default value is false. Setting this value to true will make this column a primary with auto increment identity. | + | is-primary | Default value is false. You can set this field as the primary for retrieving records from the database. You can only set one column as the primary. If you set multiple fields are primary, the first one will be selected and the rest will be ignored.

    Note: if you set the is-auto-increment field, this option will automatically get set. Ths only time this can be used is to create a primary field you don't wish for the database to auto assign it. | + | is-index | Default value is false. Setting this value to true will add index to this column. | + | is-unique | Default value is false. Setting this value to true will add a unique index to this column. | + | is-nullable | Default value is false. Setting this value to true will make this column nullable.

    Note: when setting this option to true, the default value will be set to NULL unless you pass a different value to data-value.

    When the validation rule contains "nullable", "required_if", "required_unless", "required_with", "required_with_all", "required_without", "required_without_all" or does NOT contains "required" rule, this flag will automatically gets set. | + | is-unsigned | Default value is false. Setting this value to true will make this column unsigned. This option should only be used with numeric types only. | + | comment | This option will allow you to add meta description of the field in the database. | + | is-data | This option will allow you to casts a data filed to a Carbon object. | + | cast-as | This option will allow you to cast a field to php's native type. | + | foreign-relation | This option will allow you to create a foreign relation between the models.

    ```json {"name":"creator","type":"belongsTo","params":["App\\User","created_by"],"field":"name"}``` | + | foreign-constraint | This option will allow you to create a foreign relation between the models.

    ```json {"field":"user_id","references":"id","on":"users","on-delete":"cascade","on-update":"cascade","references-model":"App\\Models\\User"} ``` | + | on-store | This option allows you to set a fixed value on the store action. For example, Illuminate\Support\Facades\Auth::Id(); will set the value to the current user id when the model is first created. Assuming you're using [Laravel Authentication](https://laravel.com/docs/master/authentication). | + | on-update | Similar to on-storeThis option allows you to set a fixed value on the update action. | + + +### Managing fields using JSON file + +Storing the field's specification in a JSON file enables you to easily reuse the field with multiple commands. It also allows you to recreate the resources in the future if you decided to add/remove fields after the views have been crafted. The JSON files are typically stored in /resources/laravel-generator. If you don’t like where these files are kept, you can change that path from the config/laravelgenerator.php file. + +The following command should be used to manage the resource-file to make this process easier. + + - php artisan resource-file:from-database [model-name] + - php artisan resource-file:create [model-name] + - php artisan resource-file:append [model-name] + - php artisan resource-file:reduce [model-name] + - php artisan resource-file:delete [model-name] + +### Resources mapping file + +The resources-map file, is a JSON file that is used to keep track of the fields-file and the model classes to allow you to create the resources all at once. + +The default file name is `resources_map.json` and can be changed from the configuration file. + +When using `resource-file:create`, `resource-file:from-database` or `resource-file:delete` commands, a file called resources_map.json is automatically updated. + +The following is the structure of the file. + +```json + { + { + "model-name": "Brand", + "resource-file": "brands.json" + }, + { + "model-name": "Customer", + "resource-file": "customers.json", + "table-name": "customers_table" + } +} +``` + + All option that are available to the `create:resources` can be used in the mapping file to make creating resources for all models customizable. Here is an example + + ```json + { + { + "model-name": "Customer", + "resource-file": "customers.json", + "table-name": "customers_table", + "routes-prefix" "customers_prefix" + } +} + ``` + +To generate all the resources mapped in the resources_map.json file, use the following command + +``` +php artisan create:mapped-resources [model-name] +``` + +### Generating clean and complete fields out of the box! + +When using the commands that generate fields, our goal is to generate fields configured and ready for use without having to make any change to the generated fields. + +While it is not possible to cover 100% of the use cases, Laravel-code-generator is shipped with a powerful configuration option to allow you to add conditions to handle your own use case. + +The key `common_definitions` in the `config/laravel-code-generator.php` file allows you match field name using pattern then set the properties accordingly. + +For example, you may want to add a global date, time, or datetime picker using javascript for any field where its name ends with `_at`. + +You can do that by adding the following entry + +```json +[ + 'match' => ['*_at'], + 'set' => [ + 'class' => 'datetime-picker', + ] +] +``` + +The same thing can be done for any field that ends with `_date` or starts with `date_of`` +```json +[ + 'match' => ['*_date','date_of_*'], + 'set' => [ + 'class' => 'date-picker', + ] +] +``` + +Of course, you can set any of the field's option like html-type, data-type, data-type-params or foreign relation. You can set the configuration as fits your environment, then you'll be able to create fields-file ready to generate resources with minimal work! + +The conditions are applied to each field top to bottom, the configuration at the bottom of the array will take presence over the once on the top in case multiple conditions were matched. + + +:::info +It is strongly recommended to read the comments above each option in the configuration file to help you understand and customize the generator to fit your needs! +::: + + +### Foreign Relations + +If you're using a code-first-approach and like to define relations between your models, you can easily define that in the relations keyword entry of the resource-file. Each relation can be defined using the following schema + +```json +{ + "name": "posts", // the name of the relation + "type": "hasMany", // the type of the relation + "params": [ // the parameters for the used relation. + "App\\Models\\Comment", + "post_id", + "id" + ], + "field": "name" // the name of the field on the foreign model to use as display value +} +``` +:::info +When creating `hasOne()` or `belongsTo()` relations, it be best to define them at the field level using the foreign-relation option. +Composite Indexes +::: + + +### Composite Indexes +If you're using a code-first-approach and like to define indexes with multiple columns, you can easily do that by adding these indexed to the Indexes keyword entry in the resource-file file. Each composite index can be defined using the following schema + +```json +{ + "name": "owner", // The name of the index to use, if no name is set a one will be generated. + "type": "unique", // Valid index type is one of the following 'index','unique' or 'primary'. If the type is not provided, 'index' is used. + "columns": [ // List of the columns' names to be included in the index left to right. + "first_name", + "last_name" + ] +} +``` diff --git a/docs/versioned_docs/version-2.4.0/upgrade-guide.md b/docs/versioned_docs/version-2.4.0/upgrade-guide.md new file mode 100644 index 0000000..c4f9d89 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/upgrade-guide.md @@ -0,0 +1,8 @@ +--- +sidebar_position: 5 +title: Upgrade Guide +--- + +## Upgrade Guide from 2.3 to 2.4 + +delete the the `codegenerator.php` file from your config folder, then rename the `codegenerator_custom.php` file to `laravel-code-generator.php`. Alternatively, you can delete both codegenerator.php and `codegenerator_custom.php` diff --git a/docs/versioned_docs/version-3.0.0/available-commands.md b/docs/versioned_docs/version-3.0.0/available-commands.md new file mode 100644 index 0000000..5b420d5 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0/available-commands.md @@ -0,0 +1,593 @@ +--- +sidebar_position: 3 +title: Available Commands +--- + +## Available Commands + +The option in between the square brackets `[]` must be replaced with a variable of your choice. + + - **Main commands** + - php artisan create:layout \[application-name\] + - php artisan create:scaffold \[model-name\] + - php artisan create:controller \[model-name\] + - php artisan create:model \[model-name\] + - php artisan create:form-request \[model-name\] + - php artisan create:routes \[model-name\] + - php artisan create:migration \[model-name\] + - php artisan create:language \[model-name\] + - php artisan create:mapped-resources + - **Views commands** + - php artisan create:views \[model-name\] + - php artisan create:index-view \[model-name\] + - php artisan create:create-view \[model-name\] + - php artisan create:edit-view \[model-name\] + - php artisan create:show-view \[model-name\] + - php artisan create:form-view \[model-name\] + - **Resource's files commands** + - php artisan resource-file:from-database \[model-name\] + - php artisan resource-file:create \[model-name\] + - php artisan resource-file:append \[model-name\] + - php artisan resource-file:reduce \[model-name\] + - php artisan resource-file:delete \[model-name\] + - **Migration commands** + - php artisan migrate-all + - php artisan migrate:rollback-all + - php artisan migrate:reset-all + - php artisan migrate:refresh-all + - php artisan migrate:status-all + - **API generation commands** + - php artisan create:api-scaffold + - php artisan create:api-controller + - php artisan create:api-resource + - **API documentation generation commands** + - php artisan api-docs:scaffold + - php artisan api-docs:create-controller + - php artisan api-docs:create-view + +## Important Naming Convention + +Laravel-Code-Generator strive to generate highly readable, and error free code. In order to keep your code readable, it is important to follow a good naming convention when choosing names for your models, fields, tables, relations and so on. Here is a list of recommendation that we believe is important to keep your code clean and highly readable. + +1. Since each model represents a single object/row in a list/database, naming the model should be written in singular-form while using [Studly Case](https://laravel.com/docs/5.5/helpers#method-studly-case). For example, `Post` and `PostCategory`... +2. Since a database is a collection of model's object, table naming should always be plural and written in lowercase while using [Snake Case](https://en.wikipedia.org/wiki/Snake_case). For example, `users`, `post_categories`... +3. Primary keys should be named `id` in the table. +4. Since the foreign key represents a foreign/other table, the name should always end with `_id`. For example, `post_id`, `user_id`, `post_category_id`... +5. Field naming should always be in a singular-form and written in lowercase while using [Snake Case](https://en.wikipedia.org/wiki/Snake_case). For example, `title`, `first_name`, `description`... + + +## Examples + +The following example assumes that we are trying to create a CRUD called AssetCategory with the fields listed below. + + - id + - name + - description + - is_active + +:::info + +A layout is required for the default views! You can use command to create a layout using the command-line. Of course you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/) in your layout for the default templates to work properly. Additionally, you can chose to design your own templates using a different or no css framework. +:::: + + +### Basic example + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` + +``` +php artisan create:scaffold AssetCategory +``` +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example using translations for English and Arabic + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active --translation-for=en,ar +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` + +``` +php artisan create:scaffold AssetCategory +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example with form-request + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` + +``` +php artisan create:scaffold AssetCategory --with-form-request +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Basic example with soft-delete and migration + +``` +php artisan resource-file:create AssetCategory --fields=id,name,description,is_active +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json`` + +``` +php artisan create:scaffold AssetCategory --with-soft-delete --with-migration +``` + +The above command will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views, the routes, and migration file! + + +### Creating resources from existing database. + +``` +php artisan create:scaffold AssetCategory --table-exists +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + +You may also create a resource-file from existing database separately using `php artisan resource-file:form-database AssetCategory` + + +### Creating resources from existing database with translation for English and Arabic + +``` +php artisan create:scaffold AssetCategory --table-exists --translation-for=en,ar +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json`` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + +You may also create a [resource-file](./resource-file.md) from existing database separately using + +``` +php artisan resource-file:form-database AssetCategory --translation-for=en,ar +``` + +### Creating resources from existing database with translation for English and Arabic in two step for better control over the fields! + +``` +php artisan resource-file:form-database AssetCategory --translation-for=en,ar +php artisan create:scaffold AssetCategory +``` + +The above command will create [resource-file](./resource-file.md) names `/resources/laravel-code-generator/asset_categories.json` + +Then it will create a model `app/Models/AssetCategory`, a controller `app/Http/Controllers/AssetCategoriesController`, all views and the routes! + + + +## How To + +::: Info +All examples below assumes that you already created a [resource-file](./resource-file.md) (i.e resources/codegenerator-fields/posts.json. This file can be created using the following command `php artisan resource-file:create Post --fields=id,title,details,is_active`) +::: + +### How to create "views-layout"? + +:::note[To create a new layout for your application.] + + ``` + php artisan create:layout [application-name] + ``` + + The argument `[application-name]` should be replaced with the name of the application you are creating. For example: + + ``` + php artisan create:layout "My New Laravel App" + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --layout-filename | The name of the layout file to be used. | `app` (i.e, creates `app.blade.php`) | + | --layout-directory | The directory to create the layout under. | `layouts` | + | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | + | --force | This option will override the layout if one already exists. | | + +::: + + +### How to create resources (complete CRUD)? + +:::note[Create multiple resources at the same time. It can be invoked every time the resource-file is modified to recreate the resources all over again.] + + ``` + php artisan create:scaffold [model-name] + ``` + + The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:scaffold Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | + | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | + | --controller-extends | Specify which class should the controller extends. Note: the default value is can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `default-controller` which means use the settings from the configurations by default `Http\Controllers\Controller` | + | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | + | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | + | --models-per-page | How many models to show per page on the index view. | `25` | + | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | + | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | + | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | + | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | + | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | + | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | + | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | + | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | + | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | + | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | + | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | + | --engine-name | A specific engine name for the database's table can be provided here. | | + | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | + | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | + | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | + | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --fields | [Described below](#fields) | | + | --template-name | [Described above](#template-name) | | + | --force | This option will override the layout if one already exists. | | +::: + + +### How to create multiple resources at once? + +:::note[Create multiple resources at the same time] + + ``` + php artisan create:mapped-resources + ``` + +When using `resource-file:create`, `resource-file:from-database` or `resource-file:delete` the `resources_map.json` file is updated behind the scenes. This options create multiple resources for all the resources found in the `resources/laravel-code-generator/sources/resources_map.json` at the same time. The resources can be invoked every time any of the resource-file is modified to recreate the resources all over again. + + | Option | Description | + | ----------- | ----------- | + | --controller-extends | [Described above](#controller-extends) | + | --with-auth | [Described above](#with-auth) | + | --models-per-page | [Described above](#models-per-page) | + | --with-form-request | [Described above](#with-form-request) | + | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | + | --form-request-directory | [Described above](#form-request-directory) | + | --table-exists | [Described above](#table-exists) | + | --translation-for | [Described above](#translation-for) | + | --primary-key | [Described above](#primary-key) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --with-migration | [Described above](#with-migration) | + | --connection-name | [Described above](#connection-name) | + | --engine-name | [Described above](#engine-name) | + | --controller-directory | [Described above](#controller-directory) | + | --model-directory | [Described above](#model-directory) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --mapping-filename | This option allows you to pass the name of the mapping-directory file. When this option is left out, the default `resources_map.json`` file will be used. | + | --force | This option will override the layout if one already exists. | +::: + + +### How to create a controller? + +:::note[Create a controller for your resource.] + + ``` + php artisan create:controller [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:controller Posts + ``` + + | Option | Description | + | ----------- | ----------- | + | --controller-name | [Described above](#controller-name) | + | --controller-directory | [Described above](#controller-directory) | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --models-per-page | [Described above](#models-per-page) | + | --language-filename | [Described above](#language-filename) | + | --with-auth | [Described above](#with-auth) | + | --with-form-request | [Described above](#with-form-request) | + | --without-form-request | [Described above](#without-form-request) | + | --form-request-directory | [Described above](#form-request-directory) | + | --model-directory | [Described above](#model-directory) | + | --views-directory | [Described above](#views-directory) | + | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | + | --without-model | Allow you to create all the resources excluding the model. | + | --without-views | Allow you to create all the resources excluding the views. | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + + + +### How to create a model? + +:::note[Create a model.] + + ``` + php artisan create:model [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:model Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --table-name | [Described above](#table-name) | + | --primary-key | [Described above](#primary-key) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --model-directory | [Described above](#model-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create routes? + +:::note[Create routes for your CRUD operations.] + + ``` + php artisan create:routes [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:routes Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --controller-name | [Described above](#controller-name) | + | --routes-prefix | [Described above](#routes-prefix) | + | --without-route-clause | Create the routes without where clause for the id. It may be used when the primary key is not an integer | + | --for-api | Create API based routes. | + | --for-version | provide the version of the api to create the routes for. | + | --table-name | [Described above](#table-name) | + | --template-name | [Described above](#template-name) | +::: + +### How to create all standard CRUD views (i.e. Create, Read, Update and Delete)? + +> When creating views using the `create:views`, `create:create-view` or `create:update-view` an additional view called "form-view" is created. The "form-view" contains the form fields to prevent code duplication. + +:::note[Create routes for views for CRUD operations.] + + ``` + php artisan create:views [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:views Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | + | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the Create Operation? + +:::note[Create a create-view.] + + ``` + php artisan create:create-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:create-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + + +### How to create a view for the Edit Operation? + +:::note[Create an edit-view.] + + ``` + php artisan create:edit-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:edit-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the List Operation? + +:::note[Create an index-view.] + + ``` + php artisan create:index-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:index-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a view for the Display Operation? + +:::note[Create an show-view.] + + ``` + php artisan create:show-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:show-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a form-view? + +:::note[Create an form-view.] + + ``` + php artisan create:form-view [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-view Post + ``` + + | Option | Description | Default | + | ----------- | ----------- | ----------- | + | --resource-file | [Described above](#resource-file) | + | --routes-prefix | [Described above](#routes-prefix) | + | --layout-name | [Described above](#layout-name) | + | --views-directory | [Described above](#views-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a database migration? + +:::note[Create a database migration.] + + ``` + php artisan create:migration [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:migration Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --table-name | [Described above](#table-name) | + | --resource-file | [Described above](#resource-file) | + | --migration-class-name | [Described above](#migration-class-name) | + | --with-soft-delete | [Described above](#with-soft-delete) | + | --without-timestamps | [Described above](#without-timestamps) | + | --connection-name | [Described above](#connection-name) | + | --engine-name | [Described above](#engine-name) | + | --template-name | [Described above](#template-name) | + | --force | This option will override the file if it already exists. | +::: + +### How to create form-request? + +:::note[Create a form-request for request validation.] + + ``` + php artisan create:form-request [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-request Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --class-name | [Described above](#class-name) | + | --resource-file | [Described above](#resource-file) | + | --with-auth | [Described above](#with-auth) | + | --routes-prefix | [Described above](#routes-prefix) | + | --form-request-directory | [Described above](#form-request-directory) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: + +### How to create a language file? + +:::note[Create a new language file.] + + ``` + php artisan create:language [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:language Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --language-filename | [Described above](#language-filename) | + | --resource-file | [Described above](#resource-file) | + | --template-name | [Described above](#template-name) | + | --force | This option will override any file that already exist. | +::: diff --git a/docs/versioned_docs/version-3.0.0/configurations.md b/docs/versioned_docs/version-3.0.0/configurations.md new file mode 100644 index 0000000..3c0d860 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0/configurations.md @@ -0,0 +1,20 @@ +--- +sidebar_position: 5 +title: Configurations +--- + +## Configurations + +Laravel-Code-Generator ships with lots of configurable option to give you control of the generated code. It is strongly recommended that you read the comments block above each option in the config/laravel-code-generator.php file to get familiar with all available options. + +To override or extend the default settings to prevent you from losing your setting when upgrading the package. The `config/laravel-code-generator.php` is a dedicated file to store your options. This file will always be controlled by you and will never be overridden by the package. To override any configuration found in `config/laravel-code-generator.php`, simple add the same option in your custom file. The generator will look at the your configuration before falling back to the default config. Note, any array based option will be extended not overridden. + +:::info +If you like to override default settings, you may execute the following command to publish a default configuration file to `/config/laravel-code-generator.php` + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=config +``` +::: + +The most important option in the configuration file is `common_definitions`. This option allows you to set the default properties of new field using the name of that field. Your goal should be to generate 100% ready resource-file using this config. It will save you lots of time since all your fields will get generated using the desired properties. In another words, when using `resource-file:create`, `resource-file:append` or `resource-file:from-database` to create resource file, the generated JSON will be 100% ready for you without any manual modification. diff --git a/docs/versioned_docs/version-3.0.0/get-started.md b/docs/versioned_docs/version-3.0.0/get-started.md new file mode 100644 index 0000000..3925a0f --- /dev/null +++ b/docs/versioned_docs/version-3.0.0/get-started.md @@ -0,0 +1,43 @@ +--- +sidebar_position: 2 +title: Getting Started +--- + +# Getting Started + +### Installation + +1. To download this package into your Laravel project, use the command-line to execute the following command + +``` +composer require crestapps/laravel-code-generator --dev +``` + +2. (You may skip this step when using Laravel >= 5.5)** To bootstrap the packages into your project while using command-line only, open the app/Providers/AppServiceProvider.php file in your project. Then, add the following code to the `register()` method. + +``` +if ($this->app->runningInConsole()) { + $this->app->register('CrestApps\CodeGenerator\CodeGeneratorServiceProvider'); +} +``` + +#### Optional Steps + +If you like to override default settings, you may execute the following command to publish a default configuration file to `/config/laravel-code-generator.php` + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=config +``` + +If you like to override the default template, you may execute the following command to publish the default template to `/resources/laravel-code-generator/templates/default` + +``` +php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-template +``` + +### Demo + +Below a video to demonstrate how to use most of the package commands. + + + diff --git a/docs/versioned_docs/version-3.0.0/intro.md b/docs/versioned_docs/version-3.0.0/intro.md new file mode 100644 index 0000000..c2ee0c5 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0/intro.md @@ -0,0 +1,53 @@ +--- +sidebar_position: 1 +title: Introduction +--- + +## CrestApps - Laravel Code Generator + +### Introduction + +Enhance your Laravel development experience with our sophisticated code generator! This powerful tool is designed to streamline your workflow and save you valuable time. Whether you need to create views, controllers, routes, migrations, languages, or request forms, this versatile generator has got you covered – all in just seconds! + +Experience the ultimate flexibility and customization options to cater to a wide range of use cases. Our code generator comes with a cross-browser compatible template and includes client-side validation to bring a modern touch to your application. + +Explore the project's source code on [GitHub](https://github.com/CrestApps/laravel-code-generator), available under the permissive [MIT license](https://opensource.org/licenses/MIT). Upgrade your Laravel development with efficiency and style! + + +### Features + +- Craft clean, reusable, and highly readable code for seamless development. +- Generate complete resources effortlessly with a single command, supporting both migration and existing database scenarios. +- Streamline resource creation for all existing database tables with a single command. +- Save and recreate fields using a JSON file, ensuring adaptability to changing business needs. +- Leverage JSON-based resource files for easy regeneration, even when business rules evolve. +- Generate standard CRUD controllers with simple or form-request validation. +- Customize view templates to alter the standard look and feel of your application. +- Create models with relations for comprehensive data representation. +- Establish named routes with and without grouping for efficient navigation. +- Generate standard CRUD views to facilitate a consistent user experience. +- Smart migration engine tracks generated migrations to only create necessary ones. +- Intelligent handling of model relations to simplify development. +- Highly flexible with rich configurable options to suit diverse needs. +- Easy commands for resource-file creation, addition, or reduction. +- Full support for generating multi-language applications. +- Implement client-side validation for enhanced user interaction. +- Efficiently handle file uploading and store multiple responses in the database. +- Generate form-request to clean up controllers and boost code reusability. +- Create view layouts with and without client-side validation. +- Change templates at runtime for diverse view generation. +- Ability to generate views with or without Laravel-Collective integration. +- Seamless handling of date, time, or datetime fields. +- Automatic management of boolean fields for hassle-free development. + + +### Dependencies + +#### Prerequisite + + - **[Laravel >= 5.1 framework.](https://laravel.com/)** + - **[Composer](https://getcomposer.org/)** installed on your local workstation. + +#### Default template dependencies + + - **[CSS bootstrap Framework.](http://getbootstrap.com/)** This is only required with the default template. You are free to make your own template. diff --git a/docs/versioned_docs/version-3.0.0/release-notes.md b/docs/versioned_docs/version-3.0.0/release-notes.md new file mode 100644 index 0000000..36fa413 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0/release-notes.md @@ -0,0 +1,10 @@ +--- +sidebar_position: 6 +title: Release Notes +--- + +## Release Notes + +- Upgraded the default theme to use Bootstrap 5.3. +- Improved the controller templates. +- Dropped support for Laravel-Collective Template. diff --git a/docs/versioned_docs/version-3.0.0/resource-file.md b/docs/versioned_docs/version-3.0.0/resource-file.md new file mode 100644 index 0000000..52d8448 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0/resource-file.md @@ -0,0 +1,318 @@ +--- +sidebar_position: 4 +title: Resource File +--- + +## Resource Files + +A JSON based file that allows you to define how you like your resource generated. You can define your fields, indexes, and model relations. + +## Available Commands to Manage Resource Files + +The option in between the square brackets `[]` must be replaced with a variable of your choice. + - php artisan resource-file:create \[model-name\] + - php artisan resource-file:append \[model-name\] + - php artisan resource-file:reduce \[model-name\] + - php artisan resource-file:delete \[model-name\] + +### How to create resource-file? + +:::note[Create a new resource file.] + + ``` + php artisan resource-file:create [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:create Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | + | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | + | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | + | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| + | --translation-for | [Described above](#translation-for) | + | --force | This option will override any file that already exist. | +::: + +### How to add resources to existing resource-file? + +:::note[Appends a new fields, indexes, or relations to an existing resource-file. If the resource-file does not exists one will be created] + + ``` + php artisan resource-file:append Post --fields=notes,created_by + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan create:form-request Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | + | --translation-for | [Described above](#translation-for) | +::: + +### How to remove resources to existing resource-file? + + > If the resource-file becomes empty, it will automatically get deleted by calling the `resource-file:delete` command. + +:::note[Removes fields, indexes, or relations to an existing resource-file.] + + ``` + php artisan resource-file:reduce [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:reduce Post --fields=notes,created_by + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | +::: + +### How to delete existing resource-file? + +> It is recommended to use this command to delete file instead of manually deleting it. This command will also delete the mapped relation in the resource_map file. + +:::note[Delete existing resource-file. ] + + ``` + php artisan resource-file:delete [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:delete Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --fields | [Described above](#fields) | + | --relations | [Described above](#relations) | + | --indexes | [Described above](#indexes) | + | --resource-filename| [Described above](#resource-filename) | +::: + +### How to create a resource's file from existing database? + +> Are you looking to convert existing application to Laravel framework? Or, looking to use database-first instead of code-first approach? No problem! This package allows you to create a resource's file from existing database. +> +> You can easily take advantage of this feature by passing `--table-exists` option to the `create:resources` command to automatically generate all the resources from existing database's table. + +:::note[Convert your existing database into resource file, then the create:resources command is used to generate the resources] + + ``` + php artisan resource-file:from-database [model-name] + ``` + +The argument `[model-name]` should be replaced with the name of the model you are creating. For example: + + ``` + php artisan resource-file:from-database Post + ``` + + | Option | Description | + | ----------- | ----------- | + | --table-name | [Described above](#table-name) | + | --database-name | [Described above](#database-name) | + | --resource-file | [Described above](#resource-file) | + | --resource-filename| [Described above](#resource-filename) | + | --translation-for| [Described above](#translation-for) | + | --force | This option will override any file that already exist. | + +::: + + +### Fields + +> The minimum requirement for creating a field is a unique name. However, the code-generator is very flexible and allows you to have full control on the fields. Below all the available properties for defining a field + +#### HTML Properties + | Property name | Description | + | ----------- | ----------- | + | name | A unique name for the field. This is a required field. | + | label | A user-friendly title to describe the field. If this option is left out, the field's name is used to generate a title. | + | validation | You can pass any valid Laravel validation rule. The rules should be separated by bar `\|`.

    For example: `required\|string\|min:2\|max:255`

    Start with Laravel 5.5, you can define custom validation rules and pass them as well. For example, to use a custom validation rule called Uppercase in addition to the required rule, you can pass this string required|new Uppercase.

    To learn more about the valid options please visit [Laravel documentation](https://laravel.com/docs/master/validation#available-validation-rules).

    When the rule `required` is not used, the field in the migration file will automatically become nullable. | + | html-type | Default value: `text`. A valid property will be one of the following options
    `text`, `textarea`, `password`,`email`,`checkbox`,`radio`,`number`,`select`,`hidden`,`file`,`selectRange`,`selectMonth`, or `multipleSelect`.

    Note: when using file type, after the file is uploaded to the designated path, the filename is stored in the database by default. For everything to work properly, the data-type must be of some sort of a string type. Or modify the behavior of moveFile method to handle the new file.

    By default this process stores the uploaded file in the path defined in config file.

    Note: when using checkbox, or multipleSelect, the items are stored in the database as JSON string. Additionally, the items in the index or form views are displayed separated by the value provided in the delimiter property. | + | delimiter | Default value: "; ". When generating a form with checkbox or a select menu that accepts multiple answers, we need either store the results in a foreign model or store the records in a string field. By default, the code generator will convert the multiple options that a user selected into a JSON string before the results are stored using a Eloquent-mutator method.

    When the data is presented on the show and/or index views, the options are displayed separated by the value of the delimiter. Of course, you can always change this behavior to fit your needs by removing the accessor and mutator methods in the model and modifying the views accordingly. | + | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."`` property. Classes that are already set in the views will not be replaced. | + | date-format | Default value: "m/d/Y H:i A". Any field with the type date, time or datetime can be formatted different when it is displayed. You can change the display format using this option. | + | html-value | A default value to set the field to. When using multiple options based html-type like checkbox, multipleSelect you can set this property to array of values to set multiple values by default. Ex, `["Red","Green"]` | + | options | If you used select, checkbox, or radio for the html-type property, this is where you provide the options. Here are some example of the schema.

    A simple array: In this option, the value will be the numeric index value of the item in the array.
    ```"options": ["Prefer not to say","Male","Female"]```.
    Using explicit values
    ```"options": { "": Prefer not to say", "male": "Male","female": "Female"}```.
    Using multiple language phrases for each option
    ```"options": {"en":{"":"Prefer not to say","male":"Male","female":"Female"},"ar":{"":"Prefer not to say in Arabic","male":"Male in Arabic","female":"Female in Arabic"},"fr":{"":"Prefer not to say in French","male":"Male in French","female":"Female in French"}}``` | + | is-inline-options | Default value: false. If the html-type is set to radio or checkbox, setting this option to true will put the items next to each other instead of a vertical list. | + | placeholder or place-holder | You can set a placeholder value when html-type is set to text, number, email, textarea or select. | + | is-on-index | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index view. | + | is-on-form | Default value: `true`. Setting the value to `false` will prevent from adding this field to the form view. | + | is-on-show | Default value: `true`. Setting the value to `false` will prevent from adding this field to the show view. | + | is-on-views | Default value: `true`. Setting the value to `false`` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | + | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns`` in the configuration file, allow you to list the common field name to automatically set them as header. | + + #### Database Properties + | Property name | Description | + | ----------- | ----------- | + | data-type | Default is `varchar`. The database column type. The following are valid types:
    ```'char', 'date', 'datetime', 'datetimetz', 'biginteger', 'bigint', 'blob', 'binary', 'bool', 'boolean', 'decimal', 'double', 'enum', 'list', 'float', 'int', 'integer', 'ipaddress', 'json', 'jsonb', 'longtext', 'macaddress', 'mediuminteger', 'mediumint', 'mediumtext', 'morphs', 'string', 'varchar', 'nvarchar', 'text', 'time', 'timetz', 'tinyinteger', 'tinyint', 'timestamp', 'timestamptz', 'unsignedbiginteger', 'unsignedbigint', 'unsignedInteger', 'unsignedint', 'unsignedmediuminteger', 'unsignedmediumint', 'unsignedsmallinteger', 'unsignedsmallint', 'unsignedtinyinteger', 'uuid', 'uuid'```

    Note: you can add short cuts if needed to in the `laravel-code-generator.php` config file.You can add new mapping to the eloquent_type_to_method array. | + | data-type-params | This option allows you to specify parameters for the data type. Please ensure you provide valid parameters otherwise unexpected behavior will occur. For example, varchar and char will only need a maximum of one integer parameter where double, decimal and float require two integer parameters.

    Command line example with specifying a decimal precision and scale: `data-type-params=5,2`. JSON file example `"data-type-params": [5,2]`

    If this option left out while some sort of a string data-type was used along with a max validation rule, the max value is used to limit the length of the sting in the database when a migration is generated | + | data-value | Default value is null. The default value for the database column. | + | is-auto-increment | Default value is false. Setting this value to true will make this column a primary with auto increment identity. | + | is-primary | Default value is false. You can set this field as the primary for retrieving records from the database. You can only set one column as the primary. If you set multiple fields are primary, the first one will be selected and the rest will be ignored.

    Note: if you set the is-auto-increment field, this option will automatically get set. Ths only time this can be used is to create a primary field you don't wish for the database to auto assign it. | + | is-index | Default value is false. Setting this value to true will add index to this column. | + | is-unique | Default value is false. Setting this value to true will add a unique index to this column. | + | is-nullable | Default value is false. Setting this value to true will make this column nullable.

    Note: when setting this option to true, the default value will be set to NULL unless you pass a different value to data-value.

    When the validation rule contains "nullable", "required_if", "required_unless", "required_with", "required_with_all", "required_without", "required_without_all" or does NOT contains "required" rule, this flag will automatically gets set. | + | is-unsigned | Default value is false. Setting this value to true will make this column unsigned. This option should only be used with numeric types only. | + | comment | This option will allow you to add meta description of the field in the database. | + | is-data | This option will allow you to casts a data filed to a Carbon object. | + | cast-as | This option will allow you to cast a field to php's native type. | + | foreign-relation | This option will allow you to create a foreign relation between the models.

    ```json {"name":"creator","type":"belongsTo","params":["App\\User","created_by"],"field":"name"}``` | + | foreign-constraint | This option will allow you to create a foreign relation between the models.

    ```json {"field":"user_id","references":"id","on":"users","on-delete":"cascade","on-update":"cascade","references-model":"App\\Models\\User"} ``` | + | on-store | This option allows you to set a fixed value on the store action. For example, Illuminate\Support\Facades\Auth::Id(); will set the value to the current user id when the model is first created. Assuming you're using [Laravel Authentication](https://laravel.com/docs/master/authentication). | + | on-update | Similar to on-storeThis option allows you to set a fixed value on the update action. | + + +### Managing fields using JSON file + +Storing the field's specification in a JSON file enables you to easily reuse the field with multiple commands. It also allows you to recreate the resources in the future if you decided to add/remove fields after the views have been crafted. The JSON files are typically stored in /resources/laravel-generator. If you don’t like where these files are kept, you can change that path from the config/laravelgenerator.php file. + +The following command should be used to manage the resource-file to make this process easier. + + - php artisan resource-file:from-database [model-name] + - php artisan resource-file:create [model-name] + - php artisan resource-file:append [model-name] + - php artisan resource-file:reduce [model-name] + - php artisan resource-file:delete [model-name] + +### Resources mapping file + +The resources-map file, is a JSON file that is used to keep track of the fields-file and the model classes to allow you to create the resources all at once. + +The default file name is `resources_map.json` and can be changed from the configuration file. + +When using `resource-file:create`, `resource-file:from-database` or `resource-file:delete` commands, a file called resources_map.json is automatically updated. + +The following is the structure of the file. + +```json + { + { + "model-name": "Brand", + "resource-file": "brands.json" + }, + { + "model-name": "Customer", + "resource-file": "customers.json", + "table-name": "customers_table" + } +} +``` + + All option that are available to the `create:resources` can be used in the mapping file to make creating resources for all models customizable. Here is an example + + ```json + { + { + "model-name": "Customer", + "resource-file": "customers.json", + "table-name": "customers_table", + "routes-prefix" "customers_prefix" + } +} + ``` + +To generate all the resources mapped in the resources_map.json file, use the following command + +``` +php artisan create:mapped-resources [model-name] +``` + +### Generating clean and complete fields out of the box! + +When using the commands that generate fields, our goal is to generate fields configured and ready for use without having to make any change to the generated fields. + +While it is not possible to cover 100% of the use cases, Laravel-code-generator is shipped with a powerful configuration option to allow you to add conditions to handle your own use case. + +The key `common_definitions` in the `config/laravel-code-generator.php` file allows you match field name using pattern then set the properties accordingly. + +For example, you may want to add a global date, time, or datetime picker using javascript for any field where its name ends with `_at`. + +You can do that by adding the following entry + +```json +[ + 'match' => ['*_at'], + 'set' => [ + 'class' => 'datetime-picker', + ] +] +``` + +The same thing can be done for any field that ends with `_date` or starts with `date_of`` +```json +[ + 'match' => ['*_date','date_of_*'], + 'set' => [ + 'class' => 'date-picker', + ] +] +``` + +Of course, you can set any of the field's option like html-type, data-type, data-type-params or foreign relation. You can set the configuration as fits your environment, then you'll be able to create fields-file ready to generate resources with minimal work! + +The conditions are applied to each field top to bottom, the configuration at the bottom of the array will take presence over the once on the top in case multiple conditions were matched. + + +:::info +It is strongly recommended to read the comments above each option in the configuration file to help you understand and customize the generator to fit your needs! +::: + + +### Foreign Relations + +If you're using a code-first-approach and like to define relations between your models, you can easily define that in the relations keyword entry of the resource-file. Each relation can be defined using the following schema + +```json +{ + "name": "posts", // the name of the relation + "type": "hasMany", // the type of the relation + "params": [ // the parameters for the used relation. + "App\\Models\\Comment", + "post_id", + "id" + ], + "field": "name" // the name of the field on the foreign model to use as display value +} +``` +:::info +When creating `hasOne()` or `belongsTo()` relations, it be best to define them at the field level using the foreign-relation option. +Composite Indexes +::: + + +### Composite Indexes +If you're using a code-first-approach and like to define indexes with multiple columns, you can easily do that by adding these indexed to the Indexes keyword entry in the resource-file file. Each composite index can be defined using the following schema + +```json +{ + "name": "owner", // The name of the index to use, if no name is set a one will be generated. + "type": "unique", // Valid index type is one of the following 'index','unique' or 'primary'. If the type is not provided, 'index' is used. + "columns": [ // List of the columns' names to be included in the index left to right. + "first_name", + "last_name" + ] +} +``` diff --git a/docs/versioned_docs/version-3.0.0/upgrade-guide.md b/docs/versioned_docs/version-3.0.0/upgrade-guide.md new file mode 100644 index 0000000..35103f3 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0/upgrade-guide.md @@ -0,0 +1,8 @@ +--- +sidebar_position: 5 +title: Upgrade Guide +--- + +## Version + +No additional steps needed to upgrade. diff --git a/docs/versioned_sidebars/version-2.0.0-sidebars.json b/docs/versioned_sidebars/version-2.0.0-sidebars.json new file mode 100644 index 0000000..39332bf --- /dev/null +++ b/docs/versioned_sidebars/version-2.0.0-sidebars.json @@ -0,0 +1,8 @@ +{ + "docsSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/docs/versioned_sidebars/version-2.1.0-sidebars.json b/docs/versioned_sidebars/version-2.1.0-sidebars.json new file mode 100644 index 0000000..39332bf --- /dev/null +++ b/docs/versioned_sidebars/version-2.1.0-sidebars.json @@ -0,0 +1,8 @@ +{ + "docsSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/docs/versioned_sidebars/version-2.2.0-sidebars.json b/docs/versioned_sidebars/version-2.2.0-sidebars.json new file mode 100644 index 0000000..39332bf --- /dev/null +++ b/docs/versioned_sidebars/version-2.2.0-sidebars.json @@ -0,0 +1,8 @@ +{ + "docsSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/docs/versioned_sidebars/version-2.3.0-sidebars.json b/docs/versioned_sidebars/version-2.3.0-sidebars.json new file mode 100644 index 0000000..39332bf --- /dev/null +++ b/docs/versioned_sidebars/version-2.3.0-sidebars.json @@ -0,0 +1,8 @@ +{ + "docsSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/docs/versioned_sidebars/version-2.4.0-sidebars.json b/docs/versioned_sidebars/version-2.4.0-sidebars.json new file mode 100644 index 0000000..39332bf --- /dev/null +++ b/docs/versioned_sidebars/version-2.4.0-sidebars.json @@ -0,0 +1,8 @@ +{ + "docsSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/docs/versioned_sidebars/version-3.0.0-sidebars.json b/docs/versioned_sidebars/version-3.0.0-sidebars.json new file mode 100644 index 0000000..39332bf --- /dev/null +++ b/docs/versioned_sidebars/version-3.0.0-sidebars.json @@ -0,0 +1,8 @@ +{ + "docsSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/docs/versions.json b/docs/versions.json index 0d4f101..7b1c0a5 100644 --- a/docs/versions.json +++ b/docs/versions.json @@ -1,2 +1,8 @@ [ + "3.0.0", + "2.4.0", + "2.3.0", + "2.2.0", + "2.1.0", + "2.0.0" ] From 136e6a21df241814aaf6fda3c3bae3ac7600aad4 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Fri, 26 Jan 2024 17:26:16 -0800 Subject: [PATCH 13/29] Create deploy.yml --- .github/workflows/deploy.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..e587c0e --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,29 @@ +on: + push: + branches: + - master + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup Node.js + uses: actions/setup-node@v2 + with: + node-version: 18 # Use Node.js 18 here + + - name: Install dependencies + run: npm install + + - name: Build site + run: npm run build + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./build From 21840f3901ef5b22014cbcf6d3e0c57fac6148d4 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 12:43:05 -0800 Subject: [PATCH 14/29] Update deploy.yml --- .github/workflows/deploy.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e587c0e..4af7a5d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -14,7 +14,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v2 with: - node-version: 18 # Use Node.js 18 here + node-version: 18 - name: Install dependencies run: npm install @@ -22,8 +22,11 @@ jobs: - name: Build site run: npm run build - - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v3 + - name: Deploy Files + uses: SamKirkland/FTP-Deploy-Action@v4.3.4 with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./build + server: ${{ secrets.FTP_HOST }} + username: ${{ secrets.FTP_USERNAME }} + password: ${{ secrets.FTP_PASSWORD }} + local-dir: ./build/ + From cfd68d520aa23e3d888806e36cdf8296ba298863 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 12:53:50 -0800 Subject: [PATCH 15/29] Update deploy.yml --- .github/workflows/deploy.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 4af7a5d..7a9e64e 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -9,18 +9,20 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v2 with: - node-version: 18 + node-version: 20 - name: Install dependencies run: npm install + working-directory: ./build - name: Build site run: npm run build + working-directory: ./build - name: Deploy Files uses: SamKirkland/FTP-Deploy-Action@v4.3.4 From b66ad72587fccedc80aeed12f46f493d9b90fc90 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 12:56:48 -0800 Subject: [PATCH 16/29] Update deploy.yml --- .github/workflows/deploy.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7a9e64e..5c70463 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -12,17 +12,15 @@ jobs: uses: actions/checkout@v4 - name: Setup Node.js - uses: actions/setup-node@v2 - with: - node-version: 20 + uses: actions/setup-node@v4 - name: Install dependencies run: npm install - working-directory: ./build + working-directory: ./docs - name: Build site run: npm run build - working-directory: ./build + working-directory: ./docs - name: Deploy Files uses: SamKirkland/FTP-Deploy-Action@v4.3.4 From 5fbc8745940aa4cd5c0d41068ae3bb8c3634985e Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 13:03:22 -0800 Subject: [PATCH 17/29] fix doc links --- docs/docusaurus.config.js | 2 +- docs/versioned_docs/version-2.2.0/intro.md | 2 +- docs/versioned_docs/version-2.3.0/intro.md | 2 +- docs/versioned_docs/version-2.4.0/intro.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index b714de4..8701c85 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -13,7 +13,7 @@ const config = { favicon: 'img/favicon.ico', // Set the production url of your site here - url: 'https://www.crestapps.com', + url: 'https://laravel-code-generator.crestapps.com', // Set the // pathname under which your site is served // For GitHub pages deployment, it is often '//' baseUrl: '/', diff --git a/docs/versioned_docs/version-2.2.0/intro.md b/docs/versioned_docs/version-2.2.0/intro.md index 8523b27..b8a6e7a 100644 --- a/docs/versioned_docs/version-2.2.0/intro.md +++ b/docs/versioned_docs/version-2.2.0/intro.md @@ -59,4 +59,4 @@ Explore the project's source code on [GitHub](https://github.com/CrestApps/larav #### (Optional) Using Laravel-Collective -Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](using-laravel-collective.md) +Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](./using-laravel-collective) diff --git a/docs/versioned_docs/version-2.3.0/intro.md b/docs/versioned_docs/version-2.3.0/intro.md index 8523b27..b8a6e7a 100644 --- a/docs/versioned_docs/version-2.3.0/intro.md +++ b/docs/versioned_docs/version-2.3.0/intro.md @@ -59,4 +59,4 @@ Explore the project's source code on [GitHub](https://github.com/CrestApps/larav #### (Optional) Using Laravel-Collective -Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](using-laravel-collective.md) +Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](./using-laravel-collective) diff --git a/docs/versioned_docs/version-2.4.0/intro.md b/docs/versioned_docs/version-2.4.0/intro.md index 8523b27..b8a6e7a 100644 --- a/docs/versioned_docs/version-2.4.0/intro.md +++ b/docs/versioned_docs/version-2.4.0/intro.md @@ -59,4 +59,4 @@ Explore the project's source code on [GitHub](https://github.com/CrestApps/larav #### (Optional) Using Laravel-Collective -Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](using-laravel-collective.md) +Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](./using-laravel-collective) From 7ab182e6f7ca12ebee8e2c1c716499a201b9abac Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 13:42:47 -0800 Subject: [PATCH 18/29] fix doc links --- docs/docs/available-commands.md | 60 +++++++++---------- docs/docs/resource-file.md | 14 ++--- .../version-2.0.0/available-commands.md | 58 +++++++++--------- docs/versioned_docs/version-2.0.0/intro.md | 2 +- .../version-2.0.0/laravel-collective.md | 2 +- .../version-2.0.0/resource-file.md | 14 ++--- .../version-2.1.0/available-commands.md | 58 +++++++++--------- docs/versioned_docs/version-2.1.0/intro.md | 2 +- .../version-2.1.0/resource-file.md | 14 ++--- .../version-2.2.0/available-commands.md | 58 +++++++++--------- docs/versioned_docs/version-2.2.0/intro.md | 2 +- .../version-2.2.0/resource-file.md | 14 ++--- .../version-2.3.0/available-commands.md | 58 +++++++++--------- docs/versioned_docs/version-2.3.0/intro.md | 2 +- .../version-2.3.0/resource-file.md | 14 ++--- .../version-2.4.0/available-commands.md | 60 +++++++++---------- docs/versioned_docs/version-2.4.0/intro.md | 2 +- .../version-2.4.0/resource-file.md | 14 ++--- .../version-3.0.0/available-commands.md | 60 +++++++++---------- .../version-3.0.0/resource-file.md | 14 ++--- 20 files changed, 261 insertions(+), 261 deletions(-) diff --git a/docs/docs/available-commands.md b/docs/docs/available-commands.md index 5b420d5..5f691e5 100644 --- a/docs/docs/available-commands.md +++ b/docs/docs/available-commands.md @@ -196,7 +196,7 @@ All examples below assumes that you already created a [resource-file](./resource | ----------- | ----------- | ----------- | | --layout-filename | The name of the layout file to be used. | `app` (i.e, creates `app.blade.php`) | | --layout-directory | The directory to create the layout under. | `layouts` | - | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | + | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | | --force | This option will override the layout if one already exists. | | ::: @@ -218,29 +218,29 @@ All examples below assumes that you already created a [resource-file](./resource | Option | Description | Default | | ----------- | ----------- | ----------- | - | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | - | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | - | --controller-extends | Specify which class should the controller extends. Note: the default value is can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `default-controller` which means use the settings from the configurations by default `Http\Controllers\Controller` | - | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | - | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | - | --models-per-page | How many models to show per page on the index view. | `25` | - | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | - | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | - | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | - | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | - | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | - | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | - | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | - | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | - | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | - | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | - | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | - | --engine-name | A specific engine name for the database's table can be provided here. | | - | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | - | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | - | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | - | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | - | --fields | [Described below](#fields) | | + | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | + | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | + | --controller-extends | Specify which class should the controller extends. Note: the default value is can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `default-controller` which means use the settings from the configurations by default `Http\Controllers\Controller` | + | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | + | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | + | --models-per-page | How many models to show per page on the index view. | `25` | + | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | + | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | + | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | + | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | + | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | + | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | + | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | + | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | + | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | + | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | + | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | + | --engine-name | A specific engine name for the database's table can be provided here. | | + | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | + | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | + | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | + | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --fields | [Described here](./resource-file#fields) | | | --template-name | [Described above](#template-name) | | | --force | This option will override the layout if one already exists. | | ::: @@ -262,7 +262,7 @@ When using `resource-file:create`, `resource-file:from-database` or `resource-fi | --with-auth | [Described above](#with-auth) | | --models-per-page | [Described above](#models-per-page) | | --with-form-request | [Described above](#with-form-request) | - | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | + | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | | --form-request-directory | [Described above](#form-request-directory) | | --table-exists | [Described above](#table-exists) | | --translation-for | [Described above](#translation-for) | @@ -309,9 +309,9 @@ The argument `[model-name]` should be replaced with the name of the model you ar | --form-request-directory | [Described above](#form-request-directory) | | --model-directory | [Described above](#model-directory) | | --views-directory | [Described above](#views-directory) | - | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | - | --without-model | Allow you to create all the resources excluding the model. | - | --without-views | Allow you to create all the resources excluding the views. | + | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | + | --without-model | Allow you to create all the resources excluding the model. | + | --without-views | Allow you to create all the resources excluding the views. | | --template-name | [Described above](#template-name) | | --force | This option will override any file that already exist. | ::: @@ -390,8 +390,8 @@ The argument `[model-name]` should be replaced with the name of the model you ar | ----------- | ----------- | ----------- | | --resource-file | [Described above](#resource-file) | | --routes-prefix | [Described above](#routes-prefix) | - | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | - | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | + | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | + | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | | --views-directory | [Described above](#views-directory) | | --template-name | [Described above](#template-name) | | --force | This option will override any file that already exist. | diff --git a/docs/docs/resource-file.md b/docs/docs/resource-file.md index 52d8448..1de5a7d 100644 --- a/docs/docs/resource-file.md +++ b/docs/docs/resource-file.md @@ -31,10 +31,10 @@ The argument `[model-name]` should be replaced with the name of the model you ar | Option | Description | | ----------- | ----------- | - | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | - | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | - | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | - | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| + | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | + | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | + | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | + | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| | --translation-for | [Described above](#translation-for) | | --force | This option will override any file that already exist. | ::: @@ -152,7 +152,7 @@ The argument `[model-name]` should be replaced with the name of the model you ar | validation | You can pass any valid Laravel validation rule. The rules should be separated by bar `\|`.

    For example: `required\|string\|min:2\|max:255`

    Start with Laravel 5.5, you can define custom validation rules and pass them as well. For example, to use a custom validation rule called Uppercase in addition to the required rule, you can pass this string required|new Uppercase.

    To learn more about the valid options please visit [Laravel documentation](https://laravel.com/docs/master/validation#available-validation-rules).

    When the rule `required` is not used, the field in the migration file will automatically become nullable. | | html-type | Default value: `text`. A valid property will be one of the following options
    `text`, `textarea`, `password`,`email`,`checkbox`,`radio`,`number`,`select`,`hidden`,`file`,`selectRange`,`selectMonth`, or `multipleSelect`.

    Note: when using file type, after the file is uploaded to the designated path, the filename is stored in the database by default. For everything to work properly, the data-type must be of some sort of a string type. Or modify the behavior of moveFile method to handle the new file.

    By default this process stores the uploaded file in the path defined in config file.

    Note: when using checkbox, or multipleSelect, the items are stored in the database as JSON string. Additionally, the items in the index or form views are displayed separated by the value provided in the delimiter property. | | delimiter | Default value: "; ". When generating a form with checkbox or a select menu that accepts multiple answers, we need either store the results in a foreign model or store the records in a string field. By default, the code generator will convert the multiple options that a user selected into a JSON string before the results are stored using a Eloquent-mutator method.

    When the data is presented on the show and/or index views, the options are displayed separated by the value of the delimiter. Of course, you can always change this behavior to fit your needs by removing the accessor and mutator methods in the model and modifying the views accordingly. | - | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."`` property. Classes that are already set in the views will not be replaced. | + | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."` property. Classes that are already set in the views will not be replaced. | | date-format | Default value: "m/d/Y H:i A". Any field with the type date, time or datetime can be formatted different when it is displayed. You can change the display format using this option. | | html-value | A default value to set the field to. When using multiple options based html-type like checkbox, multipleSelect you can set this property to array of values to set multiple values by default. Ex, `["Red","Green"]` | | options | If you used select, checkbox, or radio for the html-type property, this is where you provide the options. Here are some example of the schema.

    A simple array: In this option, the value will be the numeric index value of the item in the array.
    ```"options": ["Prefer not to say","Male","Female"]```.
    Using explicit values
    ```"options": { "": Prefer not to say", "male": "Male","female": "Female"}```.
    Using multiple language phrases for each option
    ```"options": {"en":{"":"Prefer not to say","male":"Male","female":"Female"},"ar":{"":"Prefer not to say in Arabic","male":"Male in Arabic","female":"Female in Arabic"},"fr":{"":"Prefer not to say in French","male":"Male in French","female":"Female in French"}}``` | @@ -161,8 +161,8 @@ The argument `[model-name]` should be replaced with the name of the model you ar | is-on-index | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index view. | | is-on-form | Default value: `true`. Setting the value to `false` will prevent from adding this field to the form view. | | is-on-show | Default value: `true`. Setting the value to `false` will prevent from adding this field to the show view. | - | is-on-views | Default value: `true`. Setting the value to `false`` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | - | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns`` in the configuration file, allow you to list the common field name to automatically set them as header. | + | is-on-views | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | + | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns` in the configuration file, allow you to list the common field name to automatically set them as header. | #### Database Properties | Property name | Description | diff --git a/docs/versioned_docs/version-2.0.0/available-commands.md b/docs/versioned_docs/version-2.0.0/available-commands.md index 8ea9488..1dfcf63 100644 --- a/docs/versioned_docs/version-2.0.0/available-commands.md +++ b/docs/versioned_docs/version-2.0.0/available-commands.md @@ -183,7 +183,7 @@ All examples below assumes that you already created a [resource-file](./resource | ----------- | ----------- | ----------- | | --layout-filename | The name of the layout file to be used. | `app` (i.e, creates `app.blade.php`) | | --layout-directory | The directory to create the layout under. | `layouts` | - | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | + | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | | --force | This option will override the layout if one already exists. | | ::: @@ -205,28 +205,28 @@ All examples below assumes that you already created a [resource-file](./resource | Option | Description | Default | | ----------- | ----------- | ----------- | - | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | - | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | - | --controller-extends | Specify which class should the controller extends. Note: the default value can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `Http\Controllers\Controller` | - | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | - | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | - | --models-per-page | How many models to show per page on the index view. | `25` | - | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | - | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | - | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | - | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | - | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | - | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | - | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | - | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | - | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | - | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | - | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | - | --engine-name | A specific engine name for the database's table can be provided here. | | - | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | - | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | - | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | - | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | + | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | + | --controller-extends | Specify which class should the controller extends. Note: the default value can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `Http\Controllers\Controller` | + | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | + | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | + | --models-per-page | How many models to show per page on the index view. | `25` | + | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | + | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | + | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | + | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | + | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | + | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | + | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | + | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | + | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | + | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | + | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | + | --engine-name | A specific engine name for the database's table can be provided here. | | + | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | + | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | + | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | + | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | | --template-name | [Described above](#template-name) | | | --force | This option will override the layout if one already exists. | | @@ -249,7 +249,7 @@ When using `resource-file:create`, `resource-file:from-database` or `resource-fi | --with-auth | [Described above](#with-auth) | | --models-per-page | [Described above](#models-per-page) | | --with-form-request | [Described above](#with-form-request) | - | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | + | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | | --form-request-directory | [Described above](#form-request-directory) | | --table-exists | [Described above](#table-exists) | | --translation-for | [Described above](#translation-for) | @@ -296,9 +296,9 @@ The argument `[model-name]` should be replaced with the name of the model you ar | --form-request-directory | [Described above](#form-request-directory) | | --model-directory | [Described above](#model-directory) | | --views-directory | [Described above](#views-directory) | - | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | - | --without-model | Allow you to create all the resources excluding the model. | - | --without-views | Allow you to create all the resources excluding the views. | + | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | + | --without-model | Allow you to create all the resources excluding the model. | + | --without-views | Allow you to create all the resources excluding the views. | | --template-name | [Described above](#template-name) | | --force | This option will override any file that already exist. | ::: @@ -374,8 +374,8 @@ The argument `[model-name]` should be replaced with the name of the model you ar | ----------- | ----------- | ----------- | | --resource-file | [Described above](#resource-file) | | --routes-prefix | [Described above](#routes-prefix) | - | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | - | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | + | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | + | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | | --views-directory | [Described above](#views-directory) | | --template-name | [Described above](#template-name) | | --force | This option will override any file that already exist. | diff --git a/docs/versioned_docs/version-2.0.0/intro.md b/docs/versioned_docs/version-2.0.0/intro.md index 8523b27..38977fc 100644 --- a/docs/versioned_docs/version-2.0.0/intro.md +++ b/docs/versioned_docs/version-2.0.0/intro.md @@ -59,4 +59,4 @@ Explore the project's source code on [GitHub](https://github.com/CrestApps/larav #### (Optional) Using Laravel-Collective -Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](using-laravel-collective.md) +Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](./laravel-collective) diff --git a/docs/versioned_docs/version-2.0.0/laravel-collective.md b/docs/versioned_docs/version-2.0.0/laravel-collective.md index a19e9aa..6da44cc 100644 --- a/docs/versioned_docs/version-2.0.0/laravel-collective.md +++ b/docs/versioned_docs/version-2.0.0/laravel-collective.md @@ -23,7 +23,7 @@ There are two ways to generate views using Laravel-Collective - Via the package configuration - > Open the config file of the package /config/codegenerator.php change the value of the key template to default-collective + > Open the config file of the package `/config/codegenerator.php` change the value of the key template to default-collective - Or, via command-line diff --git a/docs/versioned_docs/version-2.0.0/resource-file.md b/docs/versioned_docs/version-2.0.0/resource-file.md index 52d8448..1de5a7d 100644 --- a/docs/versioned_docs/version-2.0.0/resource-file.md +++ b/docs/versioned_docs/version-2.0.0/resource-file.md @@ -31,10 +31,10 @@ The argument `[model-name]` should be replaced with the name of the model you ar | Option | Description | | ----------- | ----------- | - | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | - | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | - | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | - | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| + | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | + | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | + | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | + | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| | --translation-for | [Described above](#translation-for) | | --force | This option will override any file that already exist. | ::: @@ -152,7 +152,7 @@ The argument `[model-name]` should be replaced with the name of the model you ar | validation | You can pass any valid Laravel validation rule. The rules should be separated by bar `\|`.

    For example: `required\|string\|min:2\|max:255`

    Start with Laravel 5.5, you can define custom validation rules and pass them as well. For example, to use a custom validation rule called Uppercase in addition to the required rule, you can pass this string required|new Uppercase.

    To learn more about the valid options please visit [Laravel documentation](https://laravel.com/docs/master/validation#available-validation-rules).

    When the rule `required` is not used, the field in the migration file will automatically become nullable. | | html-type | Default value: `text`. A valid property will be one of the following options
    `text`, `textarea`, `password`,`email`,`checkbox`,`radio`,`number`,`select`,`hidden`,`file`,`selectRange`,`selectMonth`, or `multipleSelect`.

    Note: when using file type, after the file is uploaded to the designated path, the filename is stored in the database by default. For everything to work properly, the data-type must be of some sort of a string type. Or modify the behavior of moveFile method to handle the new file.

    By default this process stores the uploaded file in the path defined in config file.

    Note: when using checkbox, or multipleSelect, the items are stored in the database as JSON string. Additionally, the items in the index or form views are displayed separated by the value provided in the delimiter property. | | delimiter | Default value: "; ". When generating a form with checkbox or a select menu that accepts multiple answers, we need either store the results in a foreign model or store the records in a string field. By default, the code generator will convert the multiple options that a user selected into a JSON string before the results are stored using a Eloquent-mutator method.

    When the data is presented on the show and/or index views, the options are displayed separated by the value of the delimiter. Of course, you can always change this behavior to fit your needs by removing the accessor and mutator methods in the model and modifying the views accordingly. | - | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."`` property. Classes that are already set in the views will not be replaced. | + | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."` property. Classes that are already set in the views will not be replaced. | | date-format | Default value: "m/d/Y H:i A". Any field with the type date, time or datetime can be formatted different when it is displayed. You can change the display format using this option. | | html-value | A default value to set the field to. When using multiple options based html-type like checkbox, multipleSelect you can set this property to array of values to set multiple values by default. Ex, `["Red","Green"]` | | options | If you used select, checkbox, or radio for the html-type property, this is where you provide the options. Here are some example of the schema.

    A simple array: In this option, the value will be the numeric index value of the item in the array.
    ```"options": ["Prefer not to say","Male","Female"]```.
    Using explicit values
    ```"options": { "": Prefer not to say", "male": "Male","female": "Female"}```.
    Using multiple language phrases for each option
    ```"options": {"en":{"":"Prefer not to say","male":"Male","female":"Female"},"ar":{"":"Prefer not to say in Arabic","male":"Male in Arabic","female":"Female in Arabic"},"fr":{"":"Prefer not to say in French","male":"Male in French","female":"Female in French"}}``` | @@ -161,8 +161,8 @@ The argument `[model-name]` should be replaced with the name of the model you ar | is-on-index | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index view. | | is-on-form | Default value: `true`. Setting the value to `false` will prevent from adding this field to the form view. | | is-on-show | Default value: `true`. Setting the value to `false` will prevent from adding this field to the show view. | - | is-on-views | Default value: `true`. Setting the value to `false`` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | - | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns`` in the configuration file, allow you to list the common field name to automatically set them as header. | + | is-on-views | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | + | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns` in the configuration file, allow you to list the common field name to automatically set them as header. | #### Database Properties | Property name | Description | diff --git a/docs/versioned_docs/version-2.1.0/available-commands.md b/docs/versioned_docs/version-2.1.0/available-commands.md index 8ea9488..743c613 100644 --- a/docs/versioned_docs/version-2.1.0/available-commands.md +++ b/docs/versioned_docs/version-2.1.0/available-commands.md @@ -183,7 +183,7 @@ All examples below assumes that you already created a [resource-file](./resource | ----------- | ----------- | ----------- | | --layout-filename | The name of the layout file to be used. | `app` (i.e, creates `app.blade.php`) | | --layout-directory | The directory to create the layout under. | `layouts` | - | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | + | --c | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | | --force | This option will override the layout if one already exists. | | ::: @@ -205,28 +205,28 @@ All examples below assumes that you already created a [resource-file](./resource | Option | Description | Default | | ----------- | ----------- | ----------- | - | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | - | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | - | --controller-extends | Specify which class should the controller extends. Note: the default value can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `Http\Controllers\Controller` | - | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | - | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | - | --models-per-page | How many models to show per page on the index view. | `25` | - | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | - | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | - | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | - | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | - | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | - | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | - | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | - | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | - | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | - | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | - | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | - | --engine-name | A specific engine name for the database's table can be provided here. | | - | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | - | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | - | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | - | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | + | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | + | --controller-extends | Specify which class should the controller extends. Note: the default value can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `Http\Controllers\Controller` | + | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | + | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | + | --models-per-page | How many models to show per page on the index view. | `25` | + | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | + | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | + | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | + | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | + | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | + | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | + | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | + | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | + | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | + | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | + | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | + | --engine-name | A specific engine name for the database's table can be provided here. | | + | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | + | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | + | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | + | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | | --template-name | [Described above](#template-name) | | | --force | This option will override the layout if one already exists. | | @@ -249,7 +249,7 @@ When using `resource-file:create`, `resource-file:from-database` or `resource-fi | --with-auth | [Described above](#with-auth) | | --models-per-page | [Described above](#models-per-page) | | --with-form-request | [Described above](#with-form-request) | - | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | + | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | | --form-request-directory | [Described above](#form-request-directory) | | --table-exists | [Described above](#table-exists) | | --translation-for | [Described above](#translation-for) | @@ -296,9 +296,9 @@ The argument `[model-name]` should be replaced with the name of the model you ar | --form-request-directory | [Described above](#form-request-directory) | | --model-directory | [Described above](#model-directory) | | --views-directory | [Described above](#views-directory) | - | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | - | --without-model | Allow you to create all the resources excluding the model. | - | --without-views | Allow you to create all the resources excluding the views. | + | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | + | --without-model | Allow you to create all the resources excluding the model. | + | --without-views | Allow you to create all the resources excluding the views. | | --template-name | [Described above](#template-name) | | --force | This option will override any file that already exist. | ::: @@ -374,8 +374,8 @@ The argument `[model-name]` should be replaced with the name of the model you ar | ----------- | ----------- | ----------- | | --resource-file | [Described above](#resource-file) | | --routes-prefix | [Described above](#routes-prefix) | - | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | - | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | + | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | + | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | | --views-directory | [Described above](#views-directory) | | --template-name | [Described above](#template-name) | | --force | This option will override any file that already exist. | diff --git a/docs/versioned_docs/version-2.1.0/intro.md b/docs/versioned_docs/version-2.1.0/intro.md index 8523b27..38977fc 100644 --- a/docs/versioned_docs/version-2.1.0/intro.md +++ b/docs/versioned_docs/version-2.1.0/intro.md @@ -59,4 +59,4 @@ Explore the project's source code on [GitHub](https://github.com/CrestApps/larav #### (Optional) Using Laravel-Collective -Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](using-laravel-collective.md) +Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](./laravel-collective) diff --git a/docs/versioned_docs/version-2.1.0/resource-file.md b/docs/versioned_docs/version-2.1.0/resource-file.md index 52d8448..1de5a7d 100644 --- a/docs/versioned_docs/version-2.1.0/resource-file.md +++ b/docs/versioned_docs/version-2.1.0/resource-file.md @@ -31,10 +31,10 @@ The argument `[model-name]` should be replaced with the name of the model you ar | Option | Description | | ----------- | ----------- | - | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | - | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | - | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | - | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| + | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | + | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | + | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | + | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| | --translation-for | [Described above](#translation-for) | | --force | This option will override any file that already exist. | ::: @@ -152,7 +152,7 @@ The argument `[model-name]` should be replaced with the name of the model you ar | validation | You can pass any valid Laravel validation rule. The rules should be separated by bar `\|`.

    For example: `required\|string\|min:2\|max:255`

    Start with Laravel 5.5, you can define custom validation rules and pass them as well. For example, to use a custom validation rule called Uppercase in addition to the required rule, you can pass this string required|new Uppercase.

    To learn more about the valid options please visit [Laravel documentation](https://laravel.com/docs/master/validation#available-validation-rules).

    When the rule `required` is not used, the field in the migration file will automatically become nullable. | | html-type | Default value: `text`. A valid property will be one of the following options
    `text`, `textarea`, `password`,`email`,`checkbox`,`radio`,`number`,`select`,`hidden`,`file`,`selectRange`,`selectMonth`, or `multipleSelect`.

    Note: when using file type, after the file is uploaded to the designated path, the filename is stored in the database by default. For everything to work properly, the data-type must be of some sort of a string type. Or modify the behavior of moveFile method to handle the new file.

    By default this process stores the uploaded file in the path defined in config file.

    Note: when using checkbox, or multipleSelect, the items are stored in the database as JSON string. Additionally, the items in the index or form views are displayed separated by the value provided in the delimiter property. | | delimiter | Default value: "; ". When generating a form with checkbox or a select menu that accepts multiple answers, we need either store the results in a foreign model or store the records in a string field. By default, the code generator will convert the multiple options that a user selected into a JSON string before the results are stored using a Eloquent-mutator method.

    When the data is presented on the show and/or index views, the options are displayed separated by the value of the delimiter. Of course, you can always change this behavior to fit your needs by removing the accessor and mutator methods in the model and modifying the views accordingly. | - | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."`` property. Classes that are already set in the views will not be replaced. | + | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."` property. Classes that are already set in the views will not be replaced. | | date-format | Default value: "m/d/Y H:i A". Any field with the type date, time or datetime can be formatted different when it is displayed. You can change the display format using this option. | | html-value | A default value to set the field to. When using multiple options based html-type like checkbox, multipleSelect you can set this property to array of values to set multiple values by default. Ex, `["Red","Green"]` | | options | If you used select, checkbox, or radio for the html-type property, this is where you provide the options. Here are some example of the schema.

    A simple array: In this option, the value will be the numeric index value of the item in the array.
    ```"options": ["Prefer not to say","Male","Female"]```.
    Using explicit values
    ```"options": { "": Prefer not to say", "male": "Male","female": "Female"}```.
    Using multiple language phrases for each option
    ```"options": {"en":{"":"Prefer not to say","male":"Male","female":"Female"},"ar":{"":"Prefer not to say in Arabic","male":"Male in Arabic","female":"Female in Arabic"},"fr":{"":"Prefer not to say in French","male":"Male in French","female":"Female in French"}}``` | @@ -161,8 +161,8 @@ The argument `[model-name]` should be replaced with the name of the model you ar | is-on-index | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index view. | | is-on-form | Default value: `true`. Setting the value to `false` will prevent from adding this field to the form view. | | is-on-show | Default value: `true`. Setting the value to `false` will prevent from adding this field to the show view. | - | is-on-views | Default value: `true`. Setting the value to `false`` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | - | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns`` in the configuration file, allow you to list the common field name to automatically set them as header. | + | is-on-views | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | + | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns` in the configuration file, allow you to list the common field name to automatically set them as header. | #### Database Properties | Property name | Description | diff --git a/docs/versioned_docs/version-2.2.0/available-commands.md b/docs/versioned_docs/version-2.2.0/available-commands.md index 8ea9488..1dfcf63 100644 --- a/docs/versioned_docs/version-2.2.0/available-commands.md +++ b/docs/versioned_docs/version-2.2.0/available-commands.md @@ -183,7 +183,7 @@ All examples below assumes that you already created a [resource-file](./resource | ----------- | ----------- | ----------- | | --layout-filename | The name of the layout file to be used. | `app` (i.e, creates `app.blade.php`) | | --layout-directory | The directory to create the layout under. | `layouts` | - | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | + | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | | --force | This option will override the layout if one already exists. | | ::: @@ -205,28 +205,28 @@ All examples below assumes that you already created a [resource-file](./resource | Option | Description | Default | | ----------- | ----------- | ----------- | - | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | - | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | - | --controller-extends | Specify which class should the controller extends. Note: the default value can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `Http\Controllers\Controller` | - | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | - | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | - | --models-per-page | How many models to show per page on the index view. | `25` | - | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | - | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | - | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | - | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | - | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | - | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | - | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | - | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | - | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | - | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | - | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | - | --engine-name | A specific engine name for the database's table can be provided here. | | - | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | - | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | - | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | - | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | + | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | + | --controller-extends | Specify which class should the controller extends. Note: the default value can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `Http\Controllers\Controller` | + | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | + | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | + | --models-per-page | How many models to show per page on the index view. | `25` | + | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | + | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | + | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | + | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | + | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | + | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | + | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | + | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | + | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | + | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | + | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | + | --engine-name | A specific engine name for the database's table can be provided here. | | + | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | + | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | + | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | + | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | | --template-name | [Described above](#template-name) | | | --force | This option will override the layout if one already exists. | | @@ -249,7 +249,7 @@ When using `resource-file:create`, `resource-file:from-database` or `resource-fi | --with-auth | [Described above](#with-auth) | | --models-per-page | [Described above](#models-per-page) | | --with-form-request | [Described above](#with-form-request) | - | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | + | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | | --form-request-directory | [Described above](#form-request-directory) | | --table-exists | [Described above](#table-exists) | | --translation-for | [Described above](#translation-for) | @@ -296,9 +296,9 @@ The argument `[model-name]` should be replaced with the name of the model you ar | --form-request-directory | [Described above](#form-request-directory) | | --model-directory | [Described above](#model-directory) | | --views-directory | [Described above](#views-directory) | - | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | - | --without-model | Allow you to create all the resources excluding the model. | - | --without-views | Allow you to create all the resources excluding the views. | + | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | + | --without-model | Allow you to create all the resources excluding the model. | + | --without-views | Allow you to create all the resources excluding the views. | | --template-name | [Described above](#template-name) | | --force | This option will override any file that already exist. | ::: @@ -374,8 +374,8 @@ The argument `[model-name]` should be replaced with the name of the model you ar | ----------- | ----------- | ----------- | | --resource-file | [Described above](#resource-file) | | --routes-prefix | [Described above](#routes-prefix) | - | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | - | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | + | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | + | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | | --views-directory | [Described above](#views-directory) | | --template-name | [Described above](#template-name) | | --force | This option will override any file that already exist. | diff --git a/docs/versioned_docs/version-2.2.0/intro.md b/docs/versioned_docs/version-2.2.0/intro.md index b8a6e7a..38977fc 100644 --- a/docs/versioned_docs/version-2.2.0/intro.md +++ b/docs/versioned_docs/version-2.2.0/intro.md @@ -59,4 +59,4 @@ Explore the project's source code on [GitHub](https://github.com/CrestApps/larav #### (Optional) Using Laravel-Collective -Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](./using-laravel-collective) +Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](./laravel-collective) diff --git a/docs/versioned_docs/version-2.2.0/resource-file.md b/docs/versioned_docs/version-2.2.0/resource-file.md index 52d8448..1de5a7d 100644 --- a/docs/versioned_docs/version-2.2.0/resource-file.md +++ b/docs/versioned_docs/version-2.2.0/resource-file.md @@ -31,10 +31,10 @@ The argument `[model-name]` should be replaced with the name of the model you ar | Option | Description | | ----------- | ----------- | - | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | - | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | - | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | - | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| + | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | + | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | + | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | + | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| | --translation-for | [Described above](#translation-for) | | --force | This option will override any file that already exist. | ::: @@ -152,7 +152,7 @@ The argument `[model-name]` should be replaced with the name of the model you ar | validation | You can pass any valid Laravel validation rule. The rules should be separated by bar `\|`.

    For example: `required\|string\|min:2\|max:255`

    Start with Laravel 5.5, you can define custom validation rules and pass them as well. For example, to use a custom validation rule called Uppercase in addition to the required rule, you can pass this string required|new Uppercase.

    To learn more about the valid options please visit [Laravel documentation](https://laravel.com/docs/master/validation#available-validation-rules).

    When the rule `required` is not used, the field in the migration file will automatically become nullable. | | html-type | Default value: `text`. A valid property will be one of the following options
    `text`, `textarea`, `password`,`email`,`checkbox`,`radio`,`number`,`select`,`hidden`,`file`,`selectRange`,`selectMonth`, or `multipleSelect`.

    Note: when using file type, after the file is uploaded to the designated path, the filename is stored in the database by default. For everything to work properly, the data-type must be of some sort of a string type. Or modify the behavior of moveFile method to handle the new file.

    By default this process stores the uploaded file in the path defined in config file.

    Note: when using checkbox, or multipleSelect, the items are stored in the database as JSON string. Additionally, the items in the index or form views are displayed separated by the value provided in the delimiter property. | | delimiter | Default value: "; ". When generating a form with checkbox or a select menu that accepts multiple answers, we need either store the results in a foreign model or store the records in a string field. By default, the code generator will convert the multiple options that a user selected into a JSON string before the results are stored using a Eloquent-mutator method.

    When the data is presented on the show and/or index views, the options are displayed separated by the value of the delimiter. Of course, you can always change this behavior to fit your needs by removing the accessor and mutator methods in the model and modifying the views accordingly. | - | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."`` property. Classes that are already set in the views will not be replaced. | + | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."` property. Classes that are already set in the views will not be replaced. | | date-format | Default value: "m/d/Y H:i A". Any field with the type date, time or datetime can be formatted different when it is displayed. You can change the display format using this option. | | html-value | A default value to set the field to. When using multiple options based html-type like checkbox, multipleSelect you can set this property to array of values to set multiple values by default. Ex, `["Red","Green"]` | | options | If you used select, checkbox, or radio for the html-type property, this is where you provide the options. Here are some example of the schema.

    A simple array: In this option, the value will be the numeric index value of the item in the array.
    ```"options": ["Prefer not to say","Male","Female"]```.
    Using explicit values
    ```"options": { "": Prefer not to say", "male": "Male","female": "Female"}```.
    Using multiple language phrases for each option
    ```"options": {"en":{"":"Prefer not to say","male":"Male","female":"Female"},"ar":{"":"Prefer not to say in Arabic","male":"Male in Arabic","female":"Female in Arabic"},"fr":{"":"Prefer not to say in French","male":"Male in French","female":"Female in French"}}``` | @@ -161,8 +161,8 @@ The argument `[model-name]` should be replaced with the name of the model you ar | is-on-index | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index view. | | is-on-form | Default value: `true`. Setting the value to `false` will prevent from adding this field to the form view. | | is-on-show | Default value: `true`. Setting the value to `false` will prevent from adding this field to the show view. | - | is-on-views | Default value: `true`. Setting the value to `false`` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | - | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns`` in the configuration file, allow you to list the common field name to automatically set them as header. | + | is-on-views | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | + | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns` in the configuration file, allow you to list the common field name to automatically set them as header. | #### Database Properties | Property name | Description | diff --git a/docs/versioned_docs/version-2.3.0/available-commands.md b/docs/versioned_docs/version-2.3.0/available-commands.md index 8ea9488..1dfcf63 100644 --- a/docs/versioned_docs/version-2.3.0/available-commands.md +++ b/docs/versioned_docs/version-2.3.0/available-commands.md @@ -183,7 +183,7 @@ All examples below assumes that you already created a [resource-file](./resource | ----------- | ----------- | ----------- | | --layout-filename | The name of the layout file to be used. | `app` (i.e, creates `app.blade.php`) | | --layout-directory | The directory to create the layout under. | `layouts` | - | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | + | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | | --force | This option will override the layout if one already exists. | | ::: @@ -205,28 +205,28 @@ All examples below assumes that you already created a [resource-file](./resource | Option | Description | Default | | ----------- | ----------- | ----------- | - | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | - | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | - | --controller-extends | Specify which class should the controller extends. Note: the default value can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `Http\Controllers\Controller` | - | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | - | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | - | --models-per-page | How many models to show per page on the index view. | `25` | - | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | - | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | - | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | - | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | - | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | - | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | - | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | - | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | - | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | - | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | - | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | - | --engine-name | A specific engine name for the database's table can be provided here. | | - | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | - | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | - | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | - | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | + | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | + | --controller-extends | Specify which class should the controller extends. Note: the default value can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `Http\Controllers\Controller` | + | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | + | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | + | --models-per-page | How many models to show per page on the index view. | `25` | + | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | + | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | + | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | + | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | + | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | + | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | + | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | + | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | + | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | + | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | + | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | + | --engine-name | A specific engine name for the database's table can be provided here. | | + | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | + | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | + | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | + | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | | --template-name | [Described above](#template-name) | | | --force | This option will override the layout if one already exists. | | @@ -249,7 +249,7 @@ When using `resource-file:create`, `resource-file:from-database` or `resource-fi | --with-auth | [Described above](#with-auth) | | --models-per-page | [Described above](#models-per-page) | | --with-form-request | [Described above](#with-form-request) | - | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | + | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | | --form-request-directory | [Described above](#form-request-directory) | | --table-exists | [Described above](#table-exists) | | --translation-for | [Described above](#translation-for) | @@ -296,9 +296,9 @@ The argument `[model-name]` should be replaced with the name of the model you ar | --form-request-directory | [Described above](#form-request-directory) | | --model-directory | [Described above](#model-directory) | | --views-directory | [Described above](#views-directory) | - | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | - | --without-model | Allow you to create all the resources excluding the model. | - | --without-views | Allow you to create all the resources excluding the views. | + | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | + | --without-model | Allow you to create all the resources excluding the model. | + | --without-views | Allow you to create all the resources excluding the views. | | --template-name | [Described above](#template-name) | | --force | This option will override any file that already exist. | ::: @@ -374,8 +374,8 @@ The argument `[model-name]` should be replaced with the name of the model you ar | ----------- | ----------- | ----------- | | --resource-file | [Described above](#resource-file) | | --routes-prefix | [Described above](#routes-prefix) | - | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | - | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | + | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | + | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | | --views-directory | [Described above](#views-directory) | | --template-name | [Described above](#template-name) | | --force | This option will override any file that already exist. | diff --git a/docs/versioned_docs/version-2.3.0/intro.md b/docs/versioned_docs/version-2.3.0/intro.md index b8a6e7a..38977fc 100644 --- a/docs/versioned_docs/version-2.3.0/intro.md +++ b/docs/versioned_docs/version-2.3.0/intro.md @@ -59,4 +59,4 @@ Explore the project's source code on [GitHub](https://github.com/CrestApps/larav #### (Optional) Using Laravel-Collective -Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](./using-laravel-collective) +Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](./laravel-collective) diff --git a/docs/versioned_docs/version-2.3.0/resource-file.md b/docs/versioned_docs/version-2.3.0/resource-file.md index 52d8448..1de5a7d 100644 --- a/docs/versioned_docs/version-2.3.0/resource-file.md +++ b/docs/versioned_docs/version-2.3.0/resource-file.md @@ -31,10 +31,10 @@ The argument `[model-name]` should be replaced with the name of the model you ar | Option | Description | | ----------- | ----------- | - | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | - | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | - | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | - | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| + | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | + | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | + | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | + | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| | --translation-for | [Described above](#translation-for) | | --force | This option will override any file that already exist. | ::: @@ -152,7 +152,7 @@ The argument `[model-name]` should be replaced with the name of the model you ar | validation | You can pass any valid Laravel validation rule. The rules should be separated by bar `\|`.

    For example: `required\|string\|min:2\|max:255`

    Start with Laravel 5.5, you can define custom validation rules and pass them as well. For example, to use a custom validation rule called Uppercase in addition to the required rule, you can pass this string required|new Uppercase.

    To learn more about the valid options please visit [Laravel documentation](https://laravel.com/docs/master/validation#available-validation-rules).

    When the rule `required` is not used, the field in the migration file will automatically become nullable. | | html-type | Default value: `text`. A valid property will be one of the following options
    `text`, `textarea`, `password`,`email`,`checkbox`,`radio`,`number`,`select`,`hidden`,`file`,`selectRange`,`selectMonth`, or `multipleSelect`.

    Note: when using file type, after the file is uploaded to the designated path, the filename is stored in the database by default. For everything to work properly, the data-type must be of some sort of a string type. Or modify the behavior of moveFile method to handle the new file.

    By default this process stores the uploaded file in the path defined in config file.

    Note: when using checkbox, or multipleSelect, the items are stored in the database as JSON string. Additionally, the items in the index or form views are displayed separated by the value provided in the delimiter property. | | delimiter | Default value: "; ". When generating a form with checkbox or a select menu that accepts multiple answers, we need either store the results in a foreign model or store the records in a string field. By default, the code generator will convert the multiple options that a user selected into a JSON string before the results are stored using a Eloquent-mutator method.

    When the data is presented on the show and/or index views, the options are displayed separated by the value of the delimiter. Of course, you can always change this behavior to fit your needs by removing the accessor and mutator methods in the model and modifying the views accordingly. | - | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."`` property. Classes that are already set in the views will not be replaced. | + | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."` property. Classes that are already set in the views will not be replaced. | | date-format | Default value: "m/d/Y H:i A". Any field with the type date, time or datetime can be formatted different when it is displayed. You can change the display format using this option. | | html-value | A default value to set the field to. When using multiple options based html-type like checkbox, multipleSelect you can set this property to array of values to set multiple values by default. Ex, `["Red","Green"]` | | options | If you used select, checkbox, or radio for the html-type property, this is where you provide the options. Here are some example of the schema.

    A simple array: In this option, the value will be the numeric index value of the item in the array.
    ```"options": ["Prefer not to say","Male","Female"]```.
    Using explicit values
    ```"options": { "": Prefer not to say", "male": "Male","female": "Female"}```.
    Using multiple language phrases for each option
    ```"options": {"en":{"":"Prefer not to say","male":"Male","female":"Female"},"ar":{"":"Prefer not to say in Arabic","male":"Male in Arabic","female":"Female in Arabic"},"fr":{"":"Prefer not to say in French","male":"Male in French","female":"Female in French"}}``` | @@ -161,8 +161,8 @@ The argument `[model-name]` should be replaced with the name of the model you ar | is-on-index | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index view. | | is-on-form | Default value: `true`. Setting the value to `false` will prevent from adding this field to the form view. | | is-on-show | Default value: `true`. Setting the value to `false` will prevent from adding this field to the show view. | - | is-on-views | Default value: `true`. Setting the value to `false`` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | - | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns`` in the configuration file, allow you to list the common field name to automatically set them as header. | + | is-on-views | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | + | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns` in the configuration file, allow you to list the common field name to automatically set them as header. | #### Database Properties | Property name | Description | diff --git a/docs/versioned_docs/version-2.4.0/available-commands.md b/docs/versioned_docs/version-2.4.0/available-commands.md index 2890d33..5019377 100644 --- a/docs/versioned_docs/version-2.4.0/available-commands.md +++ b/docs/versioned_docs/version-2.4.0/available-commands.md @@ -191,7 +191,7 @@ All examples below assumes that you already created a [resource-file](./resource | ----------- | ----------- | ----------- | | --layout-filename | The name of the layout file to be used. | `app` (i.e, creates `app.blade.php`) | | --layout-directory | The directory to create the layout under. | `layouts` | - | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | + | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | | --force | This option will override the layout if one already exists. | | ::: @@ -213,29 +213,29 @@ All examples below assumes that you already created a [resource-file](./resource | Option | Description | Default | | ----------- | ----------- | ----------- | - | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | - | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | - | --controller-extends | Specify which class should the controller extends. Note: the default value is can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `default-controller` which means use the settings from the configurations by default `Http\Controllers\Controller` | - | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | - | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | - | --models-per-page | How many models to show per page on the index view. | `25` | - | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | - | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | - | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | - | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | - | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | - | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | - | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | - | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | - | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | - | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | - | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | - | --engine-name | A specific engine name for the database's table can be provided here. | | - | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | - | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | - | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | - | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | - | --fields | [Described below](#fields) | | + | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | + | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | + | --controller-extends | Specify which class should the controller extends. Note: the default value is can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `default-controller` which means use the settings from the configurations by default `Http\Controllers\Controller` | + | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | + | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | + | --models-per-page | How many models to show per page on the index view. | `25` | + | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | + | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | + | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | + | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | + | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | + | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | + | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | + | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | + | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | + | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | + | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | + | --engine-name | A specific engine name for the database's table can be provided here. | | + | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | + | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | + | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | + | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --fields | [Described here](./resource-file#fields) | | | --template-name | [Described above](#template-name) | | | --force | This option will override the layout if one already exists. | | ::: @@ -257,7 +257,7 @@ When using `resource-file:create`, `resource-file:from-database` or `resource-fi | --with-auth | [Described above](#with-auth) | | --models-per-page | [Described above](#models-per-page) | | --with-form-request | [Described above](#with-form-request) | - | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | + | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | | --form-request-directory | [Described above](#form-request-directory) | | --table-exists | [Described above](#table-exists) | | --translation-for | [Described above](#translation-for) | @@ -304,9 +304,9 @@ The argument `[model-name]` should be replaced with the name of the model you ar | --form-request-directory | [Described above](#form-request-directory) | | --model-directory | [Described above](#model-directory) | | --views-directory | [Described above](#views-directory) | - | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | - | --without-model | Allow you to create all the resources excluding the model. | - | --without-views | Allow you to create all the resources excluding the views. | + | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | + | --without-model | Allow you to create all the resources excluding the model. | + | --without-views | Allow you to create all the resources excluding the views. | | --template-name | [Described above](#template-name) | | --force | This option will override any file that already exist. | ::: @@ -385,8 +385,8 @@ The argument `[model-name]` should be replaced with the name of the model you ar | ----------- | ----------- | ----------- | | --resource-file | [Described above](#resource-file) | | --routes-prefix | [Described above](#routes-prefix) | - | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | - | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | + | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | + | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | | --views-directory | [Described above](#views-directory) | | --template-name | [Described above](#template-name) | | --force | This option will override any file that already exist. | diff --git a/docs/versioned_docs/version-2.4.0/intro.md b/docs/versioned_docs/version-2.4.0/intro.md index b8a6e7a..38977fc 100644 --- a/docs/versioned_docs/version-2.4.0/intro.md +++ b/docs/versioned_docs/version-2.4.0/intro.md @@ -59,4 +59,4 @@ Explore the project's source code on [GitHub](https://github.com/CrestApps/larav #### (Optional) Using Laravel-Collective -Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](./using-laravel-collective) +Laravel-Code-Generator is fully capable of generating views using Laravel-Collective. To Generate views using it, you must first install Laravel-Collective into your project. Instructions on how to use it can be found [Laravel-Collective](./laravel-collective) diff --git a/docs/versioned_docs/version-2.4.0/resource-file.md b/docs/versioned_docs/version-2.4.0/resource-file.md index 52d8448..1de5a7d 100644 --- a/docs/versioned_docs/version-2.4.0/resource-file.md +++ b/docs/versioned_docs/version-2.4.0/resource-file.md @@ -31,10 +31,10 @@ The argument `[model-name]` should be replaced with the name of the model you ar | Option | Description | | ----------- | ----------- | - | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | - | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | - | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | - | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| + | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | + | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | + | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | + | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| | --translation-for | [Described above](#translation-for) | | --force | This option will override any file that already exist. | ::: @@ -152,7 +152,7 @@ The argument `[model-name]` should be replaced with the name of the model you ar | validation | You can pass any valid Laravel validation rule. The rules should be separated by bar `\|`.

    For example: `required\|string\|min:2\|max:255`

    Start with Laravel 5.5, you can define custom validation rules and pass them as well. For example, to use a custom validation rule called Uppercase in addition to the required rule, you can pass this string required|new Uppercase.

    To learn more about the valid options please visit [Laravel documentation](https://laravel.com/docs/master/validation#available-validation-rules).

    When the rule `required` is not used, the field in the migration file will automatically become nullable. | | html-type | Default value: `text`. A valid property will be one of the following options
    `text`, `textarea`, `password`,`email`,`checkbox`,`radio`,`number`,`select`,`hidden`,`file`,`selectRange`,`selectMonth`, or `multipleSelect`.

    Note: when using file type, after the file is uploaded to the designated path, the filename is stored in the database by default. For everything to work properly, the data-type must be of some sort of a string type. Or modify the behavior of moveFile method to handle the new file.

    By default this process stores the uploaded file in the path defined in config file.

    Note: when using checkbox, or multipleSelect, the items are stored in the database as JSON string. Additionally, the items in the index or form views are displayed separated by the value provided in the delimiter property. | | delimiter | Default value: "; ". When generating a form with checkbox or a select menu that accepts multiple answers, we need either store the results in a foreign model or store the records in a string field. By default, the code generator will convert the multiple options that a user selected into a JSON string before the results are stored using a Eloquent-mutator method.

    When the data is presented on the show and/or index views, the options are displayed separated by the value of the delimiter. Of course, you can always change this behavior to fit your needs by removing the accessor and mutator methods in the model and modifying the views accordingly. | - | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."`` property. Classes that are already set in the views will not be replaced. | + | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."` property. Classes that are already set in the views will not be replaced. | | date-format | Default value: "m/d/Y H:i A". Any field with the type date, time or datetime can be formatted different when it is displayed. You can change the display format using this option. | | html-value | A default value to set the field to. When using multiple options based html-type like checkbox, multipleSelect you can set this property to array of values to set multiple values by default. Ex, `["Red","Green"]` | | options | If you used select, checkbox, or radio for the html-type property, this is where you provide the options. Here are some example of the schema.

    A simple array: In this option, the value will be the numeric index value of the item in the array.
    ```"options": ["Prefer not to say","Male","Female"]```.
    Using explicit values
    ```"options": { "": Prefer not to say", "male": "Male","female": "Female"}```.
    Using multiple language phrases for each option
    ```"options": {"en":{"":"Prefer not to say","male":"Male","female":"Female"},"ar":{"":"Prefer not to say in Arabic","male":"Male in Arabic","female":"Female in Arabic"},"fr":{"":"Prefer not to say in French","male":"Male in French","female":"Female in French"}}``` | @@ -161,8 +161,8 @@ The argument `[model-name]` should be replaced with the name of the model you ar | is-on-index | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index view. | | is-on-form | Default value: `true`. Setting the value to `false` will prevent from adding this field to the form view. | | is-on-show | Default value: `true`. Setting the value to `false` will prevent from adding this field to the show view. | - | is-on-views | Default value: `true`. Setting the value to `false`` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | - | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns`` in the configuration file, allow you to list the common field name to automatically set them as header. | + | is-on-views | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | + | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns` in the configuration file, allow you to list the common field name to automatically set them as header. | #### Database Properties | Property name | Description | diff --git a/docs/versioned_docs/version-3.0.0/available-commands.md b/docs/versioned_docs/version-3.0.0/available-commands.md index 5b420d5..5f691e5 100644 --- a/docs/versioned_docs/version-3.0.0/available-commands.md +++ b/docs/versioned_docs/version-3.0.0/available-commands.md @@ -196,7 +196,7 @@ All examples below assumes that you already created a [resource-file](./resource | ----------- | ----------- | ----------- | | --layout-filename | The name of the layout file to be used. | `app` (i.e, creates `app.blade.php`) | | --layout-directory | The directory to create the layout under. | `layouts` | - | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | + | --template-name | This option allows you to use a different template at run time. When this option is left out, the default template is used.

    Note: the default template can be set from the config file (i.e `config/laravel-code-generator.php`) by setting the template key to a different value. | `layouts` | | --force | This option will override the layout if one already exists. | | ::: @@ -218,29 +218,29 @@ All examples below assumes that you already created a [resource-file](./resource | Option | Description | Default | | ----------- | ----------- | ----------- | - | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | - | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | - | --controller-extends | Specify which class should the controller extends. Note: the default value is can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `default-controller` which means use the settings from the configurations by default `Http\Controllers\Controller` | - | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | - | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | - | --models-per-page | How many models to show per page on the index view. | `25` | - | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | - | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | - | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | - | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | - | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | - | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | - | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | - | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | - | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | - | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | - | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | - | --engine-name | A specific engine name for the database's table can be provided here. | | - | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | - | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | - | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | - | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | - | --fields | [Described below](#fields) | | + | --resource-file | The name of the file to import resource from. This option allows you to have all resources such as fields, indexes and relations in one JSON file, and then import it from the command line. This is a powerful feature which makes it easy to configure the fields, then reuse the same fields in multiple command now or in the future. More documentation on how to manage [resource-file](./resource-file.md) can be found in the "Managing fields using JSON file" section. | the plural-form of the model name. If the model name is AssetCategory, the name will then be asset_categories.json | + | --controller-name | The name of the controller to create. If the provided value does not end with the word "Controller" it will be appended. | The controller's name will be generated using the plural-form of the giving model's name. In the above example, the controller will be called "PostsController". | + | --controller-extends | Specify which class should the controller extends. Note: the default value is can be set change by modifying config file (i.e `config/laravel-code-generator.php`). | `default-controller` which means use the settings from the configurations by default `Http\Controllers\Controller` | + | --with-auth | Adds the `auth:api` to the controller which prevents any un-authenticated users to access the resources. | | + | --routes-prefix | Prefix of the route group. | `default-form` which uses the plural-form of the model name. However, this is something can be changed from the configuration file `plural_names_for` key. | + | --models-per-page | How many models to show per page on the index view. | `25` | + | --with-form-request | Instead of placing the field's validation rules directly in the controller class, this option will extract the rules into a separate form-request class. The form-request class allows you to do more complex validation, cleans up your controller, and increases your code reusability. By default, the method `authorize()` is set to return false for your application's security. This method must be modified to return a true value for the store and update requests to be allowed. Otherwise, the request will be Forbidden. When using `--with-auth` option, the `authorize()` method return `Auth::check()` which should always return true at this point. | | + | --table-name | The database's table name. If this option is left out, it is assumed that the table name is the plural-form of the model-name. In the above example, the table name will be "posts". If the model name is AssetCategory, the table name will be "asset_categories". | | + | --table-exists | This option allows you to generate resources from existing database table. When this option is used, the database's name is assumes to be the plural-form of the provided "model-name". Of course, the table name can be set to a different value by passing the `--table-name option`.

    When using this option, the command `php artisan resource-file:from-database` is called behind the scenes to generate a a [resource-file](./resource-file.md) first. The name of the generated [resource-file](./resource-file.md) will be named the plural-form of the model, unless an explicit name is provided using the `--resource-file`` option. This file will allow you to change the default behavior and recreate the view to fit your needs.

    This option is currently available only for MySql database only. It will not work if used with a different driver.

    Note: To create multiple-language translation from existing database, use the `--translation-for option`. | + | --translation-for | A comma separated languages. When creating resources from existing database using the `--table-exists options`, `--translation-for` allows you to create multi-language labels. You still have to provide translation for the corresponding language but it will get everything setup for you.

    If this option is left out, no translation key's will be generated.

    For example, passing `--translation-for=en,ar,fr` will create label under the following languages en, ar and fr.

    This option will only work when using `--table-exists` option otherwise it is ignored. | | + | --language-filename | The languages file name to put the labels "if any" in. When no value is provided, the file name will be the plural-form of the provided model name.

    Note: if the file already exists, and the same key field name exists in the file, no message will be added.

    This option will only work when using --table-exists option. | | + | --primary-key | The field's name of the primary key. The default value can be overridden by setting the is-auto-increment or the is-primary flag to true in the fields setup. | `id` | + | --with-soft-delete | Enables the soft-delete feature that Eloquent provides. | | + | --without-timestamps | Prevent Eloquent from maintaining both `created_at` and the `updated_at` properties. | | + | --with-migration | This option will create a migration for your resource.

    Behind the scenes, this option invokes the `create:migration` command to create the required migration. | | + | --migration-class-name | The name of the migration class. If this option is not set, a name will be generated based on the model name. | | + | --connection-name | Eloquent uses the configured default database connection. Providing a value here will tell Eloquent to connect using the provided connection. | | + | --engine-name | A specific engine name for the database's table can be provided here. | | + | --controller-directory | The directory where the controller should be created under. For example, if the word "Frontend" was provided, the controller will be created in `App/Http/Controllers/Frontend` directory.

    The default path where the controller will be created can be set from the config file `config/laravel-code-generator.php`. | | + | --model-directory | A directory where the model will be created under. The default path where the model will be created can be set from the config file `config/laravel-code-generator.php`.| | + | --views-directory | The name of the directory to create the views under. If this option is left out, the views will be created in `/resources/views` | | + | --form-request-directory | The directory where the form-request should be created under.

    For example, if the word "Frontend" was provided, the form-request will be created in `App/Http/Requests/Frontend` directory. The default path where the form-request will be created can be set from the config file `config/laravel-code-generator.php` | + | --fields | [Described here](./resource-file#fields) | | | --template-name | [Described above](#template-name) | | | --force | This option will override the layout if one already exists. | | ::: @@ -262,7 +262,7 @@ When using `resource-file:create`, `resource-file:from-database` or `resource-fi | --with-auth | [Described above](#with-auth) | | --models-per-page | [Described above](#models-per-page) | | --with-form-request | [Described above](#with-form-request) | - | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | + | --without-form-request | Allow you to create all the resources excluding the form-request if one is used. Note: when creating a controller with a form-request the form-request is injected into the action methods. Thus, in order to create the form-request based controller, you would have to use `--with-form-request` and `--with-form-request` so the controller know you are using form-request but avoid overriding existing form-request. | | --form-request-directory | [Described above](#form-request-directory) | | --table-exists | [Described above](#table-exists) | | --translation-for | [Described above](#translation-for) | @@ -309,9 +309,9 @@ The argument `[model-name]` should be replaced with the name of the model you ar | --form-request-directory | [Described above](#form-request-directory) | | --model-directory | [Described above](#model-directory) | | --views-directory | [Described above](#views-directory) | - | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | - | --without-model | Allow you to create all the resources excluding the model. | - | --without-views | Allow you to create all the resources excluding the views. | + | --without-languages | Allow you to create all the resources excluding the language file if one is needed. Note: the language file will only be created if the resource file contains translations. | + | --without-model | Allow you to create all the resources excluding the model. | + | --without-views | Allow you to create all the resources excluding the views. | | --template-name | [Described above](#template-name) | | --force | This option will override any file that already exist. | ::: @@ -390,8 +390,8 @@ The argument `[model-name]` should be replaced with the name of the model you ar | ----------- | ----------- | ----------- | | --resource-file | [Described above](#resource-file) | | --routes-prefix | [Described above](#routes-prefix) | - | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | - | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | + | --layout-name | Default value `layouts.app`. A different layout could be used to generate the views. This can easily be done by providing a different layout name. For example, if the physical path to a different layout was `/resources/views/layouts/template/newlayout.blade.php`` then its name would be `layouts.template.newlayout`. | + | --only-views | The only views to be created. A comma separated string with the name of the views to create. By default, create the create,edit,index,show, and form views. | | --views-directory | [Described above](#views-directory) | | --template-name | [Described above](#template-name) | | --force | This option will override any file that already exist. | diff --git a/docs/versioned_docs/version-3.0.0/resource-file.md b/docs/versioned_docs/version-3.0.0/resource-file.md index 52d8448..1de5a7d 100644 --- a/docs/versioned_docs/version-3.0.0/resource-file.md +++ b/docs/versioned_docs/version-3.0.0/resource-file.md @@ -31,10 +31,10 @@ The argument `[model-name]` should be replaced with the name of the model you ar | Option | Description | | ----------- | ----------- | - | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | - | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | - | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | - | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| + | --resource-filename | The name of the file to be created. When this option is left out, the file will be the plural-form of the model name. If the model name is `AssetCategory`, the file name will be `asset_categories.json`. | + | --fields | A list of the field names to be created. The names should be separated by a comma.

    You may also pass a complex string using the following schema

    `--fields="name:colors;html-type:select;options:blue\|yellow\|green\|red\|white,name:second_field_name"`

    Complex string are allowed and will be handy is some cases. However, in most cases all you need to pass is the field names as the common_definitions key in the configuration file will define most options for you out of the box using the name of the field.

    Each field in the complex string must be seperated by a `,`. Also each property in the field must be seperated by `;` while each option of a property is seperated by `\|`. | + | --relations | A list of the relations to be created. The string should follow the schema below

    `--relations="name:comments;type:hasMany;field:title;params:App\Models\Comment\|post_id\|id"`

    Each relation in the string must be seperated by a `,`. Also each property in the relation must be seperated by `;` while each parameter of the params property seperated by `\|`. | + | --indexes | A list of the indexes to be created. The string should follow the schema below

    `--indexes="name:first_last_name_index;columns:first_name\|last_name"`.

    Each index in the string must be seperated by a `,`. Also each property in the index must be seperated by `;` while each field name in the columns property seperated `\|`.| | --translation-for | [Described above](#translation-for) | | --force | This option will override any file that already exist. | ::: @@ -152,7 +152,7 @@ The argument `[model-name]` should be replaced with the name of the model you ar | validation | You can pass any valid Laravel validation rule. The rules should be separated by bar `\|`.

    For example: `required\|string\|min:2\|max:255`

    Start with Laravel 5.5, you can define custom validation rules and pass them as well. For example, to use a custom validation rule called Uppercase in addition to the required rule, you can pass this string required|new Uppercase.

    To learn more about the valid options please visit [Laravel documentation](https://laravel.com/docs/master/validation#available-validation-rules).

    When the rule `required` is not used, the field in the migration file will automatically become nullable. | | html-type | Default value: `text`. A valid property will be one of the following options
    `text`, `textarea`, `password`,`email`,`checkbox`,`radio`,`number`,`select`,`hidden`,`file`,`selectRange`,`selectMonth`, or `multipleSelect`.

    Note: when using file type, after the file is uploaded to the designated path, the filename is stored in the database by default. For everything to work properly, the data-type must be of some sort of a string type. Or modify the behavior of moveFile method to handle the new file.

    By default this process stores the uploaded file in the path defined in config file.

    Note: when using checkbox, or multipleSelect, the items are stored in the database as JSON string. Additionally, the items in the index or form views are displayed separated by the value provided in the delimiter property. | | delimiter | Default value: "; ". When generating a form with checkbox or a select menu that accepts multiple answers, we need either store the results in a foreign model or store the records in a string field. By default, the code generator will convert the multiple options that a user selected into a JSON string before the results are stored using a Eloquent-mutator method.

    When the data is presented on the show and/or index views, the options are displayed separated by the value of the delimiter. Of course, you can always change this behavior to fit your needs by removing the accessor and mutator methods in the model and modifying the views accordingly. | - | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."`` property. Classes that are already set in the views will not be replaced. | + | css-class | You can add custom css class(es) to the html input. Any value is placed in this option will be appended to the field's `class="..."` property. Classes that are already set in the views will not be replaced. | | date-format | Default value: "m/d/Y H:i A". Any field with the type date, time or datetime can be formatted different when it is displayed. You can change the display format using this option. | | html-value | A default value to set the field to. When using multiple options based html-type like checkbox, multipleSelect you can set this property to array of values to set multiple values by default. Ex, `["Red","Green"]` | | options | If you used select, checkbox, or radio for the html-type property, this is where you provide the options. Here are some example of the schema.

    A simple array: In this option, the value will be the numeric index value of the item in the array.
    ```"options": ["Prefer not to say","Male","Female"]```.
    Using explicit values
    ```"options": { "": Prefer not to say", "male": "Male","female": "Female"}```.
    Using multiple language phrases for each option
    ```"options": {"en":{"":"Prefer not to say","male":"Male","female":"Female"},"ar":{"":"Prefer not to say in Arabic","male":"Male in Arabic","female":"Female in Arabic"},"fr":{"":"Prefer not to say in French","male":"Male in French","female":"Female in French"}}``` | @@ -161,8 +161,8 @@ The argument `[model-name]` should be replaced with the name of the model you ar | is-on-index | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index view. | | is-on-form | Default value: `true`. Setting the value to `false` will prevent from adding this field to the form view. | | is-on-show | Default value: `true`. Setting the value to `false` will prevent from adding this field to the show view. | - | is-on-views | Default value: `true`. Setting the value to `false`` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | - | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns`` in the configuration file, allow you to list the common field name to automatically set them as header. | + | is-on-views | Default value: `true`. Setting the value to `false` will prevent from adding this field to the index, form or show view. This is just a short way to change the visibility for all views. | + | is-header | Default value: false. Only one field can be set to a header. The header field will be use as the page header in the show view. The key `common_header_patterns` in the configuration file, allow you to list the common field name to automatically set them as header. | #### Database Properties | Property name | Description | From 694d9a4f73f430081355f338e76cf2106737337a Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 13:50:14 -0800 Subject: [PATCH 19/29] Update deploy.yml --- .github/workflows/deploy.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5c70463..5190434 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -22,6 +22,11 @@ jobs: run: npm run build working-directory: ./docs + - name: Use the value + id: step_two + run: | + "ls -a" + - name: Deploy Files uses: SamKirkland/FTP-Deploy-Action@v4.3.4 with: From b90ffd9185386ef298bdf64a2ebc7f6c073f2bc9 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 13:56:10 -0800 Subject: [PATCH 20/29] Update deploy.yml --- .github/workflows/deploy.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5190434..4da3492 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -24,8 +24,7 @@ jobs: - name: Use the value id: step_two - run: | - "ls -a" + run: ls - name: Deploy Files uses: SamKirkland/FTP-Deploy-Action@v4.3.4 From d434ab6a6f10abc637c0995f452996610b64fec9 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 13:59:35 -0800 Subject: [PATCH 21/29] Update deploy.yml --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 4da3492..5ff84f8 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -32,5 +32,5 @@ jobs: server: ${{ secrets.FTP_HOST }} username: ${{ secrets.FTP_USERNAME }} password: ${{ secrets.FTP_PASSWORD }} - local-dir: ./build/ + local-dir: ./docs/build/ From 2c06de174fce5dd1bfa264a2ab73981c4259b20d Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 14:55:20 -0800 Subject: [PATCH 22/29] Update deploy.yml --- .github/workflows/deploy.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5ff84f8..b45667a 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -2,7 +2,8 @@ on: push: branches: - master - + paths: + - docs jobs: deploy: runs-on: ubuntu-latest @@ -21,10 +22,6 @@ jobs: - name: Build site run: npm run build working-directory: ./docs - - - name: Use the value - id: step_two - run: ls - name: Deploy Files uses: SamKirkland/FTP-Deploy-Action@v4.3.4 From b0751b3639145b03de4f09ee6d040d3fa2262e58 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 15:07:03 -0800 Subject: [PATCH 23/29] Add map for tinyText Fix #189 --- config/default.php | 1 + package-lock.json | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 package-lock.json diff --git a/config/default.php b/config/default.php index a7f9556..2f0ba79 100644 --- a/config/default.php +++ b/config/default.php @@ -892,6 +892,7 @@ 'macaddress' => 'macAddress', 'mediuminteger' => 'mediumInteger', 'mediumint' => 'mediumInteger', + 'tinytext' => 'tinyText', 'mediumtext' => 'mediumText', 'smallInteger' => 'smallInteger', 'smallint' => 'smallInteger', diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..da88817 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "laravel-code-generator", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} From eb86495bc3c593fb3a182fd21835e0d9e670ea26 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 15:44:35 -0800 Subject: [PATCH 24/29] fix edit url --- docs/docusaurus.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 8701c85..0362770 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -44,7 +44,7 @@ const config = { // Please change this to your repo. // Remove this to remove the "edit this page" links. editUrl: - 'https://github.com/CrestApps/laravel-code-generator/docs/docs/edit/master/', + 'https://github.com/CrestApps/laravel-code-generator/edit/master/docs/', }, theme: { customCss: './src/css/custom.css', From d291afee9b6dd72bd5efa4b3e32d13e52973710e Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 15:47:43 -0800 Subject: [PATCH 25/29] Update deploy.yml --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index b45667a..7fb5984 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -3,7 +3,7 @@ on: branches: - master paths: - - docs + - docs/** jobs: deploy: runs-on: ubuntu-latest From bbf447d6d791c2dd061835566d0c430a33992a8b Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 15:49:02 -0800 Subject: [PATCH 26/29] update notes for testing --- docs/docusaurus.config.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 0362770..59f8f8a 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -41,8 +41,6 @@ const config = { ({ docs: { sidebarPath: './sidebars.js', - // Please change this to your repo. - // Remove this to remove the "edit this page" links. editUrl: 'https://github.com/CrestApps/laravel-code-generator/edit/master/docs/', }, From 9c0561e0979d40e7e08990cdb3ec5bbcfd304aeb Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 15:57:03 -0800 Subject: [PATCH 27/29] Update deploy.yml --- .github/workflows/deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7fb5984..801f638 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,4 +1,5 @@ on: + workflow_dispatch: push: branches: - master From 01eaa530e295850fff337769e6b611768032862a Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 16:30:14 -0800 Subject: [PATCH 28/29] add second video --- docs/docs/get-started.md | 8 ++++++-- docs/docusaurus.config.js | 2 +- docs/versioned_docs/version-2.0.0/get-started.md | 9 +++++++-- docs/versioned_docs/version-2.1.0/get-started.md | 11 +++++++++-- docs/versioned_docs/version-2.2.0/get-started.md | 10 ++++++++-- docs/versioned_docs/version-2.3.0/get-started.md | 11 +++++++++-- docs/versioned_docs/version-2.4.0/get-started.md | 9 +++++++-- docs/versioned_docs/version-3.0.0/get-started.md | 11 +++++++++-- 8 files changed, 56 insertions(+), 15 deletions(-) diff --git a/docs/docs/get-started.md b/docs/docs/get-started.md index 3925a0f..444af88 100644 --- a/docs/docs/get-started.md +++ b/docs/docs/get-started.md @@ -35,9 +35,13 @@ If you like to override the default template, you may execute the following comm php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-template ``` -### Demo +### Getting Started Videos -Below a video to demonstrate how to use most of the package commands. +#### How to use Laravel Code Generator to generate production ready code in seconds! + +#### Create a CRUDs for all your database tables in seconds using Laravel and Laravel-Code-Generator + + diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 59f8f8a..fc31c78 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -70,7 +70,7 @@ const config = { type: 'docSidebar', sidebarId: 'docsSidebar', position: 'left', - label: 'Tutorial', + label: 'Documentations', }, { type: 'docsVersionDropdown', diff --git a/docs/versioned_docs/version-2.0.0/get-started.md b/docs/versioned_docs/version-2.0.0/get-started.md index 3931537..f708c26 100644 --- a/docs/versioned_docs/version-2.0.0/get-started.md +++ b/docs/versioned_docs/version-2.0.0/get-started.md @@ -29,9 +29,14 @@ php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServ A layout is required for the default views! The code generator allows you to create a layout using the command-line. Of course you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/) in your layout for the default templates to work properly. Additionally, you can chose to design your own templates using a different or no css framework. For more info on how to create a custom template [click here](https://crestapps.com/laravel-code-generator/docs/2.2#how-to-create-custom-template)! -### Demo +### Getting Started Videos -Below a video to demonstrate how to use most of the package commands. +#### How to use Laravel Code Generator to generate production ready code in seconds! + +#### Create a CRUDs for all your database tables in seconds using Laravel and Laravel-Code-Generator + + + diff --git a/docs/versioned_docs/version-2.1.0/get-started.md b/docs/versioned_docs/version-2.1.0/get-started.md index 3931537..e0252fe 100644 --- a/docs/versioned_docs/version-2.1.0/get-started.md +++ b/docs/versioned_docs/version-2.1.0/get-started.md @@ -29,9 +29,16 @@ php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServ A layout is required for the default views! The code generator allows you to create a layout using the command-line. Of course you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/) in your layout for the default templates to work properly. Additionally, you can chose to design your own templates using a different or no css framework. For more info on how to create a custom template [click here](https://crestapps.com/laravel-code-generator/docs/2.2#how-to-create-custom-template)! -### Demo -Below a video to demonstrate how to use most of the package commands. +### Getting Started Videos + +#### How to use Laravel Code Generator to generate production ready code in seconds! + +#### Create a CRUDs for all your database tables in seconds using Laravel and Laravel-Code-Generator + + + + diff --git a/docs/versioned_docs/version-2.2.0/get-started.md b/docs/versioned_docs/version-2.2.0/get-started.md index 3931537..7d87a34 100644 --- a/docs/versioned_docs/version-2.2.0/get-started.md +++ b/docs/versioned_docs/version-2.2.0/get-started.md @@ -29,9 +29,15 @@ php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServ A layout is required for the default views! The code generator allows you to create a layout using the command-line. Of course you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/) in your layout for the default templates to work properly. Additionally, you can chose to design your own templates using a different or no css framework. For more info on how to create a custom template [click here](https://crestapps.com/laravel-code-generator/docs/2.2#how-to-create-custom-template)! -### Demo -Below a video to demonstrate how to use most of the package commands. +### Getting Started Videos + +#### How to use Laravel Code Generator to generate production ready code in seconds! + +#### Create a CRUDs for all your database tables in seconds using Laravel and Laravel-Code-Generator + + + diff --git a/docs/versioned_docs/version-2.3.0/get-started.md b/docs/versioned_docs/version-2.3.0/get-started.md index 3931537..e0252fe 100644 --- a/docs/versioned_docs/version-2.3.0/get-started.md +++ b/docs/versioned_docs/version-2.3.0/get-started.md @@ -29,9 +29,16 @@ php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServ A layout is required for the default views! The code generator allows you to create a layout using the command-line. Of course you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/) in your layout for the default templates to work properly. Additionally, you can chose to design your own templates using a different or no css framework. For more info on how to create a custom template [click here](https://crestapps.com/laravel-code-generator/docs/2.2#how-to-create-custom-template)! -### Demo -Below a video to demonstrate how to use most of the package commands. +### Getting Started Videos + +#### How to use Laravel Code Generator to generate production ready code in seconds! + +#### Create a CRUDs for all your database tables in seconds using Laravel and Laravel-Code-Generator + + + + diff --git a/docs/versioned_docs/version-2.4.0/get-started.md b/docs/versioned_docs/version-2.4.0/get-started.md index 3931537..56a4c54 100644 --- a/docs/versioned_docs/version-2.4.0/get-started.md +++ b/docs/versioned_docs/version-2.4.0/get-started.md @@ -29,9 +29,14 @@ php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServ A layout is required for the default views! The code generator allows you to create a layout using the command-line. Of course you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/) in your layout for the default templates to work properly. Additionally, you can chose to design your own templates using a different or no css framework. For more info on how to create a custom template [click here](https://crestapps.com/laravel-code-generator/docs/2.2#how-to-create-custom-template)! -### Demo -Below a video to demonstrate how to use most of the package commands. +### Getting Started Videos + +#### How to use Laravel Code Generator to generate production ready code in seconds! + +#### Create a CRUDs for all your database tables in seconds using Laravel and Laravel-Code-Generator + + diff --git a/docs/versioned_docs/version-3.0.0/get-started.md b/docs/versioned_docs/version-3.0.0/get-started.md index 3925a0f..08f4a87 100644 --- a/docs/versioned_docs/version-3.0.0/get-started.md +++ b/docs/versioned_docs/version-3.0.0/get-started.md @@ -35,9 +35,16 @@ If you like to override the default template, you may execute the following comm php artisan vendor:publish --provider="CrestApps\CodeGenerator\CodeGeneratorServiceProvider" --tag=default-template ``` -### Demo -Below a video to demonstrate how to use most of the package commands. +### Getting Started Videos + +#### How to use Laravel Code Generator to generate production ready code in seconds! + +#### Create a CRUDs for all your database tables in seconds using Laravel and Laravel-Code-Generator + + + + From bf0c5edd56914e21fee5a69d8ec0848eaf1db5ce Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sat, 27 Jan 2024 16:42:25 -0800 Subject: [PATCH 29/29] update readme --- README.md | 204 +++++++++++++++++++++++++----------------------------- 1 file changed, 93 insertions(+), 111 deletions(-) diff --git a/README.md b/README.md index 4bfe8ca..cfa46db 100644 --- a/README.md +++ b/README.md @@ -5,43 +5,33 @@ An intelligent code generator for Laravel framework that will save you time! This awesome tool will help you generate resources like views, controllers, routes, migrations, languages and/or form-requests! It is extremely flexible and customizable to cover many on the use cases. It is shipped with cross-browsers compatible template, along with a client-side validation to modernize your application. -For full documentation and live demo please visit CrestApps.com - -**Note: ** The available documentation is for versions <= 2.2. The documentation for version 2.3+ is very similar with some exceptions. Please review the Change Log to get a list of the changes. +For full documentation and live demo please visit CrestApps.com ## Features -
      -
    • One step installation when using Laravel 5.5+
    • -
    • Create very clean, reusable and highly readable code to build on.
    • -
    • Create full resources using a single command with migration or from existing database.
    • -
    • Creates full resources for all of the existing tables in the database using one command.
    • -
    • Create full API-based resources using a single command with migration or from existing database.
    • -
    • Create beautiful documentation for your API.
    • -
    • Create api-resource and api-resource-collection with Laravel 5.5+.
    • -
    • Allows you to save the fields in a JSON file and recreate resources when the business needs changes.
    • -
    • Utilizes JSON based resource-file to allow you to define your resources. Resource-file allows you to easily regenerate the resource at any time even when the business rules change.
    • -
    • Create standard CRUD controllers with simple or form-request validation.
    • -
    • Customizable view templates to enable you to change the standard look and feel of your application.
    • -
    • Create model with relations.
    • -
    • Create named routes with and without group.
    • -
    • Create standard CRUD views.
    • -
    • Smart migration engine! Keeps track of all generated migrations to only create the needed migration.
    • -
    • Intelligent enough to automatically handles the relations between the models.
    • -
    • Very flexible and rich with configurable options.
    • -
    • Easy commands to create resource-file; additionally, add or reduce existing resource-file.
    • -
    • Full capability to generate multi-languages applications.
    • -
    • Client-side validation.
    • -
    • File uploading handling.
    • -
    • Auto store multiple-response in the database.
    • -
    • Create form-request to clean up your controller and increase your code re-usability.
    • -
    • Create view's layouts with and without client-side validation.
    • -
    • Change the template at run time to generate different views.
    • -
    • Ability to generate views with and without Laravel-Collective.
    • -
    • Nicely handles any date, time or DateTime field.
    • -
    • Auto handles any boolean field.
    • -
    • Very easy to use with lots of documentation.
    • -
    +- Craft clean, reusable, and highly readable code for seamless development. +- Generate complete resources effortlessly with a single command, supporting both migration and existing database scenarios. +- Streamline resource creation for all existing database tables with a single command. +- Save and recreate fields using a JSON file, ensuring adaptability to changing business needs. +- Leverage JSON-based resource files for easy regeneration, even when business rules evolve. +- Generate standard CRUD controllers with simple or form-request validation. +- Customize view templates to alter the standard look and feel of your application. +- Create models with relations for comprehensive data representation. +- Establish named routes with and without grouping for efficient navigation. +- Generate standard CRUD views to facilitate a consistent user experience. +- Smart migration engine tracks generated migrations to only create necessary ones. +- Intelligent handling of model relations to simplify development. +- Highly flexible with rich configurable options to suit diverse needs. +- Easy commands for resource-file creation, addition, or reduction. +- Full support for generating multi-language applications. +- Implement client-side validation for enhanced user interaction. +- Efficiently handle file uploading and store multiple responses in the database. +- Generate form-request to clean up controllers and boost code reusability. +- Create view layouts with and without client-side validation. +- Change templates at runtime for diverse view generation. +- Ability to generate views with or without Laravel-Collective integration. +- Seamless handling of date, time, or datetime fields. +- Automatic management of boolean fields for hassle-free development. ## Installation @@ -61,8 +51,6 @@ For full documentation and live demo please visit YouTube.com * https://youtu.be/l21qNcsMAWg @@ -74,84 +62,80 @@ Checkout our channel on -
      -
    • php artisan resource-file:from-database [model-name]
    • -
    • php artisan resource-file:create [model-name]
    • -
    • php artisan resource-file:append [model-name]
    • -
    • php artisan resource-file:reduce [model-name]
    • -
    • php artisan resource-file:delete [model-name]
    • -
    - -
  • - Migration commands -
      -
    • php artisan migrate-all
    • -
    • php artisan migrate:rollback-all
    • -
    • php artisan migrate:reset-all
    • -
    • php artisan migrate:refresh-all
    • -
    • php artisan migrate:status-all
    • -
    -
  • +
  • + Main commands +
      +
    • php artisan create:scaffold [model-name]
    • +
    • php artisan create:controller [model-name]
    • +
    • php artisan create:model [model-name]
    • +
    • php artisan create:form-request [model-name]
    • +
    • php artisan create:routes [model-name]
    • +
    • php artisan create:migration [model-name]
    • +
    • php artisan create:language [model-name]
    • +
    • php artisan create:mapped-resources
    • +
    +
  • +
  • + API commands +
      +
    • php artisan create:api-scaffold [model-name]
    • +
    • php artisan create:api-controller [model-name]
    • +
    • php artisan create:api-resources [model-name]
    • +
    +
  • +
  • + API Documentations commands +
      +
    • php artisan api-docs:scaffold [model-name]
    • +
    • php artisan api-doc:create-controller [model-name]
    • +
    • php artisan api-doc:create-view [model-name]
    • +
    +
  • +
  • + Views commands +
      +
    • php artisan create:layout [application-name]
    • +
    • php artisan create:views [model-name]
    • +
    • php artisan create:index-view [model-name]
    • +
    • php artisan create:create-view [model-name]
    • +
    • php artisan create:edit-view [model-name]
    • +
    • php artisan create:show-view [model-name]
    • +
    • php artisan create:form-view [model-name]
    • +
    +
  • +
  • + Resource's files commands +
      +
    • php artisan resource-file:from-database [model-name]
    • +
    • php artisan resource-file:create [model-name]
    • +
    • php artisan resource-file:append [model-name]
    • +
    • php artisan resource-file:reduce [model-name]
    • +
    • php artisan resource-file:delete [model-name]
    • +
    +
  • +
  • + Migration commands +
      +
    • php artisan migrate-all
    • +
    • php artisan migrate:rollback-all
    • +
    • php artisan migrate:reset-all
    • +
    • php artisan migrate:refresh-all
    • +
    • php artisan migrate:status-all
    • +
    +
-> Full documentation available at [CrestApps.com](https://www.crestapps.com/laravel-code-generator/docs/2.3 "Laravel Code Generator Documentation"). -> Live demo is available at [CrestApps.com](https://www.crestapps.com/laravel-code-generator/demos/v2-3 "Laravel Code Generator Live Demo"). +## Contribution -## Upgrading from version <= 2.2 to 2.3+ - - Delete the `codegenerator.php` file found in your `config` folder, then rename the `codegenerator_custom.php` file to `laravel-code-generator.php` if one exists. Alternatively, you can delete both `codegenerator.php` and `codegenerator_custom.php` +Are you interested in supporting this project and making a contribution? Here's how you can get involved: +- Begin by showing your appreciation for this package on GitHub by giving it a **star**. +- Share this project with others to encourage ongoing enhancements and the introduction of new features. +- Report any bugs, provide comments, share ideas, or express your thoughts about this project by creating an issue on GitHub. +- Contributors are encouraged! If you're passionate about this project, consider addressing existing issues by submitting a pull request. +- If possible, consider [sponsoring the project](https://github.com/sponsors/CrestApps). -## Contribution -Do you like this project and want to contribute? -- **HELP WANTED** Version `v2.3` needs to be documented. If you are able to contribute, please read the change-log in v2.3 branch and document it in the CrestApps-site repository. For any help, my email can be found in the `composer.json` file, feel free to send me an email. -- **HELP WANTED** Need to create a new theme for Bootstrap 5 and make it the default. If interested, please submit a PR. -- Please start by ***Staring*** this package on GitHub. -- Sharing this projects with others is your way of saying keep improvements and new awesome feature coming. -- Report any bugs or send us any comments, idea, thought that you may have about this project as an issue on GitHub. ## What did you create with this package? I'd love to know if your site was generated using this package and list your logo on the documentation site. Please email using my contact info found in `composer.json` file. @@ -248,9 +232,7 @@ The following example assumes that we are trying to create a CRUD called As

Then it will create a model app/Models/AssetCategory, a controller app/Http/Controllers/AssetCategoriesController, all views and the routes!

- -## What's new? -* Release Notes +s * Upgrade Guide ## License