diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..9a14922 --- /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'] diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..801f638 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,34 @@ +on: + workflow_dispatch: + push: + branches: + - master + paths: + - docs/** +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + + - name: Install dependencies + run: npm install + working-directory: ./docs + + - name: Build site + run: npm run build + working-directory: ./docs + + - name: Deploy Files + uses: SamKirkland/FTP-Deploy-Action@v4.3.4 + with: + server: ${{ secrets.FTP_HOST }} + username: ${{ secrets.FTP_USERNAME }} + password: ${{ secrets.FTP_PASSWORD }} + local-dir: ./docs/build/ + diff --git a/.gitignore b/.gitignore index 9990b78..c8725b0 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ .DS_Store vendor/ composer.lock + +.vscode/ +.node_modules/ diff --git a/CHANGELOG.md b/CHANGELOG.md index f10a84b..9856258 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ - The `create:routes` command now has a new option `without-route-clause` which will create the routes without `there` clause for the id. It may be used when the primary key is not an integer. Additionally, the options `--for-api` and `--api-version` have been added to add support for created api-based routes. - added command to create api-resource with/without collection when using Laravel 5.5+. - The `create:api-scaffold` command have been added to allow you to create resources for the api. - - The user is no longer required to publish the default templates. This is much better step to prevent upgrade braking when the template are updated during a patch release. The user should publish templates only if he/she want to modify it and rename it. **IMPORTANT** Delete existing default and default-collective templates from the folders from the default publish path of your project. + - The user is no longer required to publish the default templates. This is much better step to prevent upgrade braking when the template are updated during a patch release. The user should publish templates only if he/she want to modify it and rename it. **IMPORTANT** Delete existing `default` templates from the folders from the default publish path of your project. - The user no longer have to publish resource to install the package! One line only is required to install the package on laravel 5.5+ (i.e, composer require crestapps/laravel-code-generator --dev) - **IMPORTANT**: 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` - Added `--model-extends` option to the create:model command to allow the use to extend a custom default base class. diff --git a/README.md b/README.md index 28d2e3a..cfa46db 100644 --- a/README.md +++ b/README.md @@ -5,47 +5,37 @@ 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 vertion 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 - +- 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 -1. To download this package into your laravel project, use the command-line to execute the following command +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 @@ -53,7 +43,7 @@ For full documentation and live demo please visit A layout is required for the default views! The code generator allows you to create a layout using the command-line. Of cource you can use your own layout. You'll only need to include [CSS bootstrap framework](http://getbootstrap.com/ "CSS bootstrap framework") in your layout for the default templates to work properly. Additionally, you can chose to you design your own templetes using a different or no css framework. - ## Lessons Checkout our channel on YouTube.com * https://youtu.be/l21qNcsMAWg @@ -74,77 +62,80 @@ Checkout our channel on - - -
  • - Migration commands - -
  • +
  • + Main commands + +
  • +
  • + API commands + +
  • +
  • + API Documentations commands + +
  • +
  • + Views commands + +
  • +
  • + Resource's files commands + +
  • +
  • + Migration commands + +
  • -> 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 before it can be released. 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. -- 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. @@ -241,12 +232,9 @@ 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 "Laravel Code Generator" is an open-sourced software licensed under the MIT license - diff --git a/config/default.php b/config/default.php index 659e5e3..2f0ba79 100644 --- a/config/default.php +++ b/config/default.php @@ -30,20 +30,6 @@ */ 'templates_path' => 'resources/laravel-code-generator/templates', - /* - |-------------------------------------------------------------------------- - | Array of templates that should be generated with Laravel-Collective. - |-------------------------------------------------------------------------- - | - | If you want to generate code by using laravel-collective, you must first - | install the package. Then add the tamplate name that should be using - | Laravel-Collective extensions when generating code. - | - */ - 'laravel_collective_templates' => [ - 'default-collective', - ], - /* |-------------------------------------------------------------------------- | The default path of where the uploaded files live. @@ -59,7 +45,7 @@ /* |-------------------------------------------------------------------------- - | The default output format for datetime fields. + | The default output format for DateTime fields. |-------------------------------------------------------------------------- | | This output format can also be changed at the field level using the @@ -70,10 +56,10 @@ /* |-------------------------------------------------------------------------- - | The default path of where the json resource-files are located. + | The default path of where the JSON resource-files are located. |-------------------------------------------------------------------------- | - | In this path, you can create json file to import the resources from. + | In this path, you can create JSON file to import the resources from. | */ 'resource_file_path' => 'resources/laravel-code-generator/sources', @@ -161,7 +147,7 @@ |-------------------------------------------------------------------------- | */ - 'api_docs_controller_path' => 'Http/Controllers/ApiDocs', + 'api_docs_controller_path' => 'Http/Controllers', /* |-------------------------------------------------------------------------- @@ -231,15 +217,15 @@ /* |-------------------------------------------------------------------------- - | Patterns to use to generate the html placeholders. + | Patterns to use to generate the HTML placeholders. |-------------------------------------------------------------------------- | | When creating the fields, the code generator follows a pattern to generate - | placeholders for the html code. Here you can define which html-types should + | placeholders for the HTML code. Here you can define which html-types should | the generator create placeholder for. Also, you can define how would you like | the text to read when no placeholder is assigned. | - | The follwowing templates can be used to. assuming the field name is owner_name + | The following templates can be used to. assuming the field name is owner_name | [% field_name %] <=> "owner name" | [% field_name_sentence %] <=> "Owner name" | [% field_name_plural %] <=> "owner names" @@ -268,11 +254,11 @@ | Key phrases that are will be used to determine if a field should have a relation. |-------------------------------------------------------------------------- | - | When creating resources from existing database, the codegenerator scans - | the field's name for a mattching pattern. When found, these field are considered + | When creating resources from existing database, the code generator scans + | the field's name for a matching pattern. When found, these field are considered | foreign keys even when the database does not have a foreign constraints. | Here you can specify patterns to help the generator understand your - | database naming convension. + | database naming conversion. | */ 'common_key_patterns' => [ @@ -338,10 +324,23 @@ ], ], [ - 'match' => ['picture', 'file', 'photo', 'avatar'], + 'match' => ['picture', 'photo', 'avatar', 'image'], + 'set' => [ + 'is-on-index' => false, + 'html-type' => 'file', + 'data-type' => 'string', + 'data-type-params' => [255], + 'validation' => 'image', + ], + ], + [ + 'match' => ['file', 'document', 'attachment*'], 'set' => [ 'is-on-index' => false, 'html-type' => 'file', + 'data-type' => 'string', + 'data-type-params' => [255], + 'validation' => 'file', ], ], [ @@ -373,7 +372,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, @@ -464,7 +463,7 @@ /* |-------------------------------------------------------------------------- - | A string to postfix the api-resource name with. + | A string to post fix the api-resource name with. |-------------------------------------------------------------------------- | | If you don't like to post fix the api-resource with "Resource" you can @@ -475,7 +474,7 @@ /* |-------------------------------------------------------------------------- - | A string to postfix the collection-api-resource name with. + | A string to post fix the collection-api-resource name with. |-------------------------------------------------------------------------- | | If you don't like to post fix the collection-api-resource with "Collection" @@ -495,7 +494,7 @@ /* |-------------------------------------------------------------------------- - | A string to postfix the form-request name with. + | A string to post fix the form-request name with. |-------------------------------------------------------------------------- | | If you don't like to post fix the form-request with "FormRequest" you can @@ -506,7 +505,7 @@ /* |-------------------------------------------------------------------------- - | Defining non-english or irregular plurals + | Defining non-English or irregular plurals |-------------------------------------------------------------------------- | | The code-generator heavily uses Laravel helpers "str_plural()" @@ -533,10 +532,9 @@ | The "key" of the array is the value to be used in the locale files. | The "text" key of the sub array, is the string to display in the view or add to the locale files. | The "template" key of the sub array, is the string to be use in the view for replacement. - | The "in-function-with-collective" key of the sub array, tell the generator that, | this string would be used in a function or not. | - | The follwowing templates can be used. Assuming the model name is AssetCategory + | The following templates can be used. Assuming the model name is AssetCategory | [% model_name %] <=> "asset category" | [% model_name_sentence %] <=> "Asset category" | [% model_name_plural %] <=> "asset categories" @@ -570,7 +568,6 @@ 'delete' => [ 'text' => 'Delete [% model_name_title %]', 'template' => 'delete_model', - 'in-function-with-collective' => true, ], 'edit' => [ 'text' => 'Edit [% model_name_title %]', @@ -587,17 +584,14 @@ 'add' => [ 'text' => 'Add', 'template' => 'add', - 'in-function-with-collective' => true, ], 'update' => [ 'text' => 'Update', 'template' => 'update', - 'in-function-with-collective' => true, ], 'confirm_delete' => [ 'text' => 'Click Ok to delete [% model_name_title %].', 'template' => 'confirm_delete', - 'in-function-with-collective' => true, ], 'none_available' => [ 'text' => 'No [% model_name_plural_title %] Available.', @@ -658,7 +652,7 @@ 'template' => 'this_parameter_is_an_http_header', ], 'request_was_successful' => [ - 'text' => 'Request was successfull.', + 'text' => 'Request was successfully.', 'template' => 'request_was_successful', ], 'boolean_title' => [ @@ -807,7 +801,7 @@ | Here you can define labels to be used when creating the api-documentation. | You can define how would you like the text to be generated. | - | The follwowing templates can be used. Assuming the model name is AssetCategory + | The following templates can be used. Assuming the model name is AssetCategory | [% model_name %] <=> "asset category" | [% model_name_sentence %] <=> "Asset category" | [% model_name_plural %] <=> "asset categories" @@ -840,12 +834,12 @@ 'the_total_of_available_pages' => 'The total of the available pages.', 'store_route_description' => 'Create new [% model_name %].', 'store_route_response_description' => 'The API\'s response will be JSON based data. The JSON object will be structured as follow', - 'update_route_description' => 'Update existsing [% model_name %].', + 'update_route_description' => 'Update existing [% model_name %].', 'update_route_response_description' => 'The API\'s response will be JSON based data. The JSON object will be structured as follow', - 'show_route_description' => 'Retrieve existsing [% model_name %].', + 'show_route_description' => 'Retrieve existing [% model_name %].', 'show_route_response_description' => 'The API\'s response will be JSON based data. The JSON object will be structured as follow', 'the_id_of_model_to_retrieve' => 'The unique id of the [% model_name %] to retrieve', - 'destroy_route_description' => 'Delete existsing [% model_name %].', + 'destroy_route_description' => 'Delete existing [% model_name %].', 'destroy_route_response_description' => 'The API\'s response will be JSON based data. The JSON object will be structured as follow', 'the_id_of_model_to_delete' => 'The id of the [% model_name %] to delete.', 'general_description' => 'Allows you to list, create, edit, show and delete [% model_name_plural %].', @@ -898,6 +892,7 @@ 'macaddress' => 'macAddress', 'mediuminteger' => 'mediumInteger', 'mediumint' => 'mediumInteger', + 'tinytext' => 'tinyText', 'mediumtext' => 'mediumText', 'smallInteger' => 'smallInteger', 'smallint' => 'smallInteger', @@ -929,7 +924,7 @@ | Eloquent method to html-type mapping. |-------------------------------------------------------------------------- | - | This is the mapping used to convert database-column into html field + | This is the mapping used to convert database-column into HTML field | */ 'eloquent_type_to_html_type' => [ diff --git a/config/laravel-code-generator.php b/config/laravel-code-generator.php index a71cbbd..4eccd9a 100644 --- a/config/laravel-code-generator.php +++ b/config/laravel-code-generator.php @@ -7,14 +7,14 @@ | CodeGenerator config overrides |-------------------------------------------------------------------------- | - | It is a good idea to sperate your configuration form the code-generator's + | It is a good idea to separate your configuration form the code-generator's | own configuration. This way you won't lose any settings/preference | you have when upgrading to a new version of the package. | | Additionally, you will always know any the configuration difference between | the default config than your own. | - | To override the setting that is found in the codegenerator.php file, you'll + | To override the setting that is found in the 'config/default.php' file, you'll | need to create identical key here with a different value | | IMPORTANT: When overriding an option that is an array, the configurations 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..5f691e5 --- /dev/null +++ b/docs/docs/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 here](./resource-file#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/docs/configurations.md b/docs/docs/configurations.md new file mode 100644 index 0000000..3c0d860 --- /dev/null +++ b/docs/docs/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/docs/get-started.md b/docs/docs/get-started.md new file mode 100644 index 0000000..444af88 --- /dev/null +++ b/docs/docs/get-started.md @@ -0,0 +1,47 @@ +--- +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 +``` + +### 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/docs/intro.md b/docs/docs/intro.md new file mode 100644 index 0000000..c2ee0c5 --- /dev/null +++ b/docs/docs/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/docs/release-notes.md b/docs/docs/release-notes.md new file mode 100644 index 0000000..36fa413 --- /dev/null +++ b/docs/docs/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/docs/resource-file.md b/docs/docs/resource-file.md new file mode 100644 index 0000000..1de5a7d --- /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..35103f3 --- /dev/null +++ b/docs/docs/upgrade-guide.md @@ -0,0 +1,8 @@ +--- +sidebar_position: 5 +title: Upgrade Guide +--- + +## Version + +No additional steps needed to upgrade. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js new file mode 100644 index 0000000..fc31c78 --- /dev/null +++ b/docs/docusaurus.config.js @@ -0,0 +1,119 @@ +// @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: '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://laravel-code-generator.crestapps.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', + editUrl: + 'https://github.com/CrestApps/laravel-code-generator/edit/master/docs/', + }, + 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', + colorMode: { + defaultMode: 'dark', + disableSwitch: false + }, + navbar: { + logo: { + alt: 'CrestApps Logo', + src: 'img/crestapps-logo.png', + }, + items: [ + { + type: 'docSidebar', + sidebarId: 'docsSidebar', + position: 'left', + label: 'Documentations', + }, + { + type: 'docsVersionDropdown', + position: 'right', + lastVersion: '2.3.0', + dropdownActiveClassDisabled: true, + }, + { + href: 'https://github.com/MikeAlhayek/laravel-code-generator', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Laravel Code Generator', + items: [ + { + label: 'Documentation', + to: '/docs/intro', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'GitHub', + href: 'https://github.com/MikeAlhayek/laravel-code-generator', + } + ], + } + ], + 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..84705f3 --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,14851 @@ +{ + "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.1", + "@docusaurus/preset-classic": "^3.1.1", + "@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.1", + "@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.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.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", + "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.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", + "@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.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "dependencies": { + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "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.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "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.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", + "@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.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", + "@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.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.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "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.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", + "@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.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", + "@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.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", + "@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.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" + }, + "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.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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "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.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "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", + "@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.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "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", + "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.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", + "@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.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/react-loadable": "5.5.2", + "@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", + "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.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", + "postcss-sort-media-queries": "^4.4.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/logger": { + "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" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "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.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", + "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.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.1", + "@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/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.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", + "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-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.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", + "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-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.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" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "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.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.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" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "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.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.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "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.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.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "@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-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.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.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "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/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.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" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "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.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" + }, + "peerDependencies": { + "react": "^18.0.0", + "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", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/theme-classic": { + "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", + "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-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.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": "*", + "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.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.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", + "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.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" + }, + "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==", + "devOptional": true, + "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.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.1.1.tgz", + "integrity": "sha512-ZJfJa5cJQtRYtqijsPEnAZoduW6sjAQ7ZCWSZavLcV10Fw0Z3gSaPKA/B4micvj2afRZ4gZxT7KfYqe5H8Cetg==", + "dependencies": { + "@docusaurus/logger": "3.1.1", + "@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.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" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-validation": { + "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.1", + "@docusaurus/utils": "3.1.1", + "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.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": "*", + "@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.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.7.tgz", + "integrity": "sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A==", + "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.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-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" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "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.30001580", + "electron-to-chromium": "^1.4.648", + "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.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", + "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.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" + } + }, + "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..6b41950 --- /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.1", + "@docusaurus/preset-classic": "^3.1.1", + "@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.1", + "@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..0d35893 --- /dev/null +++ b/docs/src/pages/index.js @@ -0,0 +1,42 @@ +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}

    +
    + + View Documentations + +
    +
    +
    + ); +} + +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/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 0000000..1453170 Binary files /dev/null and b/docs/static/img/crestapps-logo.png differ diff --git a/docs/static/img/favicon.ico b/docs/static/img/favicon.ico new file mode 100644 index 0000000..72503fd Binary files /dev/null and b/docs/static/img/favicon.ico differ diff --git a/docs/versioned_docs/version-2.0.0/available-commands.md b/docs/versioned_docs/version-2.0.0/available-commands.md new file mode 100644 index 0000000..1dfcf63 --- /dev/null +++ b/docs/versioned_docs/version-2.0.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.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..f708c26 --- /dev/null +++ b/docs/versioned_docs/version-2.0.0/get-started.md @@ -0,0 +1,42 @@ +--- +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)! + +### 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.0.0/intro.md b/docs/versioned_docs/version-2.0.0/intro.md new file mode 100644 index 0000000..38977fc --- /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](./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 new file mode 100644 index 0000000..6da44cc --- /dev/null +++ b/docs/versioned_docs/version-2.0.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.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..1de5a7d --- /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..743c613 --- /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` | + | --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. | | + +::: + + +### 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..e0252fe --- /dev/null +++ b/docs/versioned_docs/version-2.1.0/get-started.md @@ -0,0 +1,44 @@ +--- +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)! + + +### 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.1.0/intro.md b/docs/versioned_docs/version-2.1.0/intro.md new file mode 100644 index 0000000..38977fc --- /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](./laravel-collective) 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..1de5a7d --- /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..1dfcf63 --- /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..7d87a34 --- /dev/null +++ b/docs/versioned_docs/version-2.2.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'); +} +``` + +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)! + + +### 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/intro.md b/docs/versioned_docs/version-2.2.0/intro.md new file mode 100644 index 0000000..38977fc --- /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](./laravel-collective) 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..1de5a7d --- /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..1dfcf63 --- /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..e0252fe --- /dev/null +++ b/docs/versioned_docs/version-2.3.0/get-started.md @@ -0,0 +1,44 @@ +--- +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)! + + +### 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/intro.md b/docs/versioned_docs/version-2.3.0/intro.md new file mode 100644 index 0000000..38977fc --- /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](./laravel-collective) 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..1de5a7d --- /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..5019377 --- /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 here](./resource-file#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..56a4c54 --- /dev/null +++ b/docs/versioned_docs/version-2.4.0/get-started.md @@ -0,0 +1,42 @@ +--- +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)! + + +### 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/intro.md b/docs/versioned_docs/version-2.4.0/intro.md new file mode 100644 index 0000000..38977fc --- /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](./laravel-collective) 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..1de5a7d --- /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..5f691e5 --- /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 here](./resource-file#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..08f4a87 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0/get-started.md @@ -0,0 +1,50 @@ +--- +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 +``` + + +### 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/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..1de5a7d --- /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 new file mode 100644 index 0000000..7b1c0a5 --- /dev/null +++ b/docs/versions.json @@ -0,0 +1,8 @@ +[ + "3.0.0", + "2.4.0", + "2.3.0", + "2.2.0", + "2.1.0", + "2.0.0" +] 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": {} +} diff --git a/src/CodeGeneratorServiceProvider.php b/src/CodeGeneratorServiceProvider.php index c884823..d6f52ca 100644 --- a/src/CodeGeneratorServiceProvider.php +++ b/src/CodeGeneratorServiceProvider.php @@ -26,11 +26,6 @@ public function boot() $this->publishes([ $dir . 'templates/default' => $this->codeGeneratorBase('templates/default'), ], 'default-template'); - - // publish the defaultcollective-template - $this->publishes([ - $dir . 'templates/default-collective' => $this->codeGeneratorBase('templates/default-collective'), - ], 'default-collective-template'); } /** @@ -69,7 +64,7 @@ public function register() 'CrestApps\CodeGenerator\Commands\ApiDocs\CreateApiDocsControllerCommand', 'CrestApps\CodeGenerator\Commands\ApiDocs\CreateApiDocsScaffoldCommand', 'CrestApps\CodeGenerator\Commands\ApiDocs\CreateApiDocsViewCommand', - 'CrestApps\CodeGenerator\Commands\Resources\ResourceFileFromDatabaseAllCommand' + 'CrestApps\CodeGenerator\Commands\Resources\ResourceFileFromDatabaseAllCommand' ]; if (Helpers::isNewerThanOrEqualTo()) { diff --git a/src/Commands/Api/CreateApiControllerCommand.php b/src/Commands/Api/CreateApiControllerCommand.php index f2ae243..7b1261f 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 authentication 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 []; } @@ -267,7 +267,7 @@ protected function getSuccessCall($modelName, array $fields, $method) { $stub = $this->getStubContent('api-controller-call-' . $method . '-success-method'); - $viewLabels = new ViewLabelsGenerator($modelName, $fields, $this->isCollectiveTemplate()); + $viewLabels = new ViewLabelsGenerator($modelName, $fields); $this->replaceModelName($stub, $modelName) ->replaceStandardLabels($stub, $viewLabels->getLabels()) @@ -289,7 +289,7 @@ protected function getApiResourceCall($modelName, $fields, $method) { $stub = $this->getStubContent('api-controller-call-' . $method . '-api-resource'); - $viewLabels = new ViewLabelsGenerator($modelName, $fields, $this->isCollectiveTemplate()); + $viewLabels = new ViewLabelsGenerator($modelName, $fields); $this->replaceModelName($stub, $modelName) ->replaceStandardLabels($stub, $viewLabels->getLabels()) @@ -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::makeApiControllerName($modelName); + $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/CreateApiResourceCommand.php b/src/Commands/Api/CreateApiResourceCommand.php index 53284b6..fc327e3 100644 --- a/src/Commands/Api/CreateApiResourceCommand.php +++ b/src/Commands/Api/CreateApiResourceCommand.php @@ -37,8 +37,7 @@ class CreateApiResourceCommand extends Command {--api-resource-collection-name= : The api-resource-collection file name.} {--model-directory= : The path where the model should be created under.} {--template-name= : The template name to use when generating the code.} - {--collection : Create a resource collection.} - {--api-version= : The api version to prefix your resurces with.} + {--api-version= : The api version to prefix your resources with.} {--force : Override the model if one already exists.}'; /** @@ -58,22 +57,22 @@ public function handle() $input = $this->getCommandInput(); $resource = Resource::fromFile($input->resourceFile, 'CrestApps'); - $apiResourceFileName = $this->getApiFileName($input->modelName, $input->isCollection); + $apiResourceFileName = $this->getApiFileName($input->modelName); - $destenationFile = $this->getDestenationFile($apiResourceFileName, $input->isCollection); + $destenationFile = $this->getDestenationFile($apiResourceFileName); - if ($this->hasErrors($resource, $destenationFile, $input->isCollection)) { + if ($this->hasErrors($resource, $destenationFile)) { return false; } - $stub = $this->getStubContent($this->getFileTitle($input->isCollection)); - $viewLabels = new ViewLabelsGenerator($input->modelName, $resource->fields, $this->isCollectiveTemplate()); + $stub = $this->getStubContent($this->getFileTitle()); + $viewLabels = new ViewLabelsGenerator($input->modelName, $resource->fields); - return $this->replaceNamespace($stub, $this->getClassNamepace($input->isCollection)) - ->replaceModelApiArray($stub, $this->getModelApiArray($resource->fields, $input->modelName, $input->isCollection)) + return $this->replaceNamespace($stub, $this->getClassNamepace()) + ->replaceModelApiArray($stub, $this->getModelApiArray($resource->fields, $input->modelName)) ->replaceApiResourceClass($stub, $apiResourceFileName) ->replaceApiResourceCollectionClass($stub, $this->getApiResourceCollectionClassName($input->modelName)) - ->replaceTransformMethod($stub, $this->getTransformMethod($input, $resource->fields, $input->isCollection, $input->isCollection)) + ->replaceTransformMethod($stub, $this->getTransformMethod($input, $resource->fields)) ->replaceStandardLabels($stub, $viewLabels->getLabels()) ->replaceModelName($stub, $input->modelName) ->replaceModelFullname($stub, self::getModelNamespace($input->modelName, $input->modelDirectory)) @@ -82,35 +81,24 @@ public function handle() } /** - * Gets the namespace for the api class. - * - * @param bool $isCollection + * Gets the namespace for the API class. * * @return string */ - protected function getClassNamepace($isCollection) + protected function getClassNamepace() { - if ($isCollection) { - return $this->getApiResourceCollectionNamespace(); - } - return $this->getApiResourceNamespace(); } /** - * Gets the file name for the api class. + * Gets the file name for the API class. * * @param string $modelName - * @param bool $isCollection * * @return string */ - protected function getApiFileName($modelName, $isCollection) + protected function getApiFileName($modelName) { - if ($isCollection) { - return $this->getApiResourceCollectionClassName($modelName); - } - return $this->getApiResourceClassName($modelName); } @@ -123,10 +111,10 @@ protected function getApiFileName($modelName, $isCollection) * * @return bool */ - protected function hasErrors(Resource $resource, $destenationFile, $isCollection) + protected function hasErrors(Resource $resource, $destenationFile) { $hasErrors = false; - $title = $this->getFileTitle($isCollection); + $title = $this->getFileTitle(); if ($resource->isProtected($title)) { $this->warn('The ' . $title . ' is protected and cannot be regenerated. To regenerate the file, unprotect it from the resource-file.'); @@ -144,22 +132,15 @@ protected function hasErrors(Resource $resource, $destenationFile, $isCollection } /** - * Gets the destenation file to be created. + * Gets the destination file to be created. * * @param string $name - * @param bool $isCollection * * @return string */ - protected function getDestenationFile($name, $isCollection = false) - { - if ($isCollection) { - $path = $this->getApiResourceCollectionPath(); - } else { - $path = $this->getApiResourcePath(); - } - - $path = Str::trimStart($path, Helpers::getAppNamespace()); + protected function getDestenationFile($name) + { + $path = Str::trimStart($this->getApiResourcePath(), Helpers::getAppNamespace()); return app_path($path . $name . '.php'); } @@ -174,7 +155,6 @@ protected function getCommandInput() $modelName = trim($this->argument('model-name')); $resourceFile = trim($this->option('resource-file')) ?: Helpers::makeJsonFileName($modelName); $template = $this->getTemplateName(); - $isCollection = $this->option('collection'); $modelDirectory = trim($this->option('model-directory')); $apiVersion = trim($this->option('api-version')); @@ -182,7 +162,6 @@ protected function getCommandInput() 'modelName', 'resourceFile', 'template', - 'isCollection', 'modelDirectory' ); } diff --git a/src/Commands/Api/CreateApiScaffoldCommand.php b/src/Commands/Api/CreateApiScaffoldCommand.php index 4fcd620..2368326 100644 --- a/src/Commands/Api/CreateApiScaffoldCommand.php +++ b/src/Commands/Api/CreateApiScaffoldCommand.php @@ -22,7 +22,7 @@ class CreateApiScaffoldCommand extends CreateScaffoldCommandBase */ protected $signature = 'create:api-scaffold {model-name : The model name that this resource 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. } {--controller-extends=default-controller : The base controller to be extend.} {--model-directory= : The path of the model.} @@ -34,10 +34,10 @@ class CreateApiScaffoldCommand extends CreateScaffoldCommandBase {--models-per-page=25 : The amount of models per page for index pages.} {--language-filename= : The languages file name to put the labels in.} {--with-form-request : This will extract the validation into a request form class.} - {--with-auth : Generate the controller with Laravel auth middlewear. } + {--with-auth : Generate the controller with Laravel authentication middleware. } {--table-name= : The name of the table.} {--primary-key=id : The name of the primary key.} - {--with-soft-delete : Enables softdelete future should be enable in the model.} + {--with-soft-delete : Enables soft-delete future should be enable in the model.} {--without-languages : Generate the resource without the language files. } {--without-model : Generate the resource without the model file. } {--without-controller : Generate the resource without the controller file. } @@ -49,13 +49,13 @@ class CreateApiScaffoldCommand extends CreateScaffoldCommandBase {--engine-name= : A specific engine name.} {--template-name= : The template name to use when generating the code.} {--table-exists : This option will attempt to fetch the field from existing database table.} - {--translation-for= : A comma seperated string of languages to create fields for.} + {--translation-for= : A comma separated string of languages to create fields for.} {--with-api-resource : Generate the controller with both api-resource and api-resource-collection classes.} {--with-api-docs : Create full api documentation.} {--api-resource-directory= : The directory where the api-resource should be created.} {--api-resource-collection-directory= : The directory where the api-resource-collection should be created.} {--api-resource-name= : The api-resource file name.} - {--api-version= : The api version to prefix your resurces with.} + {--api-version= : The api version to prefix your resources with.} {--api-resource-collection-name= : The api-resource-collection file name.} {--force : This option will override the controller if one already exists.}'; @@ -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::makeApiControllerName($input->modelName); $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..1af1c67 100644 --- a/src/Commands/ApiDocs/CreateApiDocsControllerCommand.php +++ b/src/Commands/ApiDocs/CreateApiDocsControllerCommand.php @@ -35,16 +35,16 @@ class CreateApiDocsControllerCommand extends ControllerCommandBase */ protected $signature = 'api-docs:create-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.} {--views-directory= : The path where the views 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 authentication middlewere. } {--template-name= : The template name to use when generating the code.} {--controller-extends=default-controller : The base controller to be extend.} - {--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.}'; /** @@ -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::makeApiDocsControllerName($modelName); $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..24c76b4 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. @@ -33,16 +35,16 @@ class CreateApiDocsScaffoldCommand extends command */ protected $signature = 'api-docs:scaffold {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.} {--views-directory= : The path where the views 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 authentication middleware. } {--template-name= : The template name to use when generating the code.} {--controller-extends=default-controller : The base controller to be extend.} - {--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.}'; /** @@ -143,7 +145,7 @@ protected function createRoutes($input) } /** - * Executes the command that generates the lanaguage entries. + * Executes the command that generates the language entries. * * @param object $input * @@ -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::makeApiDocsControllerName($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..ab2b798 100644 --- a/src/Commands/ApiDocs/CreateApiDocsViewCommand.php +++ b/src/Commands/ApiDocs/CreateApiDocsViewCommand.php @@ -26,7 +26,7 @@ class CreateApiDocsViewCommand extends Command * * @var string */ - protected $description = 'Create view to render the api-documenations.'; + protected $description = 'Create view to render the api-documentations.'; /** * The name and signature of the console command. @@ -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 authentication 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.}'; @@ -64,7 +64,7 @@ public function handle() $stub = $this->getStubContent('api-documentation-index'); - $viewLabels = new ViewLabelsGenerator($input->modelName, $resource->fields, $this->isCollectiveTemplate()); + $viewLabels = new ViewLabelsGenerator($input->modelName, $resource->fields); // The replaceAuthorizedRequestForIndex() method must be executed before replaceAuthorizationCall() return $this->replaceAuthorizedRequestForIndex($stub, $this->getAuthorizedRequestForIndex($input->withAuth, $resource->getApiDocLabels(), $viewLabels->getLabels())) @@ -121,7 +121,7 @@ protected function getFailedAuthorizationCall($withAuth) } /** - * It gets the views destenation path + * It gets the views destination path * * @param $viewsDirectory * @@ -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 @@ -346,7 +346,7 @@ protected function getValidationRules(Field $field) } /** - * It generate the destenation view name + * It generate the destination view name * * @param $action * @@ -370,7 +370,7 @@ protected function hasErrors(Resource $resource, $destenationFile) $hasErrors = false; if ($resource->isProtected('api-documentation')) { - $this->warn('The api-documentation is protected and cannot be regenerated. To regenerate the file, unprotect it from the resource file.'); + $this->warn('The api-documentation is protected and cannot be regenerated. To regenerate the file, unprotected it from the resource file.'); $hasErrors = true; } @@ -548,7 +548,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::makeApiDocsControllerName($modelName); $controllerDirectory = trim($this->option('controller-directory')); $viewsDirectory = trim($this->option('views-directory')); $layoutName = trim($this->option('layout-name')); diff --git a/src/Commands/Bases/ControllerCommandBase.php b/src/Commands/Bases/ControllerCommandBase.php index 0f75c83..bbfaef0 100644 --- a/src/Commands/Bases/ControllerCommandBase.php +++ b/src/Commands/Bases/ControllerCommandBase.php @@ -289,7 +289,7 @@ protected function getConstructor($withAuth) } /** - * Gets name of the middleware + * Gets name of the middleware. * * @return string */ @@ -316,7 +316,7 @@ protected function getControllerExtends($namespace) } /** - * Gets the controllers namespace + * Gets the controllers namespace. * * @param string $path * @@ -330,7 +330,7 @@ protected function getControllersNamespace($path) } /** - * Gets the destenation file to be created. + * Gets the destination file to be created. * * @param string $name * @param string $path @@ -349,7 +349,7 @@ protected function getDestenationFile($name, $path) } /** - * Gets the full class name to extend + * Gets the full class name to extend. * * @return string */ @@ -369,7 +369,7 @@ protected function getFullClassToExtend() } /** - * Gets the default class name to extend + * Gets the default class name to extend. * * @param string $extend * @@ -438,7 +438,7 @@ protected function getOnUpdateAction(array $fields) } /** - * Gets the relation accessor for the given foreign renationship. + * Gets the relation accessor for the given foreign relationship. * * @param CrestApps\CodeGenerator\Models\ForeignRelationship $collection * @@ -675,7 +675,7 @@ protected function makeFormRequest($input) } /** - * Replaces the auth middleware + * Replaces the authentication middleware. * * @param string $stub * @param string $middleware @@ -701,10 +701,10 @@ protected function replaceCallDataMethod(&$stub, $code) } /** - * Replaces the auth contructor + * Replaces the auth constructor * * @param string $stub - * @param string $contructor + * @param string $constructor * * @return $this */ @@ -805,7 +805,7 @@ protected function replaceRelationCollections(&$stub, $collections) } /** - * Replace sthe form-request's fullname for the given stub. + * Replaces the form-request's full name for the given stub. * * @param string $stub * @param string $name @@ -844,7 +844,7 @@ protected function replaceRequestVariable(&$stub, $variable) } /** - * It Replaces the templates of the givin $labels + * It Replaces the templates of the given $labels * * @param string $stub * @param array $items @@ -917,7 +917,7 @@ protected function processCommonTasks($input, $resource, &$stub) $dataMethod = $this->getDataMethod($resource->fields, $this->requestNameSpace . '\\' . $this->requestName, $input); $languages = array_keys(self::getLanguageItems($resource->fields)); - $viewLabels = new ViewLabelsGenerator($input->modelName, $resource->fields, $this->isCollectiveTemplate()); + $viewLabels = new ViewLabelsGenerator($input->modelName, $resource->fields); $namespacesToUse = $this->getRequiredUseClasses($resource->fields, $this->getAdditionalNamespaces($input)); return $this->replaceGetDataMethod($stub, $dataMethod) @@ -945,7 +945,7 @@ protected function processCommonTasks($input, $resource, &$stub) } /** - * Gets any additional classes to include in the use statement + * Gets any additional classes to include in the use statement. * * @param object $input * @@ -1002,7 +1002,7 @@ protected function getControllerStubName() } /** - * Gets the path to controllers + * Gets the path to controllers. * * @param string $file * @@ -1011,7 +1011,7 @@ protected function getControllerStubName() abstract protected function getControllerPath($file = ''); /** - * Gets the type of the controller + * Gets the type of the controller. * * @return string */ diff --git a/src/Commands/Bases/ControllerRequestCommandBase.php b/src/Commands/Bases/ControllerRequestCommandBase.php index 6f8b628..f6e2161 100644 --- a/src/Commands/Bases/ControllerRequestCommandBase.php +++ b/src/Commands/Bases/ControllerRequestCommandBase.php @@ -50,7 +50,7 @@ protected function getFillables(array $fields) } /** - * Gets laravel ready field validation format from a given string + * Gets Laravel ready field validation format from a given string * * @param array $fields * @@ -81,7 +81,7 @@ protected function getValidationRules(array $fields) } /** - * Gets laravel ready field validation format for a given field + * Gets Laravel ready field validation format for a given field * * @param CrestApps\CodeGenerator\Models\Field $field * @param string $customRules @@ -167,7 +167,7 @@ protected function extractCustomValidationRules(array $rules) } /** - * Checks if the givin rule is a custom validation rule + * Checks if the given rule is a custom validation rule * * @param string $rule * @@ -205,7 +205,7 @@ protected function getCustomRuleShortName($rule) } /** - * Checks if a class name starts with a slash \ + * Checks if a class name starts with a slash \. * * @param string $fullname * @@ -217,7 +217,7 @@ protected function canHaveUsingCommand($fullname) } /** - * Get the full class name of the given custom valiation rule. + * Get the full class name of the given custom validation rule. * * @param string $rule * @@ -347,7 +347,7 @@ protected function getStringToNullSnippet(array $fields) } /** - * Gets the method's stub that handels the file uploading. + * Gets the method's stub that handles the file uploading. * * @param array $fields * @param string $baseClass @@ -412,7 +412,7 @@ protected function replaceFileValidationSnippet(&$stub, $snippet) } /** - * Replaces the fillable snippet for the given stub. + * Replaces the fallible snippet for the given stub. * * @param string $fillable * diff --git a/src/Commands/Bases/ResourceFileCommandBase.php b/src/Commands/Bases/ResourceFileCommandBase.php index c029390..39d51bc 100644 --- a/src/Commands/Bases/ResourceFileCommandBase.php +++ b/src/Commands/Bases/ResourceFileCommandBase.php @@ -25,7 +25,7 @@ protected function getResources($file, array $languages = []) } /** - * Gets the destenation filename. + * Gets the destination filename. * * @param string $name * diff --git a/src/Commands/Bases/ViewsCommandBase.php b/src/Commands/Bases/ViewsCommandBase.php index c9e228c..3c9c92b 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,9 +138,9 @@ 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()); + $viewLabels = new ViewLabelsGenerator($input->modelName, $fields); $standardLabels = $viewLabels->getLabels(); @@ -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 */ @@ -270,10 +270,6 @@ protected function replaceFileUpload(&$stub, array $fields) */ protected function getFileUploadAttribute($template) { - if ($this->isCollectiveTemplate($template)) { - return "'files' => true,"; - } - return ' enctype="multipart/form-data"'; } @@ -309,7 +305,7 @@ protected function getViewCommand($view) } /** - * It checks of a destination view exists or not + * It checks of a destination view exists or not. * * @param string $viewsDirectory * @param string $routesPrefix @@ -325,7 +321,7 @@ protected function isViewExists($viewsDirectory, $routesPrefix, $viewName) } /** - * It called tha create-locale command to generate the locale config + * It calls the create-locale command to generate the locale config * * @param string $langFile * @param string $fields @@ -347,7 +343,7 @@ protected function createLanguageFile($langFile, $resourceFile, $modelName) } /** - * Gets destenation view path + * Gets destination view path * * @param string $viewsDirectory * @param string $routesPrefix @@ -395,7 +391,7 @@ protected function getHeaderFieldAccessor(array $fields, $modelName) } /** - * Gets a new instance of the proper html generator. + * Gets a new instance of the proper HTML generator. * * @param array $fields * @param string $modelName @@ -405,15 +401,11 @@ protected function getHeaderFieldAccessor(array $fields, $modelName) */ protected function getHtmlGenerator(array $fields, $modelName, $template) { - if ($this->isCollectiveTemplate($template)) { - return new LaravelCollectiveHtml($fields, $modelName, $template); - } - return new StandardHtml($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/Framework/CreateControllerCommand.php b/src/Commands/Framework/CreateControllerCommand.php index 1a56ec4..2d510e2 100644 --- a/src/Commands/Framework/CreateControllerCommand.php +++ b/src/Commands/Framework/CreateControllerCommand.php @@ -23,7 +23,7 @@ class CreateControllerCommand extends ControllerCommandBase */ protected $signature = 'create: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.} {--views-directory= : The path where the views should be created under.} @@ -33,7 +33,7 @@ class CreateControllerCommand 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 authentication 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.} diff --git a/src/Commands/Framework/CreateFormRequestCommand.php b/src/Commands/Framework/CreateFormRequestCommand.php index 0bacb31..53a9e11 100644 --- a/src/Commands/Framework/CreateFormRequestCommand.php +++ b/src/Commands/Framework/CreateFormRequestCommand.php @@ -21,7 +21,7 @@ class CreateFormRequestCommand extends ControllerRequestCommandBase {--resource-file= : The name of the resource-file to import from.} {--routes-prefix=default-form : Prefix of the route group.} {--template-name= : The template name to use when generating the code.} - {--with-auth : Generate the form-request with Laravel auth middlewear. } + {--with-auth : Generate the form-request with Laravel authentication middleware. } {--form-request-directory= : The directory of the form-request.} {--force : This option will override the form-request if one already exists.}'; @@ -119,7 +119,7 @@ protected function getDataMethod(array $fields) } /** - * Gets the boolean value that the autherize() method will return. + * Gets the boolean value that the authorize() method will return. * * @param array $fields * @@ -176,7 +176,7 @@ protected function isConvertEmptyStringsToNullRegistered() } /** - * Gets the destenation's fullname + * Gets the destination's full name. * * @param string $name * @param string $path @@ -189,7 +189,7 @@ protected function getDestenationFile($name, $path) } /** - * Gets the Requests namespace + * Gets the Requests namespace. * * @param string $path * diff --git a/src/Commands/Framework/CreateLanguageCommand.php b/src/Commands/Framework/CreateLanguageCommand.php index 67d3587..5b60d4e 100644 --- a/src/Commands/Framework/CreateLanguageCommand.php +++ b/src/Commands/Framework/CreateLanguageCommand.php @@ -66,7 +66,7 @@ public function handle() } /** - * Gets the destenation file. + * Gets the destination file. * * @param CrestApps\CodeGenerator\Models\Resource $resource * @param string $modelName @@ -83,7 +83,7 @@ protected function getAvailableLabels(Resource $resource, $modelName) $languages[$lang] = array_merge($current, $docLabels); } - $viewLabels = new ViewLabelsGenerator($modelName, $resource->fields, $this->isCollectiveTemplate()); + $viewLabels = new ViewLabelsGenerator($modelName, $resource->fields); $standardLabels = $viewLabels->getTranslatedLabels(array_keys($languages)); //Merge the standard labels to the fields label @@ -95,7 +95,7 @@ protected function getAvailableLabels(Resource $resource, $modelName) } /** - * Gets the destenation file. + * Gets the destination file. * * @param array $path * @param string $name @@ -127,7 +127,7 @@ protected function registerMessages(array $messages, $language) } /** - * Checks if a languge has a key int he in-memory collection. + * Checks if a language has a key int he in-memory collection. * * @param string $key * @param string $language @@ -299,7 +299,7 @@ protected function getMessage(Label $label) } /** - * Replace the messages fo the given stub. + * Replace the messages from the given stub. * * @param string $stub * @param string $messages diff --git a/src/Commands/Framework/CreateMappedResourcesCommand.php b/src/Commands/Framework/CreateMappedResourcesCommand.php index 6629404..4489a31 100644 --- a/src/Commands/Framework/CreateMappedResourcesCommand.php +++ b/src/Commands/Framework/CreateMappedResourcesCommand.php @@ -26,11 +26,11 @@ class CreateMappedResourcesCommand extends Command {--models-per-page=25 : The amount of models per page for index pages.} {--language-filename= : The languages file name to put the labels in.} {--table-name= : The name of the table.} - {--controller-name= : The name of the controler.} + {--controller-name= : The name of the controller.} {--with-form-request : This will extract the validation into a request form class.} - {--with-auth : Generate the controller with Laravel auth middlewear. } + {--with-auth : Generate the controller with Laravel authentication middleware. } {--with-migration : Prevent creating a migration for this resource.} - {--with-soft-delete : Enables softdelete future should be enable in the model.} + {--with-soft-delete : Enables soft-delete future should be enable in the model.} {--without-timestamps : Prevent Eloquent from maintaining both created_at and the updated_at properties.} {--without-languages : Generate the resource without the language files. } {--without-model : Generate the resource without the model file. } @@ -44,7 +44,7 @@ class CreateMappedResourcesCommand extends Command {--table-exists : This option will attempt to fetch the field from existing database table.} {--routes-prefix=default-form : Prefix of the route group.} {--primary-key=id : The name of the primary key.} - {--translation-for= : A comma seperated string of languages to create fields for.} + {--translation-for= : A comma separated string of languages to create fields for.} {--form-request-directory= : The directory of the form-request.} {--mapping-filename= : The name of the resource mapping file.} {--force : This option will override the controller if one already exists.}'; @@ -195,7 +195,7 @@ protected function getMappingFile() } /** - * Gets the value of a property of a givig object if exists. + * Gets the value of a property of a given object if exists. * * @param object $object * @param string $name diff --git a/src/Commands/Framework/CreateMigrationCommand.php b/src/Commands/Framework/CreateMigrationCommand.php index 346f14d..df9eadf 100644 --- a/src/Commands/Framework/CreateMigrationCommand.php +++ b/src/Commands/Framework/CreateMigrationCommand.php @@ -38,7 +38,7 @@ class CreateMigrationCommand extends MigrationCommandBase {--resource-file= : The name of the resource-file to import from.} {--template-name= : The template name to use when generating the code.} {--without-timestamps : Prevent Eloquent from maintaining both created_at and the updated_at properties.} - {--with-soft-delete : Enables softdelete future should be enable in the model.} + {--with-soft-delete : Enables soft-delete future should be enable in the model.} {--force : This option will override the migration if one already exists.}'; /** @@ -197,7 +197,7 @@ protected function getMigrationCapsule(MigrationInput $input, $resource, $name, } /** - * Gets migration fullname + * Gets migration full name. * * @param string $name * @param string $tableName @@ -329,7 +329,7 @@ protected function addForeignConstraints(&$properties, array $constraints) } /** - * Gets Foreign contstrains from given fields. + * Gets Foreign constrains from given fields. * * @param array of CrestApps\CodeGenerator\Models\Field $field * @@ -573,7 +573,7 @@ protected function getMethodParamerters(Field $field) } /** - * Constructs the second parameter to the enum type method + * Constructs the second parameter to the Enum type method * * @param CrestApps\CodeGenerator\Models\Field $field * @@ -632,7 +632,7 @@ protected function getPropertyBase($method) } /** - * Creates a leading space to keep the lines alligned the same in the output file. + * Creates a leading space to keep the lines aligned the same in the output file. * * @param int $multiplier * @param bool $prependNewline @@ -1141,7 +1141,7 @@ protected function addPrimaryField(&$property, Field $field = null) } /** - * Adds 'updated_at' and 'created_at' columns to a given propery. + * Adds 'updated_at' and 'created_at' columns to a given property. * * @param string $property * @param bool $without @@ -1159,7 +1159,7 @@ protected function addTimestamps(&$property, $without = false) } /** - * Adds 'delete_at' columns to a given propery. + * Adds 'delete_at' columns to a given property. * * @param string $property * @param bool $withSoftDelete diff --git a/src/Commands/Framework/CreateModelCommand.php b/src/Commands/Framework/CreateModelCommand.php index 077834f..ae29807 100644 --- a/src/Commands/Framework/CreateModelCommand.php +++ b/src/Commands/Framework/CreateModelCommand.php @@ -38,7 +38,7 @@ class CreateModelCommand extends Command {--resource-file= : The name of the resource-file to import from.} {--language-filename= : The languages file name to put the labels in.} {--model-directory= : The directory where the model should be created.} - {--with-soft-delete : Enables softdelete future should be enable in the model.} + {--with-soft-delete : Enables soft-delete future should be enable in the model.} {--without-timestamps : Prevent Eloquent from maintaining both created_at and the updated_at properties.} {--template-name= : The template name to use when generating the code.} {--model-extends=default-model : The base model to be extend.} @@ -131,7 +131,7 @@ protected function hasErrors(Resource $resource, $destenationFile) } /** - * Gets the destenation file to be created. + * Gets the destination file to be created. * * @param string $name * @param string $path @@ -473,13 +473,13 @@ protected function getRelationMethods(array $relations, array $fields) /** * Wraps each non-empty item in an array with single quote. * - * @param array $arrguments + * @param array $arguments * * @return string */ - protected function joinArguments(array $arrguments) + protected function joinArguments(array $arguments) { - return implode(',', Arr::wrapItems(Arr::removeEmptyItems($arrguments))); + return implode(',', Arr::wrapItems(Arr::removeEmptyItems($arguments))); } /** @@ -875,7 +875,7 @@ protected function replacePrimaryKey(&$stub, $primaryKey) } /** - * Replaces the replationships for the given stub. + * Replaces the relationships for the given stub. * * @param $stub * @param array $relationMethods @@ -888,7 +888,7 @@ protected function replaceRelationshipPlaceholder(&$stub, array $relationMethods } /** - * Replaces the replation type for the given stub. + * Replaces the relation type for the given stub. * * @param string $stub * @param string $type @@ -901,7 +901,7 @@ protected function replaceRelationType(&$stub, $type) } /** - * Replaces the replation name for the given stub. + * Replaces the relation name for the given stub. * * @param string $stub * @param string $name @@ -914,7 +914,7 @@ protected function replaceRelationName(&$stub, $name) } /** - * Replaces the replation params for the given stub. + * Replaces the relation parameters for the given stub. * * @param string $stub * @param string $params diff --git a/src/Commands/Framework/CreateResourcesCommand.php b/src/Commands/Framework/CreateResourcesCommand.php index 717d060..e592276 100644 --- a/src/Commands/Framework/CreateResourcesCommand.php +++ b/src/Commands/Framework/CreateResourcesCommand.php @@ -16,7 +16,7 @@ class CreateResourcesCommand extends Command */ protected $signature = 'create:resources {model-name : The model name that this resource 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. } {--controller-extends=default-controller : The base controller to be extend.} {--model-directory= : The path of the model.} @@ -28,10 +28,10 @@ class CreateResourcesCommand extends Command {--models-per-page=25 : The amount of models per page for index pages.} {--language-filename= : The languages file name to put the labels in.} {--with-form-request : This will extract the validation into a request form class.} - {--with-auth : Generate the controller with Laravel auth middlewear. } + {--with-auth : Generate the controller with Laravel authentication middleware. } {--table-name= : The name of the table.} {--primary-key=id : The name of the primary key.} - {--with-soft-delete : Enables softdelete future should be enable in the model.} + {--with-soft-delete : Enables soft-delete future should be enable in the model.} {--without-languages : Generate the resource without the language files. } {--without-model : Generate the resource without the model file. } {--without-controller : Generate the resource without the controller file. } @@ -45,7 +45,7 @@ class CreateResourcesCommand extends Command {--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.} {--table-exists : This option will attempt to fetch the field from existing database table.} - {--translation-for= : A comma seperated string of languages to create fields for.} + {--translation-for= : A comma separated string of languages to create fields for.} {--force : This option will override the controller if one already exists.}'; /** @@ -72,7 +72,7 @@ public function handle() } /** - * Get a commbined array of arguments and callable options. + * Get a combined array of arguments and callable options. * * @return array */ diff --git a/src/Commands/Framework/CreateRoutesCommand.php b/src/Commands/Framework/CreateRoutesCommand.php index c8bbda6..781a160 100644 --- a/src/Commands/Framework/CreateRoutesCommand.php +++ b/src/Commands/Framework/CreateRoutesCommand.php @@ -28,7 +28,7 @@ class CreateRoutesCommand extends Command {--controller-directory= : The directory where the controller is under.} {--without-route-clause : Create the routes without where clause for the id.} {--routes-type= : The type of the route to create. (i.e., "api", "api-docs" or "web".)} - {--api-version= : The api version to prefix your resurces with.} + {--api-version= : The api version to prefix your resources with.} {--template-name= : The template name to use when generating the code.}'; /** diff --git a/src/Commands/Framework/CreateScaffoldCommand.php b/src/Commands/Framework/CreateScaffoldCommand.php index bf05f12..1748b3c 100644 --- a/src/Commands/Framework/CreateScaffoldCommand.php +++ b/src/Commands/Framework/CreateScaffoldCommand.php @@ -16,7 +16,7 @@ class CreateScaffoldCommand extends CreateScaffoldCommandBase */ protected $signature = 'create:scaffold {model-name : The model name that this resource 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. } {--controller-extends=default-controller : The base controller to be extend.} {--model-directory= : The path of the model.} @@ -29,10 +29,10 @@ class CreateScaffoldCommand extends CreateScaffoldCommandBase {--models-per-page=25 : The amount of models per page for index pages.} {--language-filename= : The languages file name to put the labels in.} {--with-form-request : This will extract the validation into a request form class.} - {--with-auth : Generate the controller with Laravel auth middlewear. } + {--with-auth : Generate the controller with Laravel authentication middleware. } {--table-name= : The name of the table.} {--primary-key=id : The name of the primary key.} - {--with-soft-delete : Enables softdelete future should be enable in the model.} + {--with-soft-delete : Enables soft-delete future should be enable in the model.} {--without-languages : Generate the resource without the language files. } {--without-model : Generate the resource without the model file. } {--without-controller : Generate the resource without the controller file. } @@ -46,7 +46,7 @@ class CreateScaffoldCommand extends CreateScaffoldCommandBase {--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.} {--table-exists : This option will attempt to fetch the field from existing database table.} - {--translation-for= : A comma seperated string of languages to create fields for.} + {--translation-for= : A comma separated string of languages to create fields for.} {--force : This option will override the controller if one already exists.}'; /** diff --git a/src/Commands/Resources/ResourceFileAppendCommand.php b/src/Commands/Resources/ResourceFileAppendCommand.php index 843f886..fb4e802 100644 --- a/src/Commands/Resources/ResourceFileAppendCommand.php +++ b/src/Commands/Resources/ResourceFileAppendCommand.php @@ -19,10 +19,10 @@ class ResourceFileAppendCommand extends ResourceFileCreatorCommandBase protected $signature = 'resource-file:append {model-name : The model name that these files represent.} {--resource-filename= : The destination file name to append too.} - {--fields= : A comma seperate field names.} - {--indexes= : A comma seperated index string.} - {--relations= : A comma seperated realtion string.} - {--translation-for= : A comma seperated string of languages to create fields for.}'; + {--fields= : A comma separate field names.} + {--indexes= : A comma separated index string.} + {--relations= : A comma separated relation string.} + {--translation-for= : A comma separated string of languages to create fields for.}'; /** * The console command description. diff --git a/src/Commands/Resources/ResourceFileCreateCommand.php b/src/Commands/Resources/ResourceFileCreateCommand.php index 2af7b08..12ce15c 100644 --- a/src/Commands/Resources/ResourceFileCreateCommand.php +++ b/src/Commands/Resources/ResourceFileCreateCommand.php @@ -24,10 +24,10 @@ class ResourceFileCreateCommand extends ResourceFileCreatorCommandBase protected $signature = 'resource-file:create {model-name : The model name that these files represent.} {--resource-filename= : The destination file name to append too.} - {--fields= : A comma seperate field names.} - {--indexes= : A comma seperated index string.} - {--relations= : A comma seperated realtion string.} - {--translation-for= : A comma seperated string of languages to create fields for.} + {--fields= : A comma separate field names.} + {--indexes= : A comma separated index string.} + {--relations= : A comma separated relation string.} + {--translation-for= : A comma separated string of languages to create fields for.} {--force : Override existing file if one exists.}'; /** * The console command description. diff --git a/src/Commands/Resources/ResourceFileFromDatabaseCommand.php b/src/Commands/Resources/ResourceFileFromDatabaseCommand.php index d539c8a..7a043ad 100644 --- a/src/Commands/Resources/ResourceFileFromDatabaseCommand.php +++ b/src/Commands/Resources/ResourceFileFromDatabaseCommand.php @@ -33,7 +33,7 @@ class ResourceFileFromDatabaseCommand extends ResourceFileCommandBase {--table-name= : The database table name to fetch the field from.} {--database-name= : The database name the table is stored in.} {--resource-filename= : The destination file name to create.} - {--translation-for= : A comma seperated string of languages to create fields for.} + {--translation-for= : A comma separated string of languages to create fields for.} {--force : This option will override the view if one already exists.}'; /** @@ -149,7 +149,7 @@ protected function isForce() } /** - * Gets the destenation filename. + * Gets the destination filename. * * @return string */ @@ -191,7 +191,7 @@ protected function getTableName() } /** - * Gets the languages to create lang keys for. + * Gets the languages to create language keys for. * * @return array */ @@ -201,7 +201,7 @@ protected function getLanguages() } /** - * Gets migration fullname + * Gets migration full name. * * @param string $name * diff --git a/src/Commands/Resources/ResourceFileReduceCommand.php b/src/Commands/Resources/ResourceFileReduceCommand.php index 7957a47..5a30381 100644 --- a/src/Commands/Resources/ResourceFileReduceCommand.php +++ b/src/Commands/Resources/ResourceFileReduceCommand.php @@ -17,9 +17,9 @@ class ResourceFileReduceCommand extends ResourceFileCommandBase protected $signature = 'resource-file:reduce {model-name : The model name that these files represent.} {--resource-filename= : The destination file name to reduce.} - {--fields= : A comma seperate field names.} - {--indexes= : A comma seperated index string.} - {--relations= : A comma seperated realtion string.}'; + {--fields= : A comma separate field names.} + {--indexes= : A comma separated index string.} + {--relations= : A comma separated relation string.}'; /** * The console command description. diff --git a/src/Commands/Resources/ResourceFileRefreshCommand.php b/src/Commands/Resources/ResourceFileRefreshCommand.php index 4b568ab..a82d257 100644 --- a/src/Commands/Resources/ResourceFileRefreshCommand.php +++ b/src/Commands/Resources/ResourceFileRefreshCommand.php @@ -21,7 +21,7 @@ class ResourceFileRefreshCommand extends ResourceFileCommandBase protected $signature = 'resource-file:refresh {model-name : The model name that these files represent.} {--resource-filename= : The destination file name to append too.} - {--translation-for= : A comma seperated string of languages to create fields for.}'; + {--translation-for= : A comma separated string of languages to create fields for.}'; /** * The console command description. * 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/CreateEditViewCommand.php b/src/Commands/Views/CreateEditViewCommand.php index a98718f..1090fad 100644 --- a/src/Commands/Views/CreateEditViewCommand.php +++ b/src/Commands/Views/CreateEditViewCommand.php @@ -68,7 +68,7 @@ protected function handleCreateView() } /** - * Gets te create form name + * Gets the create form name. * * @param string $modelName * @@ -80,7 +80,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..f07e285 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)) { @@ -65,7 +66,7 @@ protected function handleCreateView() } /** - * Replaces the form field's html code in a given stub. + * Replaces the form field's HTML code in a given stub. * * @param string $stub * @param string $fields 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/CreateLayoutCommand.php b/src/Commands/Views/CreateLayoutCommand.php index dc9d388..7a168df 100644 --- a/src/Commands/Views/CreateLayoutCommand.php +++ b/src/Commands/Views/CreateLayoutCommand.php @@ -18,9 +18,8 @@ class CreateLayoutCommand extends Command {application-name : The name of your application.} {--layout-filename=app : The layout file name to be created.} {--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. @@ -42,7 +41,6 @@ public function handle() 'application-name' => $this->argument('application-name'), '--layout-filename' => $this->option('layout-filename'), '--layout-directory' => $this->option('layout-directory'), - '--without-validation' => $this->option('without-validation'), '--template-name' => $this->option('template-name'), '--force' => $this->option('force'), ] diff --git a/src/Commands/Views/CreateViewLayoutCommand.php b/src/Commands/Views/CreateViewLayoutCommand.php index 181cc09..6f13324 100644 --- a/src/Commands/Views/CreateViewLayoutCommand.php +++ b/src/Commands/Views/CreateViewLayoutCommand.php @@ -23,9 +23,8 @@ class CreateViewLayoutCommand extends Command {application-name : The name of your application.} {--layout-filename=app : The layout file name to be created.} {--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. @@ -51,8 +50,7 @@ public function handle() return false; } - $stubName = $input->withoutValidation ? 'layout' : 'layout-with-validation'; - $stub = $this->getStubContent($stubName, $this->getTemplateName()); + $stub = $this->getStubContent('layout', $this->getTemplateName()); $this->replaceApplicationName($stub, $input->appName) ->createFile($destenationFile, $stub) @@ -96,7 +94,7 @@ protected function fileExists($filename, $force) } /** - * Gets the destenation path. + * Gets the destination path. * * @param string $path * @@ -121,14 +119,13 @@ protected function getCommandInput() $appName = trim($this->argument('application-name')); $layoutFileName = Str::postfix(trim($this->option('layout-filename')) ?: 'layout-filename', '.blade.php'); $layoutDirectory = trim($this->option('layout-directory')); - $withoutValidation = $this->option('without-validation'); $force = $this->option('force'); - return (object) compact('appName', 'layoutFileName', 'layoutDirectory', 'withoutValidation', 'force'); + return (object) compact('appName', 'layoutFileName', 'layoutDirectory', 'force'); } /** - * 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/DatabaseParsers/MysqlParser.php b/src/DatabaseParsers/MysqlParser.php index c4abe90..177bfef 100644 --- a/src/DatabaseParsers/MysqlParser.php +++ b/src/DatabaseParsers/MysqlParser.php @@ -241,7 +241,7 @@ protected function getIndexes() } /** - * Gets the field after transfering it from a given query object. + * Gets the field after transferring it from a given query object. * * @param object $column * @@ -292,7 +292,7 @@ protected function getTransfredFields(array $columns) } /** - * Gets the type params + * Gets the type parameters. * * @param string $length * @param string $dataType diff --git a/src/DatabaseParsers/ParserBase.php b/src/DatabaseParsers/ParserBase.php index f29627d..32b3e59 100644 --- a/src/DatabaseParsers/ParserBase.php +++ b/src/DatabaseParsers/ParserBase.php @@ -38,7 +38,7 @@ abstract class ParserBase protected $tableName; /** - * The databasename + * The database name * * @var array */ @@ -143,7 +143,7 @@ public function getResourceAsJson() } /** - * Gets array of field after transfering each column meta into field. + * Gets array of field after transferring each column meta into field. * * @param array $fields * @@ -161,7 +161,7 @@ protected function transfer(array $fields) } /** - * Get the html type for a given field. + * Get the HTML type for a given field. * * @param CrestApps\CodeGenerator\Models\Field $field * @param string $type @@ -180,7 +180,7 @@ protected function getHtmlType($type) } /** - * Set the html type for a given field. + * Set the HTML type for a given field. * * @param CrestApps\CodeGenerator\Models\Field $field * @param string $type diff --git a/src/DatabaseParsers/SqlServerParser.php b/src/DatabaseParsers/SqlServerParser.php index 2dea269..ba24405 100644 --- a/src/DatabaseParsers/SqlServerParser.php +++ b/src/DatabaseParsers/SqlServerParser.php @@ -18,7 +18,7 @@ class SqlServerParser extends ParserBase protected $tableName; /** - * The databasename + * The database name * * @var array */ @@ -103,7 +103,7 @@ protected function getColumn() } /** - * Gets array of field after transfering each column meta into field. + * Gets array of field after transferring each column meta into field. * * @param array $columns * @@ -133,7 +133,7 @@ protected function transfer(array $columns) } /** - * Set the unsiged flag for a given field. + * Set the unsigned flag for a given field. * * @param CrestApps\CodeGenerator\Models\Field $field * @param string $type @@ -151,7 +151,7 @@ protected function setUnsigned(Field &$field, $type) } /** - * Set the html type for a given field. + * Set the HTML type for a given field. * * @param CrestApps\CodeGenerator\Models\Field $field * @param string $type @@ -296,7 +296,7 @@ protected function getLabelName($name) } /** - * Gets the eloquent method to html + * Gets the eloquent method to HTML * * @return array */ diff --git a/src/HtmlGenerators/HtmlGeneratorBase.php b/src/HtmlGenerators/HtmlGeneratorBase.php index e4fcb62..4189ffc 100644 --- a/src/HtmlGenerators/HtmlGeneratorBase.php +++ b/src/HtmlGenerators/HtmlGeneratorBase.php @@ -55,7 +55,7 @@ public function __construct(array $fields, $modelName, $template = null) } /** - * Gets html field for the current set fields. + * Gets HTML field for the current set fields. * * @return string */ @@ -95,8 +95,8 @@ public function getHtmlFields() } /** - * Gets html code for the show view using the current fields colelction. - * If an value is passed, it will only generate the raws based on the given fields + * Gets HTML code for the show view using the current fields collection. + * If an value is passed, it will only generate the rows based on the given fields * * @param array $fields * @@ -117,7 +117,7 @@ public function getShowRowsHtml(array $fields = null) } /** - * Gets show row html code for the given field. + * Gets show row HTML code for the given field. * * @param string $stub * @param CreatApps\Models\Field $field @@ -135,7 +135,7 @@ protected function getShowRowHtmlField($stub, Field $field) } /** - * Gets the value to use in the show view + * Gets the value to use in the show view. * * @param Field $field * @@ -151,8 +151,8 @@ protected function getFieldValueForShow(Field $field) } /** - * Gets header cells' html code for the index view using the current fields colelction. - * If an value is passed, it will only generate the raws based on the given fields + * Gets header cells' HTML code for the index view using the current fields collection. + * If an value is passed, it will only generate the rows based on the given fields * * @param array $fields * @@ -193,8 +193,8 @@ public function replaceCommonTemplates(&$stub, Field $field) } /** - * Gets header body's html code for the index view using the current fields colelction. - * If an value is passed, it will only generate the raws based on the given fields + * Gets header body's HTML code for the index view using the current fields collection. + * If an value is passed, it will only generate the rows based on the given fields * * @param array $fields * @@ -214,7 +214,7 @@ public function getIndexBodyCells(array $fields = null) } /** - * Gets index body cell html code for the given field. + * Gets index body cell HTML code for the given field. * * @param string $stub * @param CreatApps\Models\Field $field @@ -233,7 +233,7 @@ protected function getIndexBodyCell($stub, Field $field) } /** - * Replace the selectedValue fo the given stub. + * Replace the selectedValue for the given stub. * * @param string $stub * @param string $value @@ -248,7 +248,7 @@ protected function replaceSelectedValue(&$stub, $value) } /** - * Replace the checkedItem fo the given stub. + * Replace the checkedItem for the given stub. * * @param string $stub * @param string $value @@ -263,7 +263,7 @@ protected function replaceCheckedItem(&$stub, $value) } /** - * Replace the fieldValue fo the given stub. + * Replace the fieldValue for the given stub. * * @param string $stub * @param string $value @@ -341,7 +341,7 @@ protected function getTextareaHtmlField(Field $field, ValidationParser $parser) } /** - * Gets the html min value. + * Gets the HTML min value. * * @param mix (int|float) $validationMinValue * @param mix (int|float) $fieldMinValue @@ -358,7 +358,7 @@ protected function getHtmlMinValue($validationMinValue, $fieldMinValue) } /** - * Gets the html max value. + * Gets the HTML max value. * * @param mix (int|float) $validationMaxValue * @param mix (int|float) $fieldMaxValue @@ -375,7 +375,7 @@ protected function getHtmlMaxValue($validationMaxValue, $fieldMaxValue) } /** - * Gets creates an checkbox/radio button html field for a given field. + * Gets creates an checkbox/radio button HTML field for a given field. * * @param CrestApps\CodeGeneraotor\Support\Field $field * @param CrestApps\CodeGeneraotor\Support\ValidationParser $parser @@ -405,7 +405,7 @@ protected function getPickItemsHtml(Field $field, ValidationParser $parser) } /** - * Gets creates a checkbox or radio button html field for a given field. + * Gets creates a checkbox or radio button HTML field for a given field. * * @param CrestApps\CodeGeneraotor\Support\Field $field * @param CrestApps\CodeGeneraotor\Support\Label $option @@ -432,7 +432,7 @@ protected function getPickItemsHtmlField(Field $field, Label $option, Validation } /** - * Gets field name ending with square brakets + * Gets field name ending with square brackets * * @param string $name * @@ -444,7 +444,7 @@ protected function getFieldNameAsArray($name) } /** - * Gets creates an select menu html field for a given field. + * Gets creates an select menu HTML field for a given field. * * @param CrestApps\CodeGeneraotor\Support\Field $field * @param CrestApps\CodeGeneraotor\Support\ValidationParser $parser @@ -475,7 +475,7 @@ protected function getSelectHtmlField(Field $field, ValidationParser $parser) } /** - * Gets the fields accessor + * Gets the fields accessor. * * @param CrestApps\CodeGeneraotor\Support\Field $field * @@ -493,7 +493,7 @@ protected function getFieldItem(Field $field) } /** - * Gets the fields item accessor + * Gets the fields item accessor. * * @param CrestApps\CodeGeneraotor\Support\Field $field * @@ -510,7 +510,7 @@ protected function getFieldItemAccessor(Field $field) } /** - * Gets the field value accesor. + * Gets the field value accessor. * * @param CrestApps\CodeGeneraotor\Support\Field $field * @@ -555,7 +555,7 @@ protected function getSelectedValueForMenu(Field $field) } /** - * Gets creates an password html5 field for a given field. + * Gets creates an password HTML5 field for a given field. * * @param CrestApps\CodeGeneraotor\Support\Field $field * @@ -617,7 +617,7 @@ public function getSelectMonthHtmlField(Field $field) } /** - * Gets creates an password html5 field for a given field. + * Gets creates an password HTML5 field for a given field. * * @param CrestApps\CodeGeneraotor\Support\Field $field * @param CrestApps\CodeGeneraotor\Support\ValidationParser $parser @@ -647,7 +647,7 @@ public function getPasswordHtmlField(Field $field, ValidationParser $parser) } /** - * Gets creates an standard html5 field for a given field. + * Gets creates an standard HTML5 field for a given field. * * @param CrestApps\CodeGeneraotor\Support\Field $field * @param CrestApps\CodeGeneraotor\Support\ValidationParser $parser @@ -678,7 +678,7 @@ public function getStandardHtmlField(Field $field, ValidationParser $parser) } /** - * Gets the gretest value of the given parameters. It ignores null or empty string. + * Gets the greatest value of the given parameters. It ignores null or empty string. * * @return numeric */ @@ -731,7 +731,7 @@ protected function wrapField(&$fieldStub, Field $field, $standardLabel = true, $ } /** - * Creates html label from a given field + * Creates HTML label from a given field * * @param CrestApps\CodeGenerator\Models\Field $field * @@ -747,7 +747,7 @@ protected function getLabelFromField(Field $field = null) } /** - * Creates html label. + * Creates HTML label. * * @param string $name * @param CrestApps\CodeGenerator\Models\Label $label @@ -781,7 +781,7 @@ protected function getNewHelper(Field $field) } /** - * Gets the required class arrribute + * Gets the required class attribute * * @param string $class * @@ -843,7 +843,7 @@ protected function getTitle(Label $label, $raw = false) } /** - * Replace the fieldName fo the given stub. + * Replace the fieldName for the given stub. * * @param string $stub * @param string $fieldName @@ -858,7 +858,7 @@ protected function replaceFieldName(&$stub, $fieldName) } /** - * Replace the fieldItem fo the given stub. + * Replace the fieldItem for the given stub. * * @param string $stub * @param string $name @@ -888,7 +888,7 @@ protected function replaceFieldItemAccessor(&$stub, $name) } /** - * Replace the fieldValueAccessor fo the given stub. + * Replace the fieldValueAccessor for the given stub. * * @param string $stub * @param string $name @@ -903,7 +903,7 @@ protected function replaceFieldValueAccessor(&$stub, $name) } /** - * Replace the minValue fo the given stub. + * Replace the minValue for the given stub. * * @param string $stub * @param string $minValue @@ -918,7 +918,7 @@ protected function replaceFieldMinValue(&$stub, $minValue) } /** - * Replace the maxValue fo the given stub. + * Replace the maxValue for the given stub. * * @param string $stub * @param string $maxValue @@ -933,7 +933,7 @@ protected function replaceFieldMaxValue(&$stub, $maxValue) } /** - * Replace the minLength fo the given stub. + * Replace the minLength for the given stub. * * @param string $stub * @param string $minLength @@ -948,7 +948,7 @@ protected function replaceFieldMinLengthName(&$stub, $minLength) } /** - * Replace the maxLength fo the given stub. + * Replace the maxLength for the given stub. * * @param string $stub * @param string $maxLength @@ -963,7 +963,7 @@ protected function replaceFieldMaxLengthName(&$stub, $maxLength) } /** - * Replace the requiredField fo the given stub. + * Replace the requiredField for the given stub. * * @param string $stub * @param string $required @@ -978,7 +978,7 @@ protected function replaceFieldRequired(&$stub, $required) } /** - * Replace the placeholder fo the given stub. + * Replace the placeholder for the given stub. * * @param string $stub * @param string $placeholder @@ -993,7 +993,7 @@ protected function replaceFieldPlaceHolder(&$stub, $placeholder) } /** - * Replace the fieldValue fo the given stub. + * Replace the fieldValue for the given stub. * * @param string $stub * @param string $fieldValue @@ -1008,7 +1008,7 @@ protected function replaceFieldValue(&$stub, $fieldValue) } /** - * Replace the optionValue fo the given stub. + * Replace the optionValue for the given stub. * * @param string $stub * @param string $optionValue @@ -1023,7 +1023,7 @@ protected function replaceOptionValue(&$stub, $optionValue) } /** - * Replace the requiredClass fo the given stub. + * Replace the requiredClass for the given stub. * * @param string $stub * @param string $class @@ -1038,7 +1038,7 @@ protected function replaceRequiredClass(&$stub, $class) } /** - * Replace the itemId fo the given stub. + * Replace the itemId for the given stub. * * @param string $stub * @param string $fieldValue @@ -1053,7 +1053,7 @@ protected function replaceItemId(&$stub, $itemId) } /** - * Replace the itemTitle fo the given stub. + * Replace the itemTitle for the given stub. * * @param string $stub * @param string $itemTitle @@ -1068,7 +1068,7 @@ protected function replaceItemLabel(&$stub, $itemTitle) } /** - * Replace the fieldType fo the given stub. + * Replace the fieldType for the given stub. * * @param string $stub * @param string $fieldType @@ -1083,7 +1083,7 @@ protected function replaceFieldType(&$stub, $fieldType) } /** - * Replace the CssClass fo the given stub. + * Replace the CssClass for the given stub. * * @param string $stub * @param CrestApps\CodeGenerator\Models\Label $label @@ -1099,7 +1099,7 @@ protected function replaceCssClass(&$stub, $class) } /** - * Replace the fieldTitle fo the given stub. + * Replace the fieldTitle for the given stub. * * @param string $stub * @param CrestApps\CodeGenerator\Models\Label $label @@ -1115,7 +1115,7 @@ protected function replaceFieldTitle(&$stub, $title) } /** - * Replace the fieldValidationHelper fo the given stub. + * Replace the fieldValidationHelper for the given stub. * * @param string $stub * @param string $helper @@ -1130,7 +1130,7 @@ protected function replaceFieldValidationHelper(&$stub, $helper) } /** - * Replace the fieldLabel fo the given stub. + * Replace the fieldLabel for the given stub. * * @param string $stub * @param string $fieldLabel @@ -1145,7 +1145,7 @@ protected function replaceFieldLabel(&$stub, $fieldLabel) } /** - * Replace the fieldInput fo the given stub. + * Replace the fieldInput for the given stub. * * @param string $stub * @param string $fieldInput @@ -1205,7 +1205,7 @@ protected function replaceFieldStep(&$stub, $step) } /** - * It gets converts an array to a stringbase array for the views. + * It gets converts an array to a string base array for the views. * * @param CrestApps\CodeGenerator\Models\Field $field * @@ -1351,7 +1351,7 @@ abstract protected function getMultipleCheckedItem($value, $name, $defaultValue) abstract protected function getMultipleSelectedValue($name, $valueAccessor, $defaultValue); /** - * Gets the html steps attribute. + * Gets the HTML steps attribute. * * @param int value * diff --git a/src/HtmlGenerators/LaravelCollectiveHtml.php b/src/HtmlGenerators/LaravelCollectiveHtml.php index 740f8fe..9ea8c46 100644 --- a/src/HtmlGenerators/LaravelCollectiveHtml.php +++ b/src/HtmlGenerators/LaravelCollectiveHtml.php @@ -243,7 +243,7 @@ protected function getMultipleRawOptionValue($name, $value, $defaultValue) } /** - * Gets the best value accessor for the view + * Gets the best value accessor for the view. * * @param string $modelVariable * @param string $property @@ -278,7 +278,7 @@ protected function getMultipleSelectedValue($name, $valueAccessor, $defaultValue } /** - * Gets the html steps attribute. + * Gets the HTML steps attribute. * * @param int value * diff --git a/src/HtmlGenerators/StandardHtml.php b/src/HtmlGenerators/StandardHtml.php index 4445896..55e36a8 100644 --- a/src/HtmlGenerators/StandardHtml.php +++ b/src/HtmlGenerators/StandardHtml.php @@ -117,7 +117,7 @@ protected function getFieldMultiple($isMulti) } /** - * It gets converts an array to a stringbase array for the views. + * It gets converts an array to a string base array for the views. * * @param CrestApps\CodeGenerator\Models\Field $field * @@ -194,7 +194,7 @@ protected function getMultipleCheckedItem($value, $name, $defaultValue) } /** - * Gets the best value accessor for the view + * Gets the best value accessor for the view. * * @param string $modelVariable * @param string $property @@ -295,7 +295,7 @@ protected function getMultipleRawOptionValue($name, $value, $defaultValue) } /** - * Creates html label. + * Creates HTML label. * * @param string $name * @param CrestApps\CodeGenerator\Models\Label $label @@ -313,7 +313,7 @@ protected function getLabelElement($name, Label $label) } /** - * Gets the html steps attribute. + * Gets the HTML steps attribute. * * @param int value * diff --git a/src/Models/ForeignRelationship.php b/src/Models/ForeignRelationship.php index da8fceb..7d6659a 100644 --- a/src/Models/ForeignRelationship.php +++ b/src/Models/ForeignRelationship.php @@ -311,7 +311,7 @@ public function getModelColumns() } if (count($columns) == 0) { - // At this poing we know the column have not yet been identified + // At this point, we know the column have not yet been identified // which also mean that the model does not exists or the table // does not existing in the database. // Try to find the columns from the resource-file if one found. diff --git a/src/Models/IndexMigrationChange.php b/src/Models/IndexMigrationChange.php index 3f77ffd..9492dbf 100644 --- a/src/Models/IndexMigrationChange.php +++ b/src/Models/IndexMigrationChange.php @@ -72,6 +72,7 @@ public static function getDeleted(Index $index) return $change; } + /** * Get the migration change after comparing two given fields * diff --git a/src/Models/Label.php b/src/Models/Label.php index 88301cd..a766e37 100644 --- a/src/Models/Label.php +++ b/src/Models/Label.php @@ -22,7 +22,7 @@ class Label /** * Is the label plain text or not * - * @var vool + * @var bool */ public $isPlain = true; @@ -48,7 +48,7 @@ class Label public $id; /** - * The template to use for replacment. + * The template to use for replacement. * * @var string */ diff --git a/src/Models/MigrationCapsule.php b/src/Models/MigrationCapsule.php index 80df53b..c3ec490 100644 --- a/src/Models/MigrationCapsule.php +++ b/src/Models/MigrationCapsule.php @@ -138,7 +138,7 @@ public function setResource(Resource $resource) } /** - * Gets array of the paramets + * Gets array of the parameters * * @return array */ diff --git a/src/Models/MigrationChangeCapsule.php b/src/Models/MigrationChangeCapsule.php index 62dbdc4..13bcd18 100644 --- a/src/Models/MigrationChangeCapsule.php +++ b/src/Models/MigrationChangeCapsule.php @@ -88,7 +88,7 @@ public function getIndexesWithUpdate() } /** - * Gets array of the paramets + * Gets array of the parameters. * * @return array */ diff --git a/src/Models/MigrationInput.php b/src/Models/MigrationInput.php index 916e20e..73fb776 100644 --- a/src/Models/MigrationInput.php +++ b/src/Models/MigrationInput.php @@ -42,7 +42,7 @@ class MigrationInput public $resourceFile; /** - * The tamplate to use + * The template to use * * @var string */ @@ -80,7 +80,7 @@ public function __construct(array $arguments, array $options = []) } /** - * Gets array of the paramets + * Gets array of the parameters. * * @return array */ diff --git a/src/Models/MigrationTrackerCapsule.php b/src/Models/MigrationTrackerCapsule.php index 08cfbc7..3fc1fe2 100644 --- a/src/Models/MigrationTrackerCapsule.php +++ b/src/Models/MigrationTrackerCapsule.php @@ -92,7 +92,7 @@ public function addMigration(MigrationCapsule $capsule) } /** - * Get the difference between a givin resource and the + * Get the difference between a given resource and the * resource in the current migration * * @param CrestApps\CodeGenerator\Models\Resource $resourceA @@ -302,7 +302,7 @@ protected function deleteFile($file) } /** - * Get the total migratins + * Get the total migrations. * * @return int */ @@ -423,7 +423,7 @@ public function migrationHasTimestamps() } /** - * Gets array of the paramets + * Gets array of the parameters. * * @return array */ diff --git a/src/Models/Resource.php b/src/Models/Resource.php index aab5e9e..2d031ce 100644 --- a/src/Models/Resource.php +++ b/src/Models/Resource.php @@ -474,7 +474,7 @@ protected function getRawApiDocLabels() } /** - * Converts the protection into a json-ready array + * Converts the protection into an array. * * @return array */ @@ -501,7 +501,7 @@ public function getFields() } /** - * Converts the fields into a json-ready array + * Converts the fields into an array. * * @return array */ @@ -513,7 +513,7 @@ public function getFieldsToArray() } /** - * Converts the relations into a json-ready array + * Converts the relations into a an array. * * @return array */ @@ -525,7 +525,7 @@ public function getRelationsToArray() } /** - * Converts the indexes into a json-ready array + * Converts the indexes into a an array. * * @return array */ @@ -537,7 +537,7 @@ public function getIndexesToArray() } /** - * It transfres a given string to a collection of field + * It transfers a given string to a collection of field * * @param string|json $json * @param string $localeGroup @@ -553,7 +553,7 @@ public static function fromFile($filename, $localeGroup, array $languages = []) } /** - * It transfres a given JSON string to a collection of field + * It transfers a given JSON string to a collection of field * * @param string|json $json * @param string $localeGroup @@ -579,7 +579,7 @@ public static function fromJson($json, $localeGroup, array $languages = []) } /** - * It transfres a gving array to a resource + * It transfers a given array to a resource * * @param array $properties * @param string $localeGroup @@ -635,7 +635,7 @@ public static function fromArray(array $properties, $localeGroup, array $languag } /** - * Gets a relation collection from a peoperties collection. + * Gets a relation collection from a properties collection. * * @param $filename * @@ -655,7 +655,7 @@ protected static function getRelations(array $properties) } /** - * Gets a relation collection from a peoperties collection. + * Gets a relation collection from a properties collection. * * @param $filename * @@ -673,7 +673,7 @@ protected static function getIndexes(array $properties) } /** - * Gets the content of the resource json file. + * Gets the content of the resource JSON file. * * @param $filename * 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/Support/Arr.php b/src/Support/Arr.php index 2e8f8d2..fbc5a63 100644 --- a/src/Support/Arr.php +++ b/src/Support/Arr.php @@ -20,7 +20,7 @@ public static function isAssociative(array $items) } /** - * Wrapps each item in an array with a given string + * Wraps each item in an array with a given string * * @param array $items * @param string $wrapper @@ -37,8 +37,8 @@ public static function wrapItems(array $items, $wrapper = "'") } /** - * It splits a given string by a given seperator after trimming each part - * from whitespaces and single/double quotes. Any empty string is eliminated. + * It splits a given string by a given separator after trimming each part + * from white spaces and single/double quotes. Any empty string is eliminated. * * @param string $str * @param string $seperator @@ -92,8 +92,8 @@ public static function isMatch(array $subjects, $search) } /** - * It trims each element in a givin array and removes the empty elements. - * If a callback is passed as a second parameter, the callbacl is applied on each item. + * It trims each element in a given array and removes the empty elements. + * If a callback is passed as a second parameter, the callback is applied on each item. * * @param array $items * @param function $callback diff --git a/src/Support/Config.php b/src/Support/Config.php index acd2508..1f49901 100644 --- a/src/Support/Config.php +++ b/src/Support/Config.php @@ -157,16 +157,6 @@ public static function getKeyPatterns() return self::getArrayBaseValue('common_key_patterns'); } - /** - * Gets the template names that uses Laravel-Collective - * - * @return array - */ - public static function getCollectiveTemplates() - { - return self::getArrayBaseValue('laravel_collective_templates'); - } - /** * Gets the default template name. * @@ -198,7 +188,7 @@ public static function getCustomModelTemplates() } /** - * Gets the eloquent's method to html + * Gets the Eloquent's method to HTML * * @return array */ diff --git a/src/Support/FieldOptimizer.php b/src/Support/FieldOptimizer.php index 756c4c9..497c671 100644 --- a/src/Support/FieldOptimizer.php +++ b/src/Support/FieldOptimizer.php @@ -33,7 +33,7 @@ class FieldOptimizer protected $meta; /** - * Create a new optemizer instance. + * Create a new optimizer instance. * * @param CrestApps\CodeGenerator\Models\Field $field * @param array $meta @@ -176,7 +176,7 @@ protected function optimizeHtmlType() if ($this->field->hasForeignRelation()) { // At this point we know the field has a foreign relation // set the htmlType to select since the user will have to select an item(s) - // from a colelction + // from a collection $this->field->htmlType = 'select'; } @@ -198,7 +198,7 @@ protected function optimizeBoolean() } /** - * If the property name is "id" or if the field is primary or autoincrement. + * If the property name is "id" or if the field is primary or auto increment. * Ensure, the datatype is set to be valid otherwise make it "int". * It also make sure the primary column does not appears on the views unless it specified * diff --git a/src/Support/FieldTransformer.php b/src/Support/FieldTransformer.php index 15c6e31..1e8c9e1 100644 --- a/src/Support/FieldTransformer.php +++ b/src/Support/FieldTransformer.php @@ -52,7 +52,7 @@ class FieldTransformer protected $languages = []; /** - * It transfres a gining array to a collection of field + * It transfers a given array to a collection of field * * @param array $collection * @param string $localeGroup @@ -69,7 +69,7 @@ public static function fromArray(array $collection, $localeGroup, array $languag } /** - * It transfres a gining array to a collection of field + * It transfers a given array to a collection of field * * @param string $str * @param string $localeGroup @@ -135,7 +135,7 @@ public static function fromString($str, $localeGroup = 'generic', array $languag } /** - * It transfres a gining string to a collection of field + * It transfers a given string to a collection of field * * @param string|json $json * @param string $localeGroup @@ -184,7 +184,7 @@ protected function getFields() } /** - * It transfres the raw fields into Fields by setting the $this->fields array + * It transfers the raw fields into Fields by setting the $this->fields array * * @return $this */ @@ -192,7 +192,7 @@ protected function transfer() { $names = array_column($this->rawFields, 'name'); if (array_unique($names) !== $names) { - throw new Exception('Each field name must be unique. Please check the profided field names'); + throw new Exception('Each field name must be unique. Please check the predefined field names'); } $mappers = []; diff --git a/src/Support/FieldsOptimizer.php b/src/Support/FieldsOptimizer.php index 2048123..b8ca04a 100644 --- a/src/Support/FieldsOptimizer.php +++ b/src/Support/FieldsOptimizer.php @@ -23,7 +23,7 @@ class FieldsOptimizer protected $fields = []; /** - * Create a new optemizer instance. + * Create a new optimizer instance. * * @param array $mappers * @@ -45,7 +45,7 @@ public function getFields() } /** - * Optemizes the fields. + * Optimizes the fields. * * @return void */ diff --git a/src/Support/Helpers.php b/src/Support/Helpers.php index 8e4d954..f86c402 100644 --- a/src/Support/Helpers.php +++ b/src/Support/Helpers.php @@ -29,6 +29,31 @@ public static function makeControllerName($modelName) return $case; } + /** + * Makes a api-docs controller name from a given model name + * + * @param string $modelName + * + * @return string + */ + public static function makeApiDocsControllerName($modelName) + { + return self::makeControllerName($modelName . 'ApiDocs'); + } + + /** + * Makes a api controller name from a given model name + * + * @param string $modelName + * + * @return string + */ + public static function makeApiControllerName($modelName) + { + return self::makeControllerName($modelName . 'Api'); + } + + /** * Makes an api-resource name from a given model name * @@ -104,7 +129,7 @@ public static function fixNamespace($path) } /** - * Gets the app namespace afer concatenating any given paths to it + * Gets the app namespace after concatenating any given paths to it * * @param mix $paths * @@ -192,7 +217,7 @@ public static function makeRouteGroup($modelName) } /** - * Makes the json file name + * Makes the JSON file name * * @param string $modelName * @@ -206,7 +231,7 @@ public static function makeJsonFileName($modelName) } /** - * Check if the current laravel version has api-support + * Check if the current Laravel version has api-support * * @return bool */ diff --git a/src/Support/MigrationHistoryTracker.php b/src/Support/MigrationHistoryTracker.php index 3101c1c..4c6e5d2 100644 --- a/src/Support/MigrationHistoryTracker.php +++ b/src/Support/MigrationHistoryTracker.php @@ -101,7 +101,7 @@ public function update($tableName, array $properties) } /** - * Checks if a migration tracker exists for a given datatable + * Checks if a migration tracker exists for a given data table * * @param string $tableName * @@ -170,7 +170,7 @@ protected function read() } /** - * Removeds a migration entry from the file given the table name. + * Removes a migration entry from the file given the table name. * * @param string $tableName * diff --git a/src/Support/Str.php b/src/Support/Str.php index c341d6f..85d45fd 100644 --- a/src/Support/Str.php +++ b/src/Support/Str.php @@ -193,7 +193,7 @@ public static function trimQuots($subject) } /** - * Makes the proper english case given name and a file type + * Makes the proper English case given name and a file type * * @param string $name * @param string $key @@ -212,7 +212,7 @@ public static function properSnake($name, $key) } /** - * Adds a preFix string at the begining of another given string if it does not already ends with it. + * Adds a preFix string at the beginning of another given string if it does not already ends with it. * * @param string $name * @param string $fix @@ -246,7 +246,7 @@ public static function postfix($subject, $fix) } /** - * Replaces any non-english letters with an empty string + * Replaces any non-English letters with an empty string * * @param string $str * @param bool $keep diff --git a/src/Support/ValidationParser.php b/src/Support/ValidationParser.php index b02d8c4..277758c 100644 --- a/src/Support/ValidationParser.php +++ b/src/Support/ValidationParser.php @@ -76,7 +76,7 @@ class ValidationParser protected $numeric; /** - * Conditional requied rule + * Conditional required rule * * @var mix */ @@ -174,7 +174,7 @@ public function getSizeValue() } /** - * Checks if the rules conatins a required rule + * Checks if the rules contains a required rule * * @return bool */ @@ -242,7 +242,7 @@ public function isString() } /** - * Checks if the rules is valid numer + * Checks if the rules is valid number. * * @return bool */ @@ -266,7 +266,7 @@ public function isConditionalRequired() } /** - * Checks if the rules is nullable + * Checks if the rules is nullable. * * @return bool */ @@ -280,7 +280,7 @@ public function isNullable() } /** - * Checks if the rules is interger. + * Checks if the rules is integer. * * @return bool */ diff --git a/src/Support/ViewLabelsGenerator.php b/src/Support/ViewLabelsGenerator.php index 80cc141..0935142 100644 --- a/src/Support/ViewLabelsGenerator.php +++ b/src/Support/ViewLabelsGenerator.php @@ -42,19 +42,12 @@ class ViewLabelsGenerator */ protected $defaultLang; - /** - * Generate labels for collective template? - * - * @var bool - */ - protected $isCollectiveTemplate; - /** * Create a new transformer instance. * * @return void */ - public function __construct($modelName, array $fields, $isCollectiveTemplate) + public function __construct($modelName, array $fields) { if (empty($modelName)) { throw new Exception("$modelName must have a valid value"); @@ -64,7 +57,6 @@ public function __construct($modelName, array $fields, $isCollectiveTemplate) $this->fields = $fields; $this->localeGroup = self::makeLocaleGroup($modelName); $this->defaultLang = App::getLocale(); - $this->isCollectiveTemplate = $isCollectiveTemplate; } /** @@ -142,21 +134,7 @@ protected function makeModelLabel($key, array $properties, $isPlain, $lang) $label = new Label($text, $this->localeGroup, $isPlain, $lang, $key); $label->template = $properties['template']; - $label->isInFunction = $this->isInFunction($properties); return $label; } - - /** - * Checks if the given properties request to put the label in a function. - * - * @param array $properties - * - * @return bool - */ - protected function isInFunction(array $properties) - { - return $this->isCollectiveTemplate - && (isset($properties['in-function-with-collective']) && $properties['in-function-with-collective']); - } } diff --git a/src/Traits/ApiDocViewsTrait.php b/src/Traits/ApiDocViewsTrait.php index bdfa0d7..aa300d6 100644 --- a/src/Traits/ApiDocViewsTrait.php +++ b/src/Traits/ApiDocViewsTrait.php @@ -42,7 +42,7 @@ protected function getPathToViews($viewsDirectory) } /** - * Gets destenation view path + * Gets destination view path * * @param string $viewsDirectory * @param string $routesPrefix diff --git a/src/Traits/ApiResourceTrait.php b/src/Traits/ApiResourceTrait.php index 286af78..46c2237 100644 --- a/src/Traits/ApiResourceTrait.php +++ b/src/Traits/ApiResourceTrait.php @@ -122,7 +122,7 @@ protected function getApiResourceCollectionNamespace($className = '') } /** - * Gets the api-resource's destenation path + * Gets the api-resource's destination path * * @return string */ @@ -140,7 +140,7 @@ protected function getApiResourcePath() } /** - * Gets the api-resource-collection's destenation path + * Gets the api-resource-collection's destination path * * @return string */ @@ -179,7 +179,7 @@ protected function getTransformMethod($input, array $fields, $useDefaultAccessor } /** - * Replaces the model fullname for the given stub, + * Replaces the model full name for the given stub. * * @param string $stub * @param string $name @@ -255,5 +255,4 @@ protected function replaceTransformMethodName(&$stub, $name) { return $this->replaceTemplate('transform_method_name', $name, $stub); } - } diff --git a/src/Traits/CommonCommand.php b/src/Traits/CommonCommand.php index 92c1f86..8d47825 100644 --- a/src/Traits/CommonCommand.php +++ b/src/Traits/CommonCommand.php @@ -90,7 +90,7 @@ protected function getTemplateVariable($key) } /** - * Gets the relation accessor for the given foreign renationship. + * Gets the relation accessor for the given foreign relationship. * * @param string $name * @@ -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); } @@ -367,7 +367,7 @@ protected function isFileExists($file) } /** - * Get the givin file content. + * Get the given file content. * * @param string $file * @@ -379,7 +379,7 @@ protected function getFileContent($file) } /** - * Get the givin file content. + * Get the given file content. * * @param string $file * @@ -493,7 +493,7 @@ protected function createFile($file, $stub) } /** - * Checks if the givin field is an instance of a field or not. + * Checks if the given field is an instance of a field or not. * * @return string */ @@ -514,7 +514,7 @@ protected function getPathToTemplates($templateName = null) $templateName = $templateName ?: Config::getDefaultTemplateName(); $path = base_path(Config::getTemplatesPath() . Helpers::getPathWithSlash($templateName)); - if (!File::isDirectory($path) && in_array($templateName, ['default', 'default-collective'])) { + if (!File::isDirectory($path) && in_array($templateName, ['default'])) { // If the default templates are not published, utilize the default package path. $path = __DIR__ . '/../../templates/' . $templateName; @@ -528,19 +528,7 @@ protected function getPathToTemplates($templateName = null) } /** - * Checks the given template if it is a Laravel-Collective template or not. - * - * @param string $template - * - * @return bool - */ - protected function isCollectiveTemplate($template = null) - { - return in_array($template ?: $this->getTemplateName(), Config::getCollectiveTemplates()); - } - - /** - * Checks if a given fields array conatins at least one file field + * Checks if a given fields array contains at least one file field * * @param array * diff --git a/src/Traits/GeneratorReplacers.php b/src/Traits/GeneratorReplacers.php index b88ee58..c909082 100644 --- a/src/Traits/GeneratorReplacers.php +++ b/src/Traits/GeneratorReplacers.php @@ -37,7 +37,7 @@ protected function replaceModelName(&$stub, $modelName, $prefix = 'model_') } /** - * It Replaces the templates of the givin $labels + * It Replaces the templates of the given $labels * * @param string $stub * @param array $items @@ -71,7 +71,7 @@ protected function modelNamePlainEnglish($modelName) } /** - * Replace the controller_name fo the given stub. + * Replace the controller_name for the given stub. * * @param string $stub * @param string $modelName @@ -97,7 +97,7 @@ protected function replacePrimaryKey(&$stub, $primaryKey) } /** - * Replace the app_name fo the given stub. + * Replace the app_name for the given stub. * * @param string $stub * @param string $modelName @@ -110,7 +110,7 @@ protected function replaceAppName(&$stub, $name) } /** - * Replace the namespace fo the given stub. + * Replace the namespace for the given stub. * * @param string $stub * @param string $modelName diff --git a/src/Traits/LanguageTrait.php b/src/Traits/LanguageTrait.php index daff294..e0bc717 100644 --- a/src/Traits/LanguageTrait.php +++ b/src/Traits/LanguageTrait.php @@ -7,7 +7,7 @@ trait LanguageTrait { /** - * Creates a colection of messages out of a given fields collection. + * Creates a collection of messages out of a given fields collection. * * @param array $fields * diff --git a/src/Traits/Migration.php b/src/Traits/Migration.php index 1c3df46..36d57d6 100644 --- a/src/Traits/Migration.php +++ b/src/Traits/Migration.php @@ -77,7 +77,7 @@ protected function setMigrator() /** * Get all the ran migrations is a key value array where the key in the - * migration file name and the value is the fullname of the class. + * migration file name and the value is the full name of the class. * * * @return array diff --git a/src/Traits/ScaffoldTrait.php b/src/Traits/ScaffoldTrait.php index 1c670de..83900f5 100644 --- a/src/Traits/ScaffoldTrait.php +++ b/src/Traits/ScaffoldTrait.php @@ -21,7 +21,7 @@ protected function printInfo($message) } /** - * Gets the model name in plain english from a given model name. + * Gets the model name in plain English from a given model name. * * @param string $modelName * diff --git a/templates/default-collective/api-controller-base-class.stub b/templates/default-collective/api-controller-base-class.stub deleted file mode 100644 index 5cdad7a..0000000 --- a/templates/default-collective/api-controller-base-class.stub +++ /dev/null @@ -1,15 +0,0 @@ -successResponse( - [% model_was_deleted %], - $this->transform($[% model_name_singular_variable %]) - ); \ No newline at end of file diff --git a/templates/default-collective/api-controller-call-index-api-resource.stub b/templates/default-collective/api-controller-call-index-api-resource.stub deleted file mode 100644 index 9d01d03..0000000 --- a/templates/default-collective/api-controller-call-index-api-resource.stub +++ /dev/null @@ -1 +0,0 @@ -return new [% api_resource_collection_class %]($[% model_name_plural_variable %], [% models_were_retrieved %]); \ No newline at end of file diff --git a/templates/default-collective/api-controller-call-index-success-method.stub b/templates/default-collective/api-controller-call-index-success-method.stub deleted file mode 100644 index 1ac32cd..0000000 --- a/templates/default-collective/api-controller-call-index-success-method.stub +++ /dev/null @@ -1,26 +0,0 @@ -$[% data_variable %] = $[% model_name_plural_variable %]->transform(function ($[% model_name_singular_variable %]) { - return $this->transform($[% model_name_singular_variable %]); - }); - - return $this->successResponse( - [% models_were_retrieved %], - $[% data_variable %], - [ - 'links' => [ - 'first' => $[% model_name_plural_variable %]->url(1), - 'last' => $[% model_name_plural_variable %]->url($[% model_name_plural_variable %]->lastPage()), - 'prev' => $[% model_name_plural_variable %]->previousPageUrl(), - 'next' => $[% model_name_plural_variable %]->nextPageUrl(), - ], - 'meta' => - [ - 'current_page' => $[% model_name_plural_variable %]->currentPage(), - 'from' => $[% model_name_plural_variable %]->firstItem(), - 'last_page' => $[% model_name_plural_variable %]->lastPage(), - 'path' => $[% model_name_plural_variable %]->resolveCurrentPath(), - 'per_page' => $[% model_name_plural_variable %]->perPage(), - 'to' => $[% model_name_plural_variable %]->lastItem(), - 'total' => $[% model_name_plural_variable %]->total(), - ], - ] - ); \ No newline at end of file diff --git a/templates/default-collective/api-controller-call-show-api-resource.stub b/templates/default-collective/api-controller-call-show-api-resource.stub deleted file mode 100644 index c9c453d..0000000 --- a/templates/default-collective/api-controller-call-show-api-resource.stub +++ /dev/null @@ -1 +0,0 @@ -return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_retrieved %]); \ No newline at end of file diff --git a/templates/default-collective/api-controller-call-show-success-method.stub b/templates/default-collective/api-controller-call-show-success-method.stub deleted file mode 100644 index c35ff81..0000000 --- a/templates/default-collective/api-controller-call-show-success-method.stub +++ /dev/null @@ -1,4 +0,0 @@ -return $this->successResponse( - [% model_was_retrieved %], - $this->transform($[% model_name_singular_variable %]) - ); \ No newline at end of file diff --git a/templates/default-collective/api-controller-call-store-api-resource.stub b/templates/default-collective/api-controller-call-store-api-resource.stub deleted file mode 100644 index 48c1110..0000000 --- a/templates/default-collective/api-controller-call-store-api-resource.stub +++ /dev/null @@ -1 +0,0 @@ -return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_added %]); \ No newline at end of file diff --git a/templates/default-collective/api-controller-call-store-success-method.stub b/templates/default-collective/api-controller-call-store-success-method.stub deleted file mode 100644 index e03ecd1..0000000 --- a/templates/default-collective/api-controller-call-store-success-method.stub +++ /dev/null @@ -1,4 +0,0 @@ -return $this->successResponse( - [% model_was_added %], - $this->transform($[% model_name_singular_variable %]) - ); \ No newline at end of file diff --git a/templates/default-collective/api-controller-call-update-api-resource.stub b/templates/default-collective/api-controller-call-update-api-resource.stub deleted file mode 100644 index ba91ac7..0000000 --- a/templates/default-collective/api-controller-call-update-api-resource.stub +++ /dev/null @@ -1 +0,0 @@ -return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_updated %]); \ No newline at end of file diff --git a/templates/default-collective/api-controller-call-update-success-method.stub b/templates/default-collective/api-controller-call-update-success-method.stub deleted file mode 100644 index 5ea663a..0000000 --- a/templates/default-collective/api-controller-call-update-success-method.stub +++ /dev/null @@ -1,4 +0,0 @@ -return $this->successResponse( - [% model_was_updated %], - $this->transform($[% model_name_singular_variable %]) - ); \ No newline at end of file diff --git a/templates/default-collective/api-controller-error-response-method.stub b/templates/default-collective/api-controller-error-response-method.stub deleted file mode 100644 index 8b8879e..0000000 --- a/templates/default-collective/api-controller-error-response-method.stub +++ /dev/null @@ -1,14 +0,0 @@ - /** - * Get an error response - * - * @param mix $message - * - * @return Illuminate\Http\Response - */ - protected function errorResponse($message) - { - return response()->json([ - 'errors' => (array) $message, - 'success' => false, - ], 422); - } diff --git a/templates/default-collective/api-controller-get-validator.stub b/templates/default-collective/api-controller-get-validator.stub deleted file mode 100644 index 4414601..0000000 --- a/templates/default-collective/api-controller-get-validator.stub +++ /dev/null @@ -1,16 +0,0 @@ - - /** - * Gets a new validator instance with the defined rules. - * - * @param [% request_fullname %] $request - * - * @return Illuminate\Support\Facades\Validator - */ - protected function getValidator(Request $request) - { - $rules = [ -[% validation_rules %] - ]; -[% file_validation_snippet %] - return Validator::make($request->all(), $rules); - } diff --git a/templates/default-collective/api-controller-success-response-method.stub b/templates/default-collective/api-controller-success-response-method.stub deleted file mode 100644 index d8609e4..0000000 --- a/templates/default-collective/api-controller-success-response-method.stub +++ /dev/null @@ -1,18 +0,0 @@ - /** - * Get a success response - * - * @param mix $message - * @param mix $data - * @param array $meta - * - * @return Illuminate\Http\Response - */ - protected function successResponse($message, $data, array $meta = []) - { - return response()->json( - array_merge([ - 'data' => $data, - 'message' => $message, - 'success' => true, - ], $meta), 200); - } \ No newline at end of file diff --git a/templates/default-collective/api-controller-transform-method.stub b/templates/default-collective/api-controller-transform-method.stub deleted file mode 100644 index 950f975..0000000 --- a/templates/default-collective/api-controller-transform-method.stub +++ /dev/null @@ -1,13 +0,0 @@ - /** - * Transform the giving [% model_name %] to public friendly array - * - * @param [% use_full_model_name %] $[% model_name_singular_variable %] - * - * @return array - */ - protected function [% transform_method_name %]([% model_name_class %] $[% model_name_singular_variable %]) - { - return [ -[% model_api_array %] - ]; - } diff --git a/templates/default-collective/api-controller-validate.stub b/templates/default-collective/api-controller-validate.stub deleted file mode 100644 index c582ea6..0000000 --- a/templates/default-collective/api-controller-validate.stub +++ /dev/null @@ -1,5 +0,0 @@ -$validator = $this->getValidator($request); - - if ($validator->fails()) { - return $this->errorResponse($validator->errors()->all()); - } diff --git a/templates/default-collective/api-controller.stub b/templates/default-collective/api-controller.stub deleted file mode 100644 index ad86836..0000000 --- a/templates/default-collective/api-controller.stub +++ /dev/null @@ -1,104 +0,0 @@ -errorResponse([% unexpected_error %]); - } - } - - /** - * Display the specified [% model_name %]. - * - * @param int $id - * - * @return Illuminate\Http\Response - */ - public function show($id) - { - $[% model_name_singular_variable %] = [% model_name_class %]::[% with_relations_for_show %]findOrFail($id); - - [% show_return_success %] - } - - /** - * Update the specified [% model_name %] in the storage. - * - * @param int $id - * @param [% request_fullname %] [% request_variable %] - * - * @return Illuminate\Http\Response - */ - public function update($id, [% type_hinted_request_name %]) - { - try { - [% validator_request %] - $[% data_variable %] = [% call_get_data %]; - [% on_update_setter %] - $[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id); - $[% model_name_singular_variable %]->update($[% data_variable %]); - - [% update_return_success %] - } catch (Exception $exception) { - return $this->errorResponse([% unexpected_error %]); - } - } - - /** - * Remove the specified [% model_name %] from the storage. - * - * @param int $id - * - * @return Illuminate\Http\Response - */ - public function destroy($id) - { - try { - $[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id); - $[% model_name_singular_variable %]->delete(); - - [% destroy_return_success %] - } catch (Exception $exception) { - return $this->errorResponse([% unexpected_error %]); - } - } -[% get_validator_method %] -[% get_data_method %] -[% upload_method %] -[% transform_method %] -[% response_methods %] -} diff --git a/templates/default-collective/api-documentation-controller-version-based.stub b/templates/default-collective/api-documentation-controller-version-based.stub deleted file mode 100644 index d7c8117..0000000 --- a/templates/default-collective/api-documentation-controller-version-based.stub +++ /dev/null @@ -1,21 +0,0 @@ -getVersion($version)); - - return view($viewName); - } -} diff --git a/templates/default-collective/api-documentation-controller.stub b/templates/default-collective/api-documentation-controller.stub deleted file mode 100644 index 1b27cfe..0000000 --- a/templates/default-collective/api-documentation-controller.stub +++ /dev/null @@ -1,20 +0,0 @@ -[% required_title %] \ No newline at end of file diff --git a/templates/default-collective/api-documentation-index-authentication.stub b/templates/default-collective/api-documentation-index-authentication.stub deleted file mode 100644 index eb6a978..0000000 --- a/templates/default-collective/api-documentation-index-authentication.stub +++ /dev/null @@ -1,11 +0,0 @@ - - Authorization - [% string_title %] - - [% header_title %] - - [% access_token_with_bearer %] - @if(isset($showValidation) && $showValidation) - - @endif - diff --git a/templates/default-collective/api-documentation-index-failed-authentication.stub b/templates/default-collective/api-documentation-index-failed-authentication.stub deleted file mode 100644 index e412621..0000000 --- a/templates/default-collective/api-documentation-index-failed-authentication.stub +++ /dev/null @@ -1,16 +0,0 @@ -

    401 - Unauthorized

    -

    [% the_user_does_not_have_permission_to_access_the_requested_resource %]

    - - - - - - - - - - - - - -
    success[% boolean_title %][% indicate_whether_the_request_was_successful_or_not %]
    error[% array_of_strings %][% the_error_message %]
    diff --git a/templates/default-collective/api-documentation-index-failed-to-retrieve.stub b/templates/default-collective/api-documentation-index-failed-to-retrieve.stub deleted file mode 100644 index d94ce7a..0000000 --- a/templates/default-collective/api-documentation-index-failed-to-retrieve.stub +++ /dev/null @@ -1,16 +0,0 @@ -

    202 - Accepted

    -

    [% the_requested_model_does_not_exists %]

    - - - - - - - - - - - - - -
    success[% boolean_title %][% indicate_whether_the_request_was_successful_or_not %]
    error[% array_of_strings %][% the_error_message %]
    diff --git a/templates/default-collective/api-documentation-index-failed-validation.stub b/templates/default-collective/api-documentation-index-failed-validation.stub deleted file mode 100644 index 06c98b6..0000000 --- a/templates/default-collective/api-documentation-index-failed-validation.stub +++ /dev/null @@ -1,16 +0,0 @@ -

    422 - Unprocessable Entity

    -

    [% the_request_failed_validation %]

    - - - - - - - - - - - - - -
    success[% boolean_title %][% indicate_whether_the_request_was_successful_or_not %]
    errors[% array_of_strings %][% list_of_the_invalid_errors %]
    diff --git a/templates/default-collective/api-documentation-index-fields-list-body-row-for-model.stub b/templates/default-collective/api-documentation-index-fields-list-body-row-for-model.stub deleted file mode 100644 index 125a36d..0000000 --- a/templates/default-collective/api-documentation-index-fields-list-body-row-for-model.stub +++ /dev/null @@ -1,5 +0,0 @@ - - [% field_name %] - [% field_type_title %] - [% api_field_description %] - diff --git a/templates/default-collective/api-documentation-index-fields-list-body-row.stub b/templates/default-collective/api-documentation-index-fields-list-body-row.stub deleted file mode 100644 index 21c2c77..0000000 --- a/templates/default-collective/api-documentation-index-fields-list-body-row.stub +++ /dev/null @@ -1,12 +0,0 @@ - - [% field_name %] - [% field_type_title %] - [% body_title %] - [% api_field_description %] - @if($showValidation) - - [% validation_rule_required %] - [% validation_rules %] - - @endif - diff --git a/templates/default-collective/api-documentation-index-fields-list.stub b/templates/default-collective/api-documentation-index-fields-list.stub deleted file mode 100644 index c7c5429..0000000 --- a/templates/default-collective/api-documentation-index-fields-list.stub +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - @if($showValidation) - - @endif - - - - [% include_parameter_for_authorized_request %] - @if(isset($withPathId) && $withPathId) - - - - - - @if($showValidation) - - @endif - - - @endif - - [% fields_list_for_body %] - - - -
    [% parameter_name_title %][% data_type_title %][% parameter_type_title %][% description_title %][% validation_title %]
    [% model_name %][% primary_key_type_title %][% path_title %][% the_id_of_the_model %] - [% validation_rule_required %] -
    diff --git a/templates/default-collective/api-documentation-index-request.stub b/templates/default-collective/api-documentation-index-request.stub deleted file mode 100644 index bd1278a..0000000 --- a/templates/default-collective/api-documentation-index-request.stub +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - [% include_parameter_for_authorized_request %] - - -
    [% parameter_name_title %][% data_type_title %][% parameter_type_title %][% description_title %]
    diff --git a/templates/default-collective/api-documentation-index-retrieved-fields-body-row.stub b/templates/default-collective/api-documentation-index-retrieved-fields-body-row.stub deleted file mode 100644 index 125a36d..0000000 --- a/templates/default-collective/api-documentation-index-retrieved-fields-body-row.stub +++ /dev/null @@ -1,5 +0,0 @@ - - [% field_name %] - [% field_type_title %] - [% api_field_description %] - diff --git a/templates/default-collective/api-documentation-index-retrieved-fields.stub b/templates/default-collective/api-documentation-index-retrieved-fields.stub deleted file mode 100644 index 0c93577..0000000 --- a/templates/default-collective/api-documentation-index-retrieved-fields.stub +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - -[% fields_list_for_body %] - -
    [% name_title %][% type_title %][% description_title %]
    diff --git a/templates/default-collective/api-documentation-index-retrieved.stub b/templates/default-collective/api-documentation-index-retrieved.stub deleted file mode 100644 index 2c8cd87..0000000 --- a/templates/default-collective/api-documentation-index-retrieved.stub +++ /dev/null @@ -1,21 +0,0 @@ -

    200 - Ok

    -

    [% request_was_successful %]

    - - - - - - - - - - - - - - - - - - -
    success[% boolean_title %][% indicate_whether_the_request_was_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 %]
    diff --git a/templates/default-collective/api-documentation-index.stub b/templates/default-collective/api-documentation-index.stub deleted file mode 100644 index 00d7519..0000000 --- a/templates/default-collective/api-documentation-index.stub +++ /dev/null @@ -1,417 +0,0 @@ -@extends('[% layout_name %]') - -@section('content') - -

    [% model_plural %]

    -[% general_description %] -
    - -

    [% available_resources %]

    -
    -
    - -
    -
    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 %] - -
    -
    -
    - - -
    -
    - -
    -
    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 %] - -
    -
    -
    - - - -
    -
    - -
    -
    POST
    - /{{ Route::getRoutes()->getByName('[% update_route_name %]')->uri() }} - [% update_route_description %] -
    -
    - - - -
    - -
    - -
    -
    - -

    [% request_title %]

    - - @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 %] - -
    -
    -
    - - - -
    -
    - -
    -
    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 %] - -
    -
    -
    - - - -
    -
    - -
    -
    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 %] - -
    -
    -
    - -
    - -

    [% model_definition_title %]

    -
    -
    - -
    - [% model_name_title %] -
    -
    - - - -
    - -
    - -
    -
    - - - - - - - - - - [% fields_list_for_body %] - -
    [% field_name_title %][% field_type_title %][% description_title %]
    -
    -
    -
    - -
    - -@endsection diff --git a/templates/default-collective/api-documentation-routes-8.stub b/templates/default-collective/api-documentation-routes-8.stub deleted file mode 100644 index 1e3291f..0000000 --- a/templates/default-collective/api-documentation-routes-8.stub +++ /dev/null @@ -1,2 +0,0 @@ -Route::get('[% prefix %][% version %]', [[% controller_name %]::class, 'index']) - ->name('[% index_route_name %]'); diff --git a/templates/default-collective/api-documentation-routes.stub b/templates/default-collective/api-documentation-routes.stub deleted file mode 100644 index d74d23f..0000000 --- a/templates/default-collective/api-documentation-routes.stub +++ /dev/null @@ -1,2 +0,0 @@ -Route::get('[% prefix %][% version %]', '[% controller_name %]@index') - ->name('[% index_route_name %]'); diff --git a/templates/default-collective/api-documentation-version-based-base-controller.stub b/templates/default-collective/api-documentation-version-based-base-controller.stub deleted file mode 100644 index 9f4201d..0000000 --- a/templates/default-collective/api-documentation-version-based-base-controller.stub +++ /dev/null @@ -1,38 +0,0 @@ -versions)) { - return $version; - } - - return end($this->versions); - } -} \ No newline at end of file diff --git a/templates/default-collective/api-resource-collection.stub b/templates/default-collective/api-resource-collection.stub deleted file mode 100644 index f6f8578..0000000 --- a/templates/default-collective/api-resource-collection.stub +++ /dev/null @@ -1,50 +0,0 @@ -message = $message; - } - - /** - * Transform the resource collection into an array. - * - * @param \Illuminate\Http\Request - * @return array - */ - public function toArray($request) - { - return [ - 'data' => $this->collection->transform(function ($[% model_name_singular_variable %]) { - return $this->transformModel($[% model_name_singular_variable %]); - }), - 'message' => $this->message, - 'success' => true, - ]; - } - -[% transform_method %] -} diff --git a/templates/default-collective/api-resource.stub b/templates/default-collective/api-resource.stub deleted file mode 100644 index addba74..0000000 --- a/templates/default-collective/api-resource.stub +++ /dev/null @@ -1,59 +0,0 @@ -message = $message; - } - - /** - * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * - * @return array - */ - public function toArray($request) - { - return [ -[% model_api_array %] - ]; - } - - /** - * Get any additional data that should be returned with the resource array. - * - * @param \Illuminate\Http\Request $request - * - * @return array - */ - public function with($request) - { - return [ - 'success' => true, - 'message' => $this->message, - ]; - } -} diff --git a/templates/default-collective/api-routes-8.stub b/templates/default-collective/api-routes-8.stub deleted file mode 100644 index 28e3886..0000000 --- a/templates/default-collective/api-routes-8.stub +++ /dev/null @@ -1,10 +0,0 @@ - Route::get('/', [[% controller_name %]::class, 'index']) - ->name('[% index_route_name %]'); - Route::get('/show/{[% model_name_singular_variable %]}',[[% controller_name %]::class, 'show']) - ->name('[% show_route_name %]')[% route_id_clause %]; - Route::post('/', [[% controller_name %]::class, 'store']) - ->name('[% store_route_name %]'); - Route::put('[% model_name_snake %]/{[% model_name_singular_variable %]}', [[% controller_name %]::class, 'update']) - ->name('[% update_route_name %]')[% route_id_clause %]; - Route::delete('/[% model_name_snake %]/{[% model_name_singular_variable %]}',[[% controller_name %]::class, 'destroy']) - ->name('[% destroy_route_name %]')[% route_id_clause %]; \ No newline at end of file diff --git a/templates/default-collective/api-routes.stub b/templates/default-collective/api-routes.stub deleted file mode 100644 index bd4043d..0000000 --- a/templates/default-collective/api-routes.stub +++ /dev/null @@ -1,10 +0,0 @@ - Route::get('/', '[% controller_name %]@index') - ->name('[% index_route_name %]'); - Route::get('/show/{[% model_name_singular_variable %]}','[% controller_name %]@show') - ->name('[% show_route_name %]')[% route_id_clause %]; - Route::post('/', '[% controller_name %]@store') - ->name('[% store_route_name %]'); - Route::put('[% model_name_snake %]/{[% model_name_singular_variable %]}', '[% controller_name %]@update') - ->name('[% update_route_name %]')[% route_id_clause %]; - Route::delete('/[% model_name_snake %]/{[% model_name_singular_variable %]}','[% controller_name %]@destroy') - ->name('[% destroy_route_name %]')[% route_id_clause %]; \ No newline at end of file diff --git a/templates/default-collective/controller-affirm-method.stub b/templates/default-collective/controller-affirm-method.stub deleted file mode 100644 index 7e76d9d..0000000 --- a/templates/default-collective/controller-affirm-method.stub +++ /dev/null @@ -1,17 +0,0 @@ - - /** - * Validate the given request with the defined rules. - * - * @param [% request_fullname %] $request - * - * @return boolean - */ - protected function affirm(Request $request) - { - $rules = [ -[% validation_rules %] - ]; -[% file_validation_snippet %] - - return $this->validate($request, $rules); - } diff --git a/templates/default-collective/controller-constructor.stub b/templates/default-collective/controller-constructor.stub deleted file mode 100644 index a670bb3..0000000 --- a/templates/default-collective/controller-constructor.stub +++ /dev/null @@ -1,10 +0,0 @@ - /** - * Create a new controller instance. - * - * @return void - */ - public function __construct() - { - [% auth_middleware %] - } - \ No newline at end of file diff --git a/templates/default-collective/controller-getdata-method-5.5.stub b/templates/default-collective/controller-getdata-method-5.5.stub deleted file mode 100644 index 3295ab8..0000000 --- a/templates/default-collective/controller-getdata-method-5.5.stub +++ /dev/null @@ -1,21 +0,0 @@ - - /** - * Get the request's data from the request. - * - * [% request_name_comment %] - * @return array - */ - [% visibility_level %] function getData([% type_hinted_request_name %]) - { - $rules = [ - [% validation_rules %] - ]; - - [% file_validation_snippet %] - $data = [% request_variable %]->validate($rules); - -[% file_snippet %] -[% boolean_snippet %] -[% string_to_null_snippet %] - return $data; - } \ No newline at end of file diff --git a/templates/default-collective/controller-getdata-method.stub b/templates/default-collective/controller-getdata-method.stub deleted file mode 100644 index f35cf67..0000000 --- a/templates/default-collective/controller-getdata-method.stub +++ /dev/null @@ -1,15 +0,0 @@ - - /** - * Get the request's data from the request. - * - * [% request_name_comment %] - * @return array - */ - [% visibility_level %] function getData([% type_hinted_request_name %]) - { - $data = [% request_variable %]->only([% fillable %]); -[% file_snippet %] -[% boolean_snippet %] -[% string_to_null_snippet %] - return $data; - } \ No newline at end of file diff --git a/templates/default-collective/controller-upload-method-5.3.stub b/templates/default-collective/controller-upload-method-5.3.stub deleted file mode 100644 index 69c3e91..0000000 --- a/templates/default-collective/controller-upload-method-5.3.stub +++ /dev/null @@ -1,20 +0,0 @@ - - /** - * Moves the attached file to the server. - * - * @param Symfony\Component\HttpFoundation\File\UploadedFile $file - * - * @return string - */ - protected function moveFile($file) - { - if (!$file->isValid()) { - 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 diff --git a/templates/default-collective/controller-upload-method.stub b/templates/default-collective/controller-upload-method.stub deleted file mode 100644 index 69c3e91..0000000 --- a/templates/default-collective/controller-upload-method.stub +++ /dev/null @@ -1,20 +0,0 @@ - - /** - * Moves the attached file to the server. - * - * @param Symfony\Component\HttpFoundation\File\UploadedFile $file - * - * @return string - */ - protected function moveFile($file) - { - if (!$file->isValid()) { - 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 diff --git a/templates/default-collective/controller.stub b/templates/default-collective/controller.stub deleted file mode 100644 index cbe851c..0000000 --- a/templates/default-collective/controller.stub +++ /dev/null @@ -1,138 +0,0 @@ -route('[% index_route_name %]') - ->with('success_message', [% model_was_added %]); - } catch (Exception $exception) { - - return back()->withInput() - ->withErrors(['unexpected_error' => [% unexpected_error %]]); - } - } - - /** - * Display the specified [% model_name %]. - * - * @param int $id - * - * @return Illuminate\View\View - */ - public function show($id) - { - $[% model_name_singular_variable %] = [% model_name_class %]::[% with_relations_for_show %]findOrFail($id); - - return view('[% show_view_name %]'[% view_variables_for_show %]); - } - - /** - * Show the form for editing the specified [% model_name %]. - * - * @param int $id - * - * @return Illuminate\View\View - */ - public function edit($id) - { - $[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id); - [% relation_collections %] - - return view('[% edit_view_name %]'[% view_variables_for_edit %]); - } - - /** - * Update the specified [% model_name %] in the storage. - * - * @param int $id - * @param [% request_fullname %] [% request_variable %] - * - * @return Illuminate\Http\RedirectResponse | Illuminate\Routing\Redirector - */ - public function update($id, [% type_hinted_request_name %]) - { - try { - [% call_affirm %] - $[% data_variable %] = [% call_get_data %]; - [% on_update_setter %] - $[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id); - $[% model_name_singular_variable %]->update($[% data_variable %]); - - return redirect()->route('[% index_route_name %]') - ->with('success_message', [% model_was_updated %]); - } catch (Exception $exception) { - - return back()->withInput() - ->withErrors(['unexpected_error' => [% unexpected_error %]]); - } - } - - /** - * Remove the specified [% model_name %] from the storage. - * - * @param int $id - * - * @return Illuminate\Http\RedirectResponse | Illuminate\Routing\Redirector - */ - public function destroy($id) - { - try { - $[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id); - $[% model_name_singular_variable %]->delete(); - - return redirect()->route('[% index_route_name %]') - ->with('success_message', [% model_was_deleted %]); - } catch (Exception $exception) { - - return back()->withInput() - ->withErrors(['unexpected_error' => [% unexpected_error %]]); - } - } -[% affirm_method %] -[% get_data_method %] -[% upload_method %] -} diff --git a/templates/default-collective/create.blade.stub b/templates/default-collective/create.blade.stub deleted file mode 100644 index be65568..0000000 --- a/templates/default-collective/create.blade.stub +++ /dev/null @@ -1,56 +0,0 @@ -@extends('[% layout_name %]') - -@section('content') - -
    - -
    - -
    -

    [% create_model %]

    -
    - -
    - - - - - -
    - -
    - -
    - - @if ($errors->any()) -
      - @foreach ($errors->all() as $error) -
    • {{ $error }}
    • - @endforeach -
    - @endif - - {!! Form::open([ - 'route' => '[% store_route_name %]', - 'class' => 'form-horizontal', - 'name' => '[% form_name %]', - 'id' => '[% form_id %]', - [% upload_files %] - ]) - !!} - - @include ('[% form_view_name %]', ['[% model_name_singular_variable %]' => null,]) -
    -
    - {!! Form::submit([% add %], ['class' => 'btn btn-primary']) !!} -
    -
    - - {!! Form::close() !!} - -
    -
    - -@endsection - - diff --git a/templates/default-collective/edit.blade.stub b/templates/default-collective/edit.blade.stub deleted file mode 100644 index 3dcc739..0000000 --- a/templates/default-collective/edit.blade.stub +++ /dev/null @@ -1,58 +0,0 @@ -@extends('[% layout_name %]') - -@section('content') - -
    - -
    - -
    -

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

    -
    - -
    - - - - - - - - - -
    -
    - -
    - - @if ($errors->any()) -
      - @foreach ($errors->all() as $error) -
    • {{ $error }}
    • - @endforeach -
    - @endif - - {!! Form::model($[% model_name_singular_variable %], [ - 'method' => 'PUT', - 'route' => ['[% update_route_name %]', $[% model_name_singular_variable %]->[% primary_key %]], - 'class' => 'form-horizontal', - 'name' => '[% form_name %]', - 'id' => '[% form_id %]', - [% upload_files %] - ]) !!} - - @include ('[% form_view_name %]', ['[% model_name_singular_variable %]' => $[% model_name_singular_variable %],]) - -
    -
    - {!! Form::submit([% update %], ['class' => 'btn btn-primary']) !!} -
    -
    - - {!! Form::close() !!} - -
    -
    - -@endsection \ No newline at end of file diff --git a/templates/default-collective/form-file-field.blade.stub b/templates/default-collective/form-file-field.blade.stub deleted file mode 100644 index f986e18..0000000 --- a/templates/default-collective/form-file-field.blade.stub +++ /dev/null @@ -1,20 +0,0 @@ -
    - - -
    - - @if (isset($[% model_name_singular_variable %]->[% field_name %]) && !empty($[% model_name_singular_variable %]->[% field_name %])) -
    - - Delete - - - - {{ [% field_value %] }} - -
    - @endif \ No newline at end of file diff --git a/templates/default-collective/form-helper-field.blade.stub b/templates/default-collective/form-helper-field.blade.stub deleted file mode 100644 index 51928cb..0000000 --- a/templates/default-collective/form-helper-field.blade.stub +++ /dev/null @@ -1 +0,0 @@ - {!! $errors->first('[% field_name %]', '

    :message

    ') !!} \ No newline at end of file diff --git a/templates/default-collective/form-input-field.blade.stub b/templates/default-collective/form-input-field.blade.stub deleted file mode 100644 index d37139b..0000000 --- a/templates/default-collective/form-input-field.blade.stub +++ /dev/null @@ -1 +0,0 @@ - {!! Form::[% field_type %]('[% field_name %]',[% field_value %], ['class' => 'form-control[% css_class %]',[% min_length %][% max_length %][% min_value %][% max_value %][% required_field %][% placeholder %][% step %] ]) !!} \ No newline at end of file diff --git a/templates/default-collective/form-input-wrapper.blade.stub b/templates/default-collective/form-input-wrapper.blade.stub deleted file mode 100644 index 23c42f3..0000000 --- a/templates/default-collective/form-input-wrapper.blade.stub +++ /dev/null @@ -1,8 +0,0 @@ - -
    -[% field_label %] -
    -[% field_input %] -[% field_validation_helper %] -
    -
    diff --git a/templates/default-collective/form-label-field.blade.stub b/templates/default-collective/form-label-field.blade.stub deleted file mode 100644 index 5ae8c70..0000000 --- a/templates/default-collective/form-label-field.blade.stub +++ /dev/null @@ -1 +0,0 @@ - {!! Form::label('[% field_name %]',[% field_title %],['class' => 'col-md-2 control-label']) !!} \ No newline at end of file diff --git a/templates/default-collective/form-month-field.blade.stub b/templates/default-collective/form-month-field.blade.stub deleted file mode 100644 index 4e7cde7..0000000 --- a/templates/default-collective/form-month-field.blade.stub +++ /dev/null @@ -1 +0,0 @@ - {!! Form::selectMonth('[% field_name %]', [% selected_value %], ['class' => 'form-control[% css_class %]']) !!} \ No newline at end of file diff --git a/templates/default-collective/form-nolabel-field.blade.stub b/templates/default-collective/form-nolabel-field.blade.stub deleted file mode 100644 index 78460f9..0000000 --- a/templates/default-collective/form-nolabel-field.blade.stub +++ /dev/null @@ -1 +0,0 @@ -
    \ No newline at end of file diff --git a/templates/default-collective/form-password-field.blade.stub b/templates/default-collective/form-password-field.blade.stub deleted file mode 100644 index 808d487..0000000 --- a/templates/default-collective/form-password-field.blade.stub +++ /dev/null @@ -1 +0,0 @@ - {!! Form::[% field_type %]('[% field_name %]', ['class' => 'form-control[% css_class %]',[% min_length %][% max_length %][% min_value %][% max_value %][% required_field %][% placeholder %] ]) !!} \ No newline at end of file diff --git a/templates/default-collective/form-pickitems-field.blade.stub b/templates/default-collective/form-pickitems-field.blade.stub deleted file mode 100644 index d15e520..0000000 --- a/templates/default-collective/form-pickitems-field.blade.stub +++ /dev/null @@ -1,6 +0,0 @@ -
    - -
    \ No newline at end of file diff --git a/templates/default-collective/form-pickitems-inline-field.blade.stub b/templates/default-collective/form-pickitems-inline-field.blade.stub deleted file mode 100644 index e594e19..0000000 --- a/templates/default-collective/form-pickitems-inline-field.blade.stub +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/templates/default-collective/form-request.stub b/templates/default-collective/form-request.stub deleted file mode 100644 index 22ecfd7..0000000 --- a/templates/default-collective/form-request.stub +++ /dev/null @@ -1,35 +0,0 @@ - 'form-control[% css_class %]',[% field_multiple %][% required_field %][% placeholder %] ]) !!} \ No newline at end of file diff --git a/templates/default-collective/form-selectrange-field.blade.stub b/templates/default-collective/form-selectrange-field.blade.stub deleted file mode 100644 index 65065b5..0000000 --- a/templates/default-collective/form-selectrange-field.blade.stub +++ /dev/null @@ -1 +0,0 @@ - {!! Form::selectRange('[% field_name %]', [% min_value %], [% max_value %], [% selected_value %], ['class' => 'form-control[% css_class %]']) !!} \ No newline at end of file diff --git a/templates/default-collective/form-textarea-field.blade.stub b/templates/default-collective/form-textarea-field.blade.stub deleted file mode 100644 index aaebc0a..0000000 --- a/templates/default-collective/form-textarea-field.blade.stub +++ /dev/null @@ -1 +0,0 @@ - {!! Form::textarea('[% field_name %]', [% field_value %], ['class' => 'form-control[% css_class %]',[% min_length %][% max_length %][% min_value %][% max_value %][% required_field %][% placeholder %] ]) !!} \ No newline at end of file diff --git a/templates/default-collective/form.blade.stub b/templates/default-collective/form.blade.stub deleted file mode 100644 index ad6d762..0000000 --- a/templates/default-collective/form.blade.stub +++ /dev/null @@ -1 +0,0 @@ -[% form_fields_html %] diff --git a/templates/default-collective/index.blade.stub b/templates/default-collective/index.blade.stub deleted file mode 100644 index 769cc6e..0000000 --- a/templates/default-collective/index.blade.stub +++ /dev/null @@ -1,96 +0,0 @@ -@extends('[% layout_name %]') - -@section('content') - - @if(Session::has('success_message')) -
    - - {!! session('success_message') !!} - - - -
    - @endif - -
    - -
    - -
    -

    [% model_name_plural_title %]

    -
    - -
    - - - - - -
    - -
    - - @if(count($[% model_name_plural_variable %]) == 0) -
    -

    [% no_models_available %]

    -
    - @else -
    -
    - - - - -[% header_cells %] - - - - - @foreach($[% model_name_plural_variable %] as $[% model_name_singular_variable %]) - -[% body_cells %] - - - @endforeach - -
    - - {!! Form::open([ - 'method' =>'DELETE', - 'route' => ['[% destroy_route_name %]', $[% model_name_singular_variable %]->[% primary_key %]], - 'style' => 'display: inline;', - ]) !!} -
    - [% primary_key %] ) }}" class="btn btn-info" title="[% show_model %]"> - - - [% primary_key %] ) }}" class="btn btn-primary" title="[% edit_model %]"> - - - - {!! Form::button('', - [ - 'type' => 'submit', - 'class' => 'btn btn-danger', - 'title' => [% delete_model %], - 'onclick' => 'return confirm("' . [% confirm_delete %] . '")' - ]) - !!} -
    - {!! Form::close() !!} -
    - -
    - -
    - - - - @endif - -
    -@endsection \ No newline at end of file diff --git a/templates/default-collective/index.body.cell.blade.stub b/templates/default-collective/index.body.cell.blade.stub deleted file mode 100644 index 55cb084..0000000 --- a/templates/default-collective/index.body.cell.blade.stub +++ /dev/null @@ -1 +0,0 @@ - {{ [% field_value %] }} \ No newline at end of file diff --git a/templates/default-collective/index.header.cell.blade.stub b/templates/default-collective/index.header.cell.blade.stub deleted file mode 100644 index 8ca0b94..0000000 --- a/templates/default-collective/index.header.cell.blade.stub +++ /dev/null @@ -1 +0,0 @@ - [% field_title %] \ No newline at end of file diff --git a/templates/default-collective/language.stub b/templates/default-collective/language.stub deleted file mode 100644 index 4a711de..0000000 --- a/templates/default-collective/language.stub +++ /dev/null @@ -1,5 +0,0 @@ - - - - - - - - {{ config('app.name', '[% application_name %]') }} - - - - - {{-- --}} - - - - - - - - - -
    - @yield('content') -
    - - - - - - {{-- --}} - - - - diff --git a/templates/default-collective/layout.stub b/templates/default-collective/layout.stub deleted file mode 100644 index 3b78180..0000000 --- a/templates/default-collective/layout.stub +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - {{ config('app.name', '[% application_name %]') }} - - - - - {{-- --}} - - - - - - - - - -
    - @yield('content') -
    - - - - - {{-- --}} - - - - diff --git a/templates/default-collective/login-partial.stub b/templates/default-collective/login-partial.stub deleted file mode 100644 index 86f73df..0000000 --- a/templates/default-collective/login-partial.stub +++ /dev/null @@ -1,10 +0,0 @@ -@if (Route::has('login')) - -@endif \ No newline at end of file diff --git a/templates/default-collective/migration-schema-down.stub b/templates/default-collective/migration-schema-down.stub deleted file mode 100644 index 22fa175..0000000 --- a/templates/default-collective/migration-schema-down.stub +++ /dev/null @@ -1 +0,0 @@ -Schema::[% connection_name %]drop('[% table_name %]'); \ No newline at end of file diff --git a/templates/default-collective/migration-schema-up.stub b/templates/default-collective/migration-schema-up.stub deleted file mode 100644 index 871cdc3..0000000 --- a/templates/default-collective/migration-schema-up.stub +++ /dev/null @@ -1,4 +0,0 @@ -Schema::[% connection_name %][% operation_name %]('[% table_name %]', function(Blueprint $table) - { -[% blue_print_body %] - }); \ No newline at end of file diff --git a/templates/default-collective/migration.stub b/templates/default-collective/migration.stub deleted file mode 100644 index 43bfce1..0000000 --- a/templates/default-collective/migration.stub +++ /dev/null @@ -1,27 +0,0 @@ -attributes['[% field_name %]'] = !empty($value) ? \DateTime::createFromFormat($this->getDateFormat(), $value) : null; \ No newline at end of file diff --git a/templates/default-collective/model-mutator-multiple-answers.stub b/templates/default-collective/model-mutator-multiple-answers.stub deleted file mode 100644 index 0da4880..0000000 --- a/templates/default-collective/model-mutator-multiple-answers.stub +++ /dev/null @@ -1 +0,0 @@ -$this->attributes['[% field_name %]'] = json_encode($value); \ No newline at end of file diff --git a/templates/default-collective/model-mutator.stub b/templates/default-collective/model-mutator.stub deleted file mode 100644 index fc8eae0..0000000 --- a/templates/default-collective/model-mutator.stub +++ /dev/null @@ -1,10 +0,0 @@ - /** - * Set the [% field_name %]. - * - * @param string $value - * @return void - */ - public function set[% field_name_cap %]Attribute($value) - { - [% content %] - } diff --git a/templates/default-collective/model-primary-key.stub b/templates/default-collective/model-primary-key.stub deleted file mode 100644 index 925b8ea..0000000 --- a/templates/default-collective/model-primary-key.stub +++ /dev/null @@ -1,6 +0,0 @@ - /** - * The database primary key value. - * - * @var string - */ - protected $primaryKey = '[% primary_key %]'; \ No newline at end of file diff --git a/templates/default-collective/model-relation.stub b/templates/default-collective/model-relation.stub deleted file mode 100644 index 0ce8050..0000000 --- a/templates/default-collective/model-relation.stub +++ /dev/null @@ -1,9 +0,0 @@ - /** - * Get the [% relation_name %] for this model. - * - * @return [% relation_return_type %] - */ - public function [% relation_name %]() - { - return $this->[% relation_type %]([% relation_params %]); - } diff --git a/templates/default-collective/model-timestamps.stub b/templates/default-collective/model-timestamps.stub deleted file mode 100644 index ca00793..0000000 --- a/templates/default-collective/model-timestamps.stub +++ /dev/null @@ -1,6 +0,0 @@ - /** - * Indicates if the model should be timestamped. - * - * @var bool - */ - public $timestamps = false; \ No newline at end of file diff --git a/templates/default-collective/model.stub b/templates/default-collective/model.stub deleted file mode 100644 index e247af6..0000000 --- a/templates/default-collective/model.stub +++ /dev/null @@ -1,44 +0,0 @@ -name('[% index_route_name %]'); - Route::get('/create', [[% controller_name %]::class, 'create']) - ->name('[% create_route_name %]'); - Route::get('/show/{[% model_name_singular_variable %]}',[[% controller_name %]::class, 'show']) - ->name('[% show_route_name %]')[% route_id_clause %]; - Route::get('/{[% model_name_singular_variable %]}/edit',[[% controller_name %]::class, 'edit']) - ->name('[% edit_route_name %]')[% route_id_clause %]; - Route::post('/', [[% controller_name %]::class, 'store']) - ->name('[% store_route_name %]'); - Route::put('[% model_name_snake %]/{[% model_name_singular_variable %]}', [[% controller_name %]::class, 'update']) - ->name('[% update_route_name %]')[% route_id_clause %]; - Route::delete('/[% model_name_snake %]/{[% model_name_singular_variable %]}',[[% controller_name %]::class, 'destroy']) - ->name('[% destroy_route_name %]')[% route_id_clause %]; \ No newline at end of file diff --git a/templates/default-collective/routes-group.stub b/templates/default-collective/routes-group.stub deleted file mode 100644 index 23a1f20..0000000 --- a/templates/default-collective/routes-group.stub +++ /dev/null @@ -1,6 +0,0 @@ - -Route::group([ - [% prefix %] -], function () { -[% routes %] -}); diff --git a/templates/default-collective/routes.stub b/templates/default-collective/routes.stub deleted file mode 100644 index 615d786..0000000 --- a/templates/default-collective/routes.stub +++ /dev/null @@ -1,14 +0,0 @@ - Route::get('/', '[% controller_name %]@index') - ->name('[% index_route_name %]'); - Route::get('/create','[% controller_name %]@create') - ->name('[% create_route_name %]'); - Route::get('/show/{[% model_name_singular_variable %]}','[% controller_name %]@show') - ->name('[% show_route_name %]')[% route_id_clause %]; - Route::get('/{[% model_name_singular_variable %]}/edit','[% controller_name %]@edit') - ->name('[% edit_route_name %]')[% route_id_clause %]; - Route::post('/', '[% controller_name %]@store') - ->name('[% store_route_name %]'); - Route::put('[% model_name_snake %]/{[% model_name_singular_variable %]}', '[% controller_name %]@update') - ->name('[% update_route_name %]')[% route_id_clause %]; - Route::delete('/[% model_name_snake %]/{[% model_name_singular_variable %]}','[% controller_name %]@destroy') - ->name('[% destroy_route_name %]')[% route_id_clause %]; \ No newline at end of file diff --git a/templates/default-collective/show.blade.stub b/templates/default-collective/show.blade.stub deleted file mode 100644 index 34a4698..0000000 --- a/templates/default-collective/show.blade.stub +++ /dev/null @@ -1,54 +0,0 @@ -@extends('[% layout_name %]') - -@section('content') - -
    -
    - -
    -

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

    -
    - -
    - - {!! Form::open([ - 'method' =>'DELETE', - 'route' => ['[% destroy_route_name %]', $[% model_name_singular_variable %]->[% primary_key %]] - ]) !!} -
    - - - - - - - - - [% primary_key %] ) }}" class="btn btn-primary" title="[% edit_model %]"> - - - - {!! Form::button('', - [ - 'type' => 'submit', - 'class' => 'btn btn-danger', - 'title' => [% delete_model %], - 'onclick' => 'return confirm("' . [% confirm_delete %] . '")' - ]) - !!} -
    - {!! Form::close() !!} - -
    - -
    - -
    -
    -[% table_rows %] -
    - -
    -
    - -@endsection \ No newline at end of file diff --git a/templates/default-collective/show.row.blade.stub b/templates/default-collective/show.row.blade.stub deleted file mode 100644 index bddf14d..0000000 --- a/templates/default-collective/show.row.blade.stub +++ /dev/null @@ -1,2 +0,0 @@ -
    [% field_title %]
    -
    {{ [% field_value %] }}
    \ No newline at end of file diff --git a/templates/default-collective/view-model.stub b/templates/default-collective/view-model.stub deleted file mode 100644 index d861db4..0000000 --- a/templates/default-collective/view-model.stub +++ /dev/null @@ -1,30 +0,0 @@ -

    [% 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/controller.stub b/templates/default/controller.stub index bbdb6b6..fbd784e 100644 --- a/templates/default/controller.stub +++ b/templates/default/controller.stub @@ -41,19 +41,13 @@ class [% controller_name %] [% controller_extends %] */ public function store([% type_hinted_request_name %]) { - try { - [% call_affirm %] - $[% data_variable %] = [% call_get_data %]; - [% on_store_setter %] - [% model_name_class %]::create($[% data_variable %]); - - return redirect()->route('[% index_route_name %]') - ->with('success_message', [% model_was_added %]); - } catch (Exception $exception) { + [% call_affirm %] + $[% data_variable %] = [% call_get_data %]; + [% on_store_setter %] + [% model_name_class %]::create($[% data_variable %]); - return back()->withInput() - ->withErrors(['unexpected_error' => [% unexpected_error %]]); - } + return redirect()->route('[% index_route_name %]') + ->with('success_message', [% model_was_added %]); } /** @@ -95,20 +89,14 @@ class [% controller_name %] [% controller_extends %] */ public function update($id, [% type_hinted_request_name %]) { - try { - [% call_affirm %] - $[% data_variable %] = [% call_get_data %]; - [% on_update_setter %] - $[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id); - $[% model_name_singular_variable %]->update($[% data_variable %]); - - return redirect()->route('[% index_route_name %]') - ->with('success_message', [% model_was_updated %]); - } catch (Exception $exception) { + [% call_affirm %] + $[% data_variable %] = [% call_get_data %]; + [% on_update_setter %] + $[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id); + $[% model_name_singular_variable %]->update($[% data_variable %]); - return back()->withInput() - ->withErrors(['unexpected_error' => [% unexpected_error %]]); - } + return redirect()->route('[% index_route_name %]') + ->with('success_message', [% model_was_updated %]); } /** diff --git a/templates/default/create.blade.stub b/templates/default/create.blade.stub index 3c274ec..ac5dfc4 100644 --- a/templates/default/create.blade.stub +++ b/templates/default/create.blade.stub @@ -2,42 +2,38 @@ @section('content') -
    +
    -
    - - -

    [% create_model %]

    -
    - -
    +
    +

    [% create_model %]

    + -
    + -
    +
    @if ($errors->any()) -
      - @foreach ($errors->all() as $error) -
    • {{ $error }}
    • - @endforeach -
    + @endif -
    + {{ csrf_field() }} @include ('[% form_view_name %]', [ '[% model_name_singular_variable %]' => null, ]) -
    -
    - -
    +
    +
    diff --git a/templates/default/edit.blade.stub b/templates/default/edit.blade.stub index ef0e382..081642d 100644 --- a/templates/default/edit.blade.stub +++ b/templates/default/edit.blade.stub @@ -2,47 +2,42 @@ @section('content') -
    +
    -
    - -
    -

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

    -
    -
    - +
    +

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

    +
    -
    +
    @if ($errors->any()) -
      - @foreach ($errors->all() as $error) -
    • {{ $error }}
    • - @endforeach -
    + @endif -
    [% primary_key %]) }}" id="[% form_id %]" name="[% form_name %]" accept-charset="UTF-8" class="form-horizontal"[% upload_files %]> + [% primary_key %]) }}" id="[% form_id %]" name="[% form_name %]" accept-charset="UTF-8" [% upload_files %]> {{ csrf_field() }} @include ('[% form_view_name %]', [ '[% model_name_singular_variable %]' => $[% model_name_singular_variable %], ]) -
    -
    - -
    +
    +
    diff --git a/templates/default/form-file-field.blade.stub b/templates/default/form-file-field.blade.stub index f986e18..06fe6cf 100644 --- a/templates/default/form-file-field.blade.stub +++ b/templates/default/form-file-field.blade.stub @@ -1,20 +1,14 @@ -
    - - +
    +
    @if (isset($[% model_name_singular_variable %]->[% field_name %]) && !empty($[% model_name_singular_variable %]->[% field_name %])) -
    - - Delete - - - {{ [% field_value %] }} - -
    - @endif \ No newline at end of file +
    +
    + +
    + +
    + + @endif diff --git a/templates/default/form-helper-field.blade.stub b/templates/default/form-helper-field.blade.stub index 51928cb..d34652f 100644 --- a/templates/default/form-helper-field.blade.stub +++ b/templates/default/form-helper-field.blade.stub @@ -1 +1 @@ - {!! $errors->first('[% field_name %]', '

    :message

    ') !!} \ No newline at end of file + {!! $errors->first('[% field_name %]', '
    :message
    ') !!} \ No newline at end of file diff --git a/templates/default/form-input-field.blade.stub b/templates/default/form-input-field.blade.stub index bf9e70e..fd62a05 100644 --- a/templates/default/form-input-field.blade.stub +++ b/templates/default/form-input-field.blade.stub @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/templates/default/form-input-wrapper.blade.stub b/templates/default/form-input-wrapper.blade.stub index 23c42f3..ac7c9cf 100644 --- a/templates/default/form-input-wrapper.blade.stub +++ b/templates/default/form-input-wrapper.blade.stub @@ -1,7 +1,7 @@ -
    +
    [% field_label %] -
    +
    [% field_input %] [% field_validation_helper %]
    diff --git a/templates/default/form-label-field.blade.stub b/templates/default/form-label-field.blade.stub index 73505ca..b48e5f3 100644 --- a/templates/default/form-label-field.blade.stub +++ b/templates/default/form-label-field.blade.stub @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/templates/default/form-month-field.blade.stub b/templates/default/form-month-field.blade.stub index cbe7a2c..8ba00e6 100644 --- a/templates/default/form-month-field.blade.stub +++ b/templates/default/form-month-field.blade.stub @@ -1,4 +1,4 @@ - [% placeholder %] @foreach (range(1, 12) as $value)