From a368f1ef7bc7bd0924d3f56db91a2a9ec7d68ec9 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 11:59:08 -0500 Subject: [PATCH 01/37] Commit new documentation site --- README.md | 2 +- docs/.gitignore | 20 + docs/README.md | 89 +- docs/babel.config.js | 3 + docs/blog/2022-08-02-welcome.md | 10 + docs/blog/2024-02-22-New-documentation.md | 9 + docs/blog/authors.yml | 5 + docs/{07. Cookbook.md => docs/cookbook.md} | 22 +- docs/{04. Guards.md => docs/guards.md} | 17 +- .../images/workflow-with-guards.png | Bin .../images/workflow-without-guards.png | Bin docs/docs/installation.md | 42 + docs/{01. Introduction.md => docs/intro.md} | 35 +- .../quick-start.md} | 32 +- .../role-providers.md} | 8 +- .../{05. Strategies.md => docs/strategies.md} | 9 +- docs/docs/support.md | 16 + .../using-the-authorization-service.md} | 41 +- docs/docusaurus.config.js | 148 + docs/package.json | 44 + docs/sidebars.js | 33 + docs/src/components/HomepageFeatures/index.js | 46 + .../HomepageFeatures/styles.module.css | 11 + docs/src/css/custom.css | 30 + docs/src/pages/index.js | 46 + docs/src/pages/index.module.css | 23 + docs/src/pages/markdown-page.md | 7 + docs/static/.nojekyll | 0 docs/static/img/LMC-logo.png | Bin 0 -> 3694 bytes docs/static/img/LMC-social-card.jpg | Bin 0 -> 25971 bytes docs/static/img/docusaurus.png | Bin 0 -> 5142 bytes docs/static/img/favicon.ico | Bin 0 -> 5430 bytes docs/yarn.lock | 8363 +++++++++++++++++ 33 files changed, 8958 insertions(+), 153 deletions(-) create mode 100644 docs/.gitignore create mode 100644 docs/babel.config.js create mode 100644 docs/blog/2022-08-02-welcome.md create mode 100644 docs/blog/2024-02-22-New-documentation.md create mode 100644 docs/blog/authors.yml rename docs/{07. Cookbook.md => docs/cookbook.md} (94%) rename docs/{04. Guards.md => docs/guards.md} (96%) rename docs/{ => docs}/images/workflow-with-guards.png (100%) rename docs/{ => docs}/images/workflow-without-guards.png (100%) create mode 100644 docs/docs/installation.md rename docs/{01. Introduction.md => docs/intro.md} (61%) rename docs/{02. Quick Start.md => docs/quick-start.md} (84%) rename docs/{03. Role providers.md => docs/role-providers.md} (97%) rename docs/{05. Strategies.md => docs/strategies.md} (96%) create mode 100644 docs/docs/support.md rename docs/{06. Using the Authorization Service.md => docs/using-the-authorization-service.md} (86%) create mode 100644 docs/docusaurus.config.js create mode 100644 docs/package.json create mode 100644 docs/sidebars.js create mode 100644 docs/src/components/HomepageFeatures/index.js create mode 100644 docs/src/components/HomepageFeatures/styles.module.css create mode 100644 docs/src/css/custom.css create mode 100644 docs/src/pages/index.js create mode 100644 docs/src/pages/index.module.css create mode 100644 docs/src/pages/markdown-page.md create mode 100644 docs/static/.nojekyll create mode 100644 docs/static/img/LMC-logo.png create mode 100644 docs/static/img/LMC-social-card.jpg create mode 100644 docs/static/img/docusaurus.png create mode 100644 docs/static/img/favicon.ico create mode 100644 docs/yarn.lock diff --git a/README.md b/README.md index 8b8ab380..a66bc577 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ the `lmc_rbac.global.php.dist` file to your `config/autoload` folder. ## Documentation -The official documentation is available in the [/docs](/docs) folder. +The official documentation is available [here](https://lm-commons.github.io/lmc-rbac-mvc). You can also find some Doctrine entities in the [/data](/data) folder that will help you to more quickly take advantage of LmcRbac. diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000..50b2292e --- /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 index ccbb364d..0c6c2c27 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,48 +1,41 @@ -Welcome to the official LmcRbacMvc documentation. This documentation will help you quickly understand how to use -and extend LmcRbacMvc. - -If you are looking for some information that is not listed in the documentation, please open an issue! - -1. [Introduction](01.%20Introduction.md) - 1. [Why should I use an authorization module?](01.%20Introduction.md#why-should-i-use-an-authorization-module) - 2. [What is the Rbac model?](01.%20Introduction.md#what-is-the-rbac-model) - 3. [How can I integrate LmcRbacMvc into my application?](01.%20Introduction.md#how-can-i-integrate-lmcrbacmvc-into-my-application) - -2. [Quick Start](02.%20Quick%20Start.md) - 1. [Specifying an identity provider](02.%20Quick%20Start.md#specifying-an-identity-provider) - 2. [Adding a guard](02.%20Quick%20Start.md#adding-a-guard) - 3. [Adding a role provider](02.%20Quick%20Start.md#adding-a-role-provider) - 5. [Registering a strategy](02.%20Quick%20Start.md#registering-a-strategy) - 6. [Using the authorization service](02.%20Quick%20Start.md#using-the-authorization-service) - -3. [Role providers](03.%20Role%20providers.md) - 1. [What are role providers?](03.%20Role%20providers.md#what-are-role-providers) - 2. [Identity providers](03.%20Role%20providers.md#identity-providers) - 3. [Built-in role providers](03.%20Role%20providers.md#built-in-role-providers) - 4. [Creating custom role providers](03.%20Role%20providers.md#creating-custom-role-providers) - -4. [Guards](04.%20Guards.md) - 1. [What are guards and when to use them?](04.%20Guards.md#what-are-guards-and-when-should-you-use-them) - 2. [Built-in guards](04.%20Guards.md#built-in-guards) - 3. [Creating custom guards](04.%20Guards.md#creating-custom-guards) - -5. [Strategies](05.%20Strategies.md) - 1. [What are strategies?](05.%20Strategies.md#what-are-strategies) - 2. [Built-in strategies](05.%20Strategies.md#built-in-strategies) - 3. [Creating custom strategies](05.%20Strategies.md#creating-custom-strategies) - -6. [Using the Authorization Service](06.%20Using%20the%20Authorization%20Service.md) - 1. [Injecting the AuthorizationService](06.%20Using%20the%20Authorization%20Service.md#injecting-the-authorization-service) - 2. [Checking permissions](06.%20Using%20the%20Authorization%20Service.md#checking-permissions-in-a-service) - 1. [In a service](06.%20Using%20the%20Authorization%20Service.md#checking-permissions-in-a-service) - 2. [In a controller's action using the isGranted controller plugin](06.%20Using%20the%20Authorization%20Service.md#in-a-controller-) - 3. [In a view using the isGranted view helper](06.%20Using%20the%20Authorization%20Service.md#in-a-view-) - 3. [Permissions and Assertions](06.%20Using%20the%20Authorization%20Service.md#permissions-and-assertions) - -7. [Cookbook](07.%20Cookbook.md) - 1. [A real world example](07.%20Cookbook.md#a-real-world-application) - 2. [Best practices](07.%20Cookbook.md#best-practices) - 3. [Using LmcRbacMvc with Doctrine ORM](07.%20Cookbook.md#using-lmcrbacmvc-with-doctrine-orm) - 4. [How to deal with roles with lot of permissions?](07.%20Cookbook.md#how-to-deal-with-roles-with-lot-of-permissions) - 5. [Using LmcRbacMvc and ZF2 Assetic](07.%20Cookbook.md#using-lmcrbacmvc-and-zf2-assetic) - 6. [Using LmcRbacMvc and LmcUser](07.%20Cookbook.md#using-lmcrbacmvc-and-lmcuser) +# 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 00000000..e00595da --- /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/blog/2022-08-02-welcome.md b/docs/blog/2022-08-02-welcome.md new file mode 100644 index 00000000..37be8b00 --- /dev/null +++ b/docs/blog/2022-08-02-welcome.md @@ -0,0 +1,10 @@ +--- +slug: welcome +title: Welcome +authors: [ericr] +tags: [laminas, PHP] +--- +Welcome to the new documentation website for the LM-Commons organization. + +This site is work in progress and the intent is obviously to keep it current with updates to the LM-Commons packages. + diff --git a/docs/blog/2024-02-22-New-documentation.md b/docs/blog/2024-02-22-New-documentation.md new file mode 100644 index 00000000..36ffd037 --- /dev/null +++ b/docs/blog/2024-02-22-New-documentation.md @@ -0,0 +1,9 @@ +--- +slug: new-documentation +title: New documentation +authors: [ericr] +tags: [laminas, PHP, lmcrbacmvc] +--- +This the new documentation site dedicated to the LmcRbacMvc module. + +There are no changes to the code, just improvements in the documentation. diff --git a/docs/blog/authors.yml b/docs/blog/authors.yml new file mode 100644 index 00000000..d1bca13e --- /dev/null +++ b/docs/blog/authors.yml @@ -0,0 +1,5 @@ +ericr: + name: Eric Richer + title: LM-Commons Administrator + url: https://github.com/visto9259 + image_url: https://github.com/visto9259.png diff --git a/docs/07. Cookbook.md b/docs/docs/cookbook.md similarity index 94% rename from docs/07. Cookbook.md rename to docs/docs/cookbook.md index 1e1e02e2..4b2551c3 100644 --- a/docs/07. Cookbook.md +++ b/docs/docs/cookbook.md @@ -1,18 +1,11 @@ +--- +sidebar_position: 8 +--- # Cookbook This section will help you further understand how LmcRbacMvc works by providing more concrete examples. If you have any other recipe you'd like to add, please open an issue! -- [A Real World Application](07.%20Cookbook.md#a-real-world-application) - - [When to use Guards](07.%20Cookbook.md#when-using-guards-then) -- [A Real World Application Part 2 - Only delete your own Posts](07.%20Cookbook.md#a-real-world-application-part-2---only-delete-your-own-posts) -- [A Real World Application Part 3 - But Admins can delete everything](07.%20Cookbook.md#a-real-world-application-part-3---admins-can-delete-everything) -- [A Real World Application Part 4 - Only admins have the menu item for managing the posts](07.%20Cookbook.md#user-content-a-real-world-application-part-4---checking-permissions-in-the-view) -- [Using LmcRbacMvc with Doctrine ORM](07.%20Cookbook.md#using-lmcrbac-with-doctrine-orm) - - [How to deal with roles with lot of permissions?](07.%20Cookbook.md#how-to-deal-with-roles-with-lot-of-permissions) -- [Using LmcRbacMvc and ZF2 Assetic](07.%20Cookbook.md#using-lmcrbacmvc-and-zf2-assetic) -- [Using LmcRbacMvc and LmcUser](07.%20Cookbook.md#using-lmcrbacmvc-and-lmcuser) - ## A Real World Application In this example we are going to create a very little real world application. We will create a controller @@ -326,7 +319,7 @@ As we can see, we check within our Service if the User of our Application is all against the `deletePost` permission. Now how can we achieve that only a user who is the owner of the Post to be able to delete his own post, but other users can't? We do not want to change our Service with more complex logic because this is not the task of such service. The Permission-System should handle this. And we can, for this we have the - [`AssertionPluginManager`](/LmcRbacMvc/Assertion/AssertionPluginManager.php) and here is how to do it: + `AssertionPluginManager` and here is how to do it: First of all we need to write an Assertion. The Assertion will return a boolean statement about the current identity being the owner of the post. @@ -661,7 +654,7 @@ class HierarchicalRole implements HierarchicalRoleInterface And the last step is to create a Permission entity class which is a very simple entity class. You don't have to do specific things! -You can find all entity examples in this folder : [Example](/data) +You can find all entity examples in this folder : [Example](https://github.com/LM-Commons/LmcRbacMvc/tree/master/data) You need one more configuration step. Indeed, how can the RoleProvider retrieve your role and permissions? For this you need to configure `LmcRbacMvc\Role\ObjectRepositoryRoleProvider` in your `lmc_rbac.global.php` file : ```php @@ -772,8 +765,3 @@ return [ ] ]; ``` - -### Navigation - -* Back to [the Using the Authorization Service](06.%20Using%20the%20Authorization%20Service.md) -* Back to [the Index](README.md) diff --git a/docs/04. Guards.md b/docs/docs/guards.md similarity index 96% rename from docs/04. Guards.md rename to docs/docs/guards.md index 0d3f7a71..04a6048b 100644 --- a/docs/04. Guards.md +++ b/docs/docs/guards.md @@ -1,3 +1,6 @@ +--- +sidebar_position: 5 +--- # Guards In this section, you will learn: @@ -13,11 +16,11 @@ the MVC workflow. They allow your application to quickly mark a request as unaut Here is a simple workflow without guards: -![Zend Framework workflow without guards](images/workflow-without-guards.png?raw=true) +![Laminas Framework workflow without guards](images/workflow-without-guards.png?raw=true) And here is a simple workflow with a route guard: -![Zend Framework workflow with guards](images/workflow-with-guards.png?raw=true) +![Laminas Framework workflow with guards](images/workflow-with-guards.png?raw=true) RouteGuard and ControllerGuard are not aware of permissions but rather only think about "roles". For instance, you may want to refuse access to each routes that begin by "admin/*" to all users that do not have the @@ -38,7 +41,7 @@ that is not specified in the rules will be "granted" by default. Therefore, the mechanism. However, you may want a more restrictive approach (also called "whitelist"). In this mode, once a guard is added, -anything that is not explicitely added will be refused by default. +anything that is not explicitly added will be refused by default. For instance, let's say you have two routes: "index" and "login". If you specify a route guard rule to allow "index" route to "member" role, your "login" route will become defacto unauthorized to anyone, unless you add a new rule for @@ -80,7 +83,7 @@ return [ ]; ``` -Because of the way Zend Framework 2 handles config, you can without problem define some rules in one module, and +Because of the way Laminas Framework handles config, you can without problem define some rules in one module, and more rules in another module. All the rules will be automatically merged. > For your mental health, I recommend you to use either the route guard OR the controller guard, but not both. If @@ -473,9 +476,3 @@ return [ ]; ``` The array of IP addresses will be passed to `IpGuardFactory::__invoke` in the `$options` parameter. - -### Navigation - -* Continue to [the **Strategies**](05.%20Strategies.md) -* Back to [the Role providers](03.%20Role%20providers.md) -* Back to [the Index](README.md) diff --git a/docs/images/workflow-with-guards.png b/docs/docs/images/workflow-with-guards.png similarity index 100% rename from docs/images/workflow-with-guards.png rename to docs/docs/images/workflow-with-guards.png diff --git a/docs/images/workflow-without-guards.png b/docs/docs/images/workflow-without-guards.png similarity index 100% rename from docs/images/workflow-without-guards.png rename to docs/docs/images/workflow-without-guards.png diff --git a/docs/docs/installation.md b/docs/docs/installation.md new file mode 100644 index 00000000..25997811 --- /dev/null +++ b/docs/docs/installation.md @@ -0,0 +1,42 @@ +--- +sidebar_position: 2 +sidebar_label: Requirements and Installation +--- +# Requirements and Installation +## Requirements + +- PHP 7.4 or higher +- [Zf-fr/Rbac component v1](https://github.com/zf-fr/rbac): this is actually a prototype for the ZF3 Rbac component. +- [Laminas Components 2.x | 3.x or higher](http://www.github.com/laminas) + + +## Optional + +- [DoctrineModule](https://github.com/doctrine/DoctrineModule): if you want to use some built-in role and permission providers. +- [Laminas\DeveloperTools](https://github.com/laminas/Laminas\DeveloperTools): if you want to have useful stats added to + the Laminas Developer toolbar. + + +## Installation + +LmcRbacMvc only officially supports installation through Composer. For Composer documentation, please refer to +[getcomposer.org](http://getcomposer.org/). + +Install the module: + +```sh +$ composer require lm-commons/lmc-rbac-mvc:^3.0 +``` + +Enable the module by adding `LmcRbacMvc` key to your `application.config.php` or `modules.config.php` file. Customize the module by copy-pasting +the `lmc_rbac.global.php.dist` file to your `config/autoload` folder. + +## Upgrade + +LmcRbacMvc introduces breaking changes from zfcrbac v2: +- [BC] The namespace has been changed from `ZfcRbac` to `LmcRbacMvc`. +- [BC] The key `zfc_rbac` in autoload and module config files has been replaced + by the `lmc_rbac` key. +- Requires PHP 7.4 or later +- Requires Laminas MVC components 3.x or later +- Uses PSR-4 autoload diff --git a/docs/01. Introduction.md b/docs/docs/intro.md similarity index 61% rename from docs/01. Introduction.md rename to docs/docs/intro.md index f6449830..1cfa6309 100644 --- a/docs/01. Introduction.md +++ b/docs/docs/intro.md @@ -1,17 +1,27 @@ +--- +sidebar_position: 1 +--- + # Introduction -Welcome to the official documentation of LmcRbacMvc! +LmcRbacMvc is a role-based access control Laminas MVC module to provide additional features on top of Laminas\Permissions\Rbac + +LmcRbacMvc is part of the [LM-Commons](https://lm-commons.github.io) series of community developed packages for Laminas. + +LM-Commons is a GitHub organization dedicated to the collaborative +and community-driven long-term maintenance of packages & libraries based on the Laminas MVC and Components. -In this part, the following questions will be answered: -* Why should I use an authorization module? -* What is the Rbac model? -* How can I integrate LmcRbacMvc into my application? +:::tip +**Important Note:** + +If you are migrating from ZfcRbac v2, there are breaking changes to take into account. See the [Upgrade](installation.md#upgrade) section for details. +::: ## Why should I use an authorization module? -The authorization part of an application is an essential aspect of securing your application. While the authentication -part tells you who is using your website, the authorization answers if the given identity has the permission to +The authorization part of an application is an essential aspect of securing your application. +While the *authentication* part tells you who is using your website, the *authorization* answers if the given identity has the permission to perform specific actions. ## What is the Rbac model? @@ -29,9 +39,9 @@ The basic idea of Rbac is to use roles and permissions: By default, LmcRbacMvc can be used for two kinds of Rbac model: * Flat RBAC model: in this model, roles cannot have children. This is ideal for smaller applications, as it is easier -to understand, and the database design is simpler (no need for a join table). + to understand, and the database design is simpler (no need for a join table). * Hierarchical RBAC model: in this model, roles can have child roles. When evaluating if a given role has a -permission, this model also checks recursively if any of its child roles also have the permission. + permission, this model also checks recursively if any of its child roles also have the permission. ## How can I integrate LmcRbacMvc into my application? @@ -49,9 +59,4 @@ can choose either of them independently. To find out about how you can easily make your existing application more secure, please refer to the following section: -* [Cookbook: A real world example](07.%20Cookbook.md#a-real-world-application) - -### Navigation - -* Continue to [the **Quick Start**](02.%20Quick%20Start.md) -* Back to [the Index](README.md) +* [Cookbook: A real world example](07-cookbook.md#a-real-world-application) diff --git a/docs/02. Quick Start.md b/docs/docs/quick-start.md similarity index 84% rename from docs/02. Quick Start.md rename to docs/docs/quick-start.md index 77a555b2..f3f9c1e1 100644 --- a/docs/02. Quick Start.md +++ b/docs/docs/quick-start.md @@ -1,3 +1,7 @@ +--- +sidebar_position: 3 +--- + # Quick Start In this section, you will learn: @@ -25,10 +29,17 @@ return [ ] ]; ``` -The identity given by `Laminas\Authentication\AuthenticationService` must implement `LmcRbacMvc\Identity\IdentityInterface`. Note that the default identity provided with Laminas does not implement this interface, neither does the LmcUser suite. +:::tip +If you are also using the [LmcUser](https://github.com/lm-commons/lmcuser) package, then the `Laminas\Authentication\AuthenticationService` will be provided for you and there is no need to implement your own. +::: + +The identity given by `Laminas\Authentication\AuthenticationService` must implement `LmcRbacMvc\Identity\IdentityInterface`. +:::warning +Note that the default identity provided with Laminas does not implement this interface, neither does the LmcUser suite. +::: LmcRbacMvc is flexible enough to use something other than the built-in `AuthenticationService`, by specifying custom -identity providers. For more information, refer [to this section](03.%20Role%20providers.md#identity-providers). +identity providers. For more information, refer [to this section](role-providers.md#identity-providers). ## Adding a guard @@ -48,7 +59,7 @@ return [ ``` LmcRbacMvc has several built-in guards, and you can also register your own guards. For more information, refer -[to this section](04.%20Guards.md#built-in-guards). +[to this section](guards.md#built-in-guards). ## Adding a role provider @@ -80,7 +91,7 @@ In this example, the *admin* role has two permissions: `delete` and `edit` (beca its child), while the *member* role only has the `edit` permission. LmcRbacMvc has several built-in role providers, and you can also register your own role providers. For more information, -refer [to this section](03.%20Role%20providers.md#built-in-role-providers). +refer [to this section](role-providers.md#built-in-role-providers). ## Registering a strategy @@ -102,12 +113,13 @@ public function onBootstrap(MvcEvent $e) } ``` -By default, `RedirectStrategy` redirects all unauthorized requests to a route named "login" when the user is not connected +By default, `RedirectStrategy` redirects all unauthorized requests to a route named "login" when the user is not connected and to a route named "home" when the user is connected. This is, of course, entirely configurable. > For flexibility purposes, LmcRbacMvc **does not** register any strategy for you by default! -For more information about built-in strategies, refer [to this section](05.%20Strategies.md#built-in-strategies). +For more information about built-in strategies, refer [to this section](strategies.md#built-in-strategies). +[to this section](strategies.md) ## Using the authorization service @@ -115,7 +127,7 @@ Now that LmcRbacMvc is properly configured, you can inject the authorization ser if the current identity is granted to do something. The authorization service is registered inside the service manager using the following key: `LmcRbacMvc\Service\AuthorizationService`. -Once injected, you can use it as follow: +Once injected, you can use it as follows: ```php use LmcRbacMvc\Exception\UnauthorizedException; @@ -131,9 +143,3 @@ public function delete() } } ``` - -### Navigation - -* Continue to [the **Role providers**](03.%20Role%20providers.md) -* Back to [the Introduction](01.%20Introduction.md) -* Back to [the Index](README.md) diff --git a/docs/03. Role providers.md b/docs/docs/role-providers.md similarity index 97% rename from docs/03. Role providers.md rename to docs/docs/role-providers.md index f3adf3de..c98e447d 100644 --- a/docs/03. Role providers.md +++ b/docs/docs/role-providers.md @@ -1,3 +1,6 @@ +--- +sidebar_position: 4 +--- # Role providers In this section, you will learn: @@ -193,8 +196,3 @@ return [ ]; ``` -### Navigation - -* Continue to [the **Guards**](04.%20Guards.md) -* Back to [the Quick Start](02.%20Quick%20Start.md) -* Back to [the Index](README.md) diff --git a/docs/05. Strategies.md b/docs/docs/strategies.md similarity index 96% rename from docs/05. Strategies.md rename to docs/docs/strategies.md index fa6bdf26..950a9419 100644 --- a/docs/05. Strategies.md +++ b/docs/docs/strategies.md @@ -1,3 +1,6 @@ +--- +sidebar_position: 6 +--- # Strategies In this section, you will learn: @@ -147,9 +150,3 @@ public function onBootstrap(EventInterface $e) ->attach(new ApiProblemStrategy()); } ``` - -### Navigation - -* Continue to [the **Authorization Service**](06.%20Using%20the%20Authorization%20Service.md) -* Back to [the Guards](04.%20Guards.md) -* Back to [the Index](README.md) diff --git a/docs/docs/support.md b/docs/docs/support.md new file mode 100644 index 00000000..0f6119e2 --- /dev/null +++ b/docs/docs/support.md @@ -0,0 +1,16 @@ +--- +sidebar_position: 20 +title: Support +--- + +- File issues at https://github.com/LM-Commons/LmcRbacMvc/issues. +- Ask questions in the [LM-Commons Gitter](https://gitter.im/LM-Commons/community) chat. + + +##### Notices and Disclaimers +This is not an official Laminas Project organization. + +Issues and questions related to the Laminas MVC and components +should be addressed to the Laminas Project organisation. + +Laminas is a trademark of the Laminas Project, a Series of LF Projects, LLC. diff --git a/docs/06. Using the Authorization Service.md b/docs/docs/using-the-authorization-service.md similarity index 86% rename from docs/06. Using the Authorization Service.md rename to docs/docs/using-the-authorization-service.md index 7c8a6b2c..79434000 100644 --- a/docs/06. Using the Authorization Service.md +++ b/docs/docs/using-the-authorization-service.md @@ -1,3 +1,6 @@ +--- +sidebar_position: 7 +--- # Using the Authorization Service This section will teach you how to use the AuthorizationService to its full extent. @@ -110,38 +113,6 @@ class Module } ``` -### Using Laminas\DI - -DI is a great way for prototyping, getting results *fast* and maintaining a flexible structure. However it adds overhead and can get very slow. Unless you are using a compiler it is **not** recommended for production. -Here's how you enable Laminas\DI to inject the AuthorizationService in MyClass: - -*YourModule/Module.php* - -```php -namespace YourModule; - -class Module -{ - // getAutoloaderConfig(), etc... - - public function getConfig() - { - return [ - 'di' => [ - 'definition' => [ - 'class' => [ - __NAMESPACE__ . '\MyClass' => [ - 'setAuthorizationService' => [ - 'required' => true - ] - ] - ] - ] - ] - ]; - } -} -``` ## Permissions and Assertions @@ -267,9 +238,3 @@ $authorizationService->isGranted('myPermission', $context); ``` *Please note: The context parameter is optional!* - -### Navigation - -* Continue to [the **Cookbook**](07.%20Cookbook.md) -* Back to [the Strategies](05.%20Strategies.md) -* Back to [the Index](README.md) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js new file mode 100644 index 00000000..619d7ef8 --- /dev/null +++ b/docs/docusaurus.config.js @@ -0,0 +1,148 @@ +// @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: 'LmcRbacMvc', + tagline: 'Role-based access control for Laminas MVC application', + favicon: 'img/favicon.ico', + + // Set the production url of your site here + url: 'https://lm-commons.github.io', + // Set the // pathname under which your site is served + // For GitHub pages deployment, it is often '//' + baseUrl: '/lmc-rbac-mvc', + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: 'LM Commons', // Usually your GitHub org/user name. + projectName: 'lmcrbacmvc', // Usually your repo name. + + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + + // Even if you don't use internationalization, you can use this field to set + // useful metadata like html lang. For example, if your site is Chinese, you + // may want to replace "en" with "zh-Hans". + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: './sidebars.js', + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: 'https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/', + }, + blog: { + showReadingTime: true, + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: 'https://github.com/lm-commons/lmcrbacmvc/tree/master/docs/', + }, + theme: { + customCss: './src/css/custom.css', + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + // Replace with your project's social card + image: 'img/LMC-social-card.png', + navbar: { + title: 'LM-Commons Rbac Mvc', + logo: { + alt: 'LM-Commons Logo', + src: 'img/LMC-logo.png', + }, + items: [ + { + type: 'docSidebar', + sidebarId: 'tutorialSidebar', + position: 'left', + label: 'Documentation', + }, + {to: '/blog', label: 'Blog', position: 'left'}, + { + href: 'https://lm-commons.github.io', + label: 'LM-Commons', + position: 'right', + }, + { + href: 'https://github.com/lm-commons/lmcrbacmvc', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Docs', + items: [ + { + label: 'Documentation', + to: '/docs/intro', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'Gitter', + href: 'https://gitter.im/LM-Commons/community', + }, + + /* + { + label: 'Discord', + href: 'https://discordapp.com/invite/docusaurus', + }, + { + label: 'Twitter', + href: 'https://twitter.com/docusaurus', + }, + + */ + ], + }, + { + title: 'More', + items: [ + { + label: 'Blog', + to: '/blog', + }, + { + label: 'GitHub', + href: 'https://github.com/lm-commons/lmcrbacmvc', + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} LM Commons Organization. Built with Docusaurus.`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + }, + }), +}; + +export default config; diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 00000000..15463056 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,44 @@ +{ + "name": "docs", + "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.1" + }, + "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 00000000..33275803 --- /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 + tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], + + // But you can create a sidebar manually + /* + tutorialSidebar: [ + '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 00000000..60484a8b --- /dev/null +++ b/docs/src/components/HomepageFeatures/index.js @@ -0,0 +1,46 @@ +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. + + ), + }, +]; + +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 00000000..b248eb2e --- /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 00000000..2bc6a4cf --- /dev/null +++ b/docs/src/css/custom.css @@ -0,0 +1,30 @@ +/** + * 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: #2e8555; + --ifm-color-primary-dark: #29784c; + --ifm-color-primary-darker: #277148; + --ifm-color-primary-darkest: #205d3b; + --ifm-color-primary-light: #33925d; + --ifm-color-primary-lighter: #359962; + --ifm-color-primary-lightest: #3cad6e; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #25c2a0; + --ifm-color-primary-dark: #21af90; + --ifm-color-primary-darker: #1fa588; + --ifm-color-primary-darkest: #1a8870; + --ifm-color-primary-light: #29d5b0; + --ifm-color-primary-lighter: #32d8b4; + --ifm-color-primary-lightest: #4fddbf; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); +} diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js new file mode 100644 index 00000000..ec590b78 --- /dev/null +++ b/docs/src/pages/index.js @@ -0,0 +1,46 @@ +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}

+

Part of the LM-Commons series of community developed packages for Laminas

+ {/*} +
+ + Docusaurus Tutorial - 5min ⏱️ + +
+ {*/} +
+
+ ); +} + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + + +
+ +
+
+ ); +} diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css new file mode 100644 index 00000000..9f71a5da --- /dev/null +++ b/docs/src/pages/index.module.css @@ -0,0 +1,23 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 996px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} diff --git a/docs/src/pages/markdown-page.md b/docs/src/pages/markdown-page.md new file mode 100644 index 00000000..9756c5b6 --- /dev/null +++ b/docs/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. diff --git a/docs/static/.nojekyll b/docs/static/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/docs/static/img/LMC-logo.png b/docs/static/img/LMC-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..df20b7d294f9d273633a928719e1c7df74dfe287 GIT binary patch literal 3694 zcmb_fg?0k4NYwt>$&SCUO$9FgL!+fsk^Y=4}#a(q^u&-hqpd=T|-9hazAP^3}y)2e_lyrNvpW9!C7Ce(I zP0;2wAy5(4I%G$Se@(B!cW{9(>B_)5DDMZlop4>qx!U%WTE1ZGQAkLndvu}pK;%O1 zt(J|b&?v?F`g$jM$7bQ{eOURDXr8|N)0pQH|4TE`f*$ORXj>r_0>6JEReeapJu=Hz zyKP~iTdeHr>RMuuBI^1?GvY8$^uQ?!lBi zKi7Z=!p+SMfk0p|>ou<3cs%}hlm9|{Tlhh7bqYNxCl2Z3@vSdqzxRUno!J>B0f)mW zdJdztj=J9Ur3#>C{Ni^?_Ky~#ZEbD2xw%Jj6g@|abQ^fIvz5Fp{rvpw?7n`^kgWW- zd2F2C~l;2K-+xqn5p<%D|`F!y`ftfV7kO>Ls^-eHv<+s+ait*H@=QZ&XrVF zN=rywn%On>IXd3?#$2fddd@E~u2YftbENR%vt;3@;ZRX{a%yVd!cuo)N#Dn4n7llD zp%{93ySn4=>6CLc@ixbqOm&#WUttu`3e)_Ar9FiN`*7ux8G2(DzyZwwEOE)l=@aB!o_!AE8 z^MJ_6^B-BxX4;uWxVShv$3nsc&)r&T%XYhiwKW31+rw#&wz(B{@*~ST0**^eED;Lt z7YKcksj7|qHC26d+ge7<;JFSMag?EOLQAK4$fj}*jW_jiQpNh9Kfl~v^IVmoqxY3GAH2u@A^TtF<7;v4W;~_xRP6dU zFEPs4#`zM*kj_j`nlQ@2m3}RoDiAooW_UwG0|DoaRv3^J=>gV2NpmVGDYfqO@iF_B z{+N3gw)b-`a8Rx^KQ{UMOWV7;Ii>fnJ2iNvXCw^;={0j`?t{z3w|dcy?s@e)-}*Cd zb`89govLy|!SU(oQ0!?iTwVFCpS zhZnm;;6 z!3^Gqp5T0~!)lUJ;C0_>fI&h+V&&eQUI<&s7dQD$F%+^uerXBamMo0K<1Emo9-f}SgHm>Ma+<5X*Kfr1l$)&L zH>;W_2!X$K?)dvDT}<2r?dAyqM`zTjSO&cZLI}gexQ+sg@v!L9B7Qf+49D;Ifh>9 z2c5LEbiKz=_`!rNx4h$V7n9I`c`#1Hw02hT4SO~(=su~sy_f*f`m=9^{Cr*M{=ikp zKciJiTG-PH&O5Whw{CG`XTE=T|I)Q=K`JXRKiZth!uj-G{5{(i&x;Klr+fnr#V)9k zjk^b6>%q4)ZTt(9?3=oLpV;g)FpZx+89f@Gcey-4m-ltm?)L2`2{4ecfdOL~Trka^ zP2+U6gn-XZB4S`mOG_Rlo-<5A4c-F8=b_|~Zz;Ffg|zZ;t!cr>zg;0+agcF!C+0B< zg(7ZJgFOpD8h?27OC@*}4G~ETC3A6cy`KLJ!=5(mT~C6b*+H;_EX#!HCV!zaaVQkJ z?mGbPZ?U1z$;lz$|8@G%P+9p5fv%t^ii*MoETQm0MHa2g^BZ+B<>X8}9>T|mf*d=K8l2trsJAdbu(C!H?W03}*~k z;5_CIY{Cg4+w=K2uyfQ&+2Qk7g^RYwa-cA)h4JxPuDF@n(XL-MC^Iub&2S}<$UEPe zNeWUZKi;{rUQR(l;dFmZ?<08F^XQ`E@f=1oeE-wHfT##aJ^|CgvL%flrZD>7fVKK5 zFKQ%UD2h;M?IwNaWe3xq{(jQEE%lI%>Ba}#pbMR-^CTR26;qKxFma8ZCd{|rGoJs;7&$g_lZ zx_cD97(;LS#>6vmSgu>fkPS@oR4r17UQs7|t&F=BY>mK8PZu-92gJH|Cs-ieFlyxj z(-?%cHR04cz|=HF8+tYDMFtK`1?N8;w=;JEpm&{I15P9#3Q?ciDJz8FxHRVqI7xB~ zv*Y8ztD_1ijZ+5x@Ijs%q0~CwqMz^Qe~N*o5ToxLnn;RZJ+YsxpfJr9MQW zP!BCGh1XZf`83)9v_oPgJ_-~~PD(P9+TN`NYhv9!JPubW@i_Odb@vH@i2$Fs9!xsi zX#EX0GaFu?AjJ#1x{}tsj`Y;k(lI^)3hqy5(z2UkkhTu1`!oI>la?MR5Lp5%+I5Qe(VIW=rszB~rP>U?e*`n?Sezo#(!G#*kCs>fOMQVQ1A)~G##4~lwUlTr3|b~zatCFG=Q z{8HcZL+353rFw<{hFTI87f=O!c%W`Q%@4mBFE*##`OZSH$|s>4prR=?J- zD2`~9$cwP4_)_=J_eRtsiC3ah;SEqgKCWO;H})}Q*W|# zvTx6|WGTQpdz<(>PJZUHlV($Yd-9VS4jfWlmH7=JQHs9QhRi9~qxA{d8#g$HN;36D z_V)IKqR$^XQ=?y-0epMf|GECI5)~9OHJ4#MDg$nTQ9?b@s2L=Wj#$Ro0 zY@BKGH)N${ix*H2IX_t`+<(Flk!+B=_aq=T*(UkfGs@Ov&c{NB4uiKgXmrslX?gjo zA7#m2GE3u(&`<8O7#cr4|0@@Uk3@8ZZt_#})6>&e8{95Luo>$iTeHtPj<<{0?46y{ zR4P0aVt&#_hHN%Y;X|Ijo%v5k;sb|owN)MyI!3m=L_Y<)oz6yAPup+_@kP$zoyMR2 zF@enhKs~rN$I>&2j?UjSNg?j=`rfIc8N)zriC6U44a7-foCVraVpi z@AOh@(0OZ3O-;sB8xzx!&W$(~yD$AQwDb)Y31C|6m$z@t8$0eWo4EA z-O9bdKj00ClqRTYfA?;C#L*T#6T5Jm=ZN5emh^v0UZX{S|D2T^B)mv!_Y4kJvM-d^ tRPgLO literal 0 HcmV?d00001 diff --git a/docs/static/img/LMC-social-card.jpg b/docs/static/img/LMC-social-card.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b1572cbe80cd3188129d1ba86e45954ee439dca GIT binary patch literal 25971 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 V{O|LBE?@rNnEii`*|Fb*{{qY%$07g# literal 0 HcmV?d00001 diff --git a/docs/static/img/docusaurus.png b/docs/static/img/docusaurus.png new file mode 100644 index 0000000000000000000000000000000000000000..f458149e3c8f53335f28fbc162ae67f55575c881 GIT binary patch literal 5142 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 F{0H{b<4^zq literal 0 HcmV?d00001 diff --git a/docs/static/img/favicon.ico b/docs/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1545f3896178afcc46859ccad051d752e5d626d5 GIT binary patch literal 5430 zcmeHLStxH^6hGhXKJcRZ;8iKPM9T0eLnLG`ub>dbCaH)o@i!fhAuBJ zX=P=FUS3}4`T3cOi;JnEqC)r9=jZ2CQc^+7_;yGy;jy#${H1qC!eKTjuZiRf*A2pj`xVmZv`=Id3l+07~^-q7DfQ3)77U+|kj|WMgB)B{MTq*Zzw7?-x1N+uNJEy1H~_Z*Pw~#l^+Z z#l;2d$YIXT&YZ)92R}bQoqyyNFE1}1Bl5MAlM_u$Oo;A=C-|eHq6~Inkol4OkiT+r zazr!9{K#XjuC6@yqQlV85XHpAh^paf4L^91t0E&KH9s;x*4*FUU$jSbW8aU4-Y9eHkPqvWo0xuImx=rk9FDF+S2*|S;bQR>FH_S zd+;|lHbxi&MCSMP^(Bnc8nKkWyu6(H`}^57Vn$k88tXDY&hhE#sWtQ#uRqp&XJ?0f zBc_Ffgc$gJe0)BPALmLwLx_7gTk`vV)coV@1O^7`<~2JzoA;W`k2v-b`wuZEH8oYo zk9#k^uVntLtSr;>hwqp7#FG8j+S*E`rKLI-3kwT;9%TNSni?uBEY$TwB{(>kkVnnL z68_xWTpAxA*TGLtPAD-kQTP69Yiox1i`?$!=BC9X0494_u3H; g%= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + 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" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" + 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" + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +consola@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-text-to-clipboard@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz#0202b2d9bdae30a49a53f898626dcc3b49ad960b" + integrity sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q== + +copy-webpack-plugin@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" + 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" + +core-js-compat@^3.31.0, core-js-compat@^3.34.0: + version "3.36.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.0.tgz#087679119bc2fdbdefad0d45d8e5d307d45ba190" + integrity sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw== + dependencies: + browserslist "^4.22.3" + +core-js-pure@^3.30.2: + version "3.36.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.36.0.tgz#ffb34330b14e594d6a9835cf5843b4123f1d95db" + integrity sha512-cN28qmhRNgbMZZMc/RFu5w8pK9VJzpb2rJVR/lHuZJKwmXnoWOpXmMkxqBB514igkp1Hu8WGROsiOAzUcKdHOQ== + +core-js@^3.31.1: + version "3.36.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.36.0.tgz#e752fa0b0b462a0787d56e9d73f80b0f7c0dde68" + integrity sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + 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" + +cosmiconfig@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + 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" + +cosmiconfig@^8.3.5: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + 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" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" + +css-declaration-sorter@^6.3.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" + integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== + +css-loader@^6.8.1: + version "6.10.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.10.0.tgz#7c172b270ec7b833951b52c348861206b184a4b7" + integrity sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw== + 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" + +css-minimizer-webpack-plugin@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz#79f6199eb5adf1ff7ba57f105e3752d15211eb35" + 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" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + 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" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + 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" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^6.0.1, css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-advanced@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz#25558a1fbf3a871fb6429ce71e41be7f5aca6eef" + 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" + +cssnano-preset-default@^5.2.14: + version "5.2.14" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" + 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" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.1.15, cssnano@^5.1.8: + version "5.1.15" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" + integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== + dependencies: + cssnano-preset-default "^5.2.14" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + +debug@2.6.9, debug@^2.6.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-data-property@^1.0.1, define-data-property@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +del@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + 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" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detect-port@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + dependencies: + address "^1.0.1" + debug "4" + +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-packet@^5.2.2: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.668: + version "1.4.675" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.675.tgz#9e612a5339e3c9f884982478a8aaf2da3ab6ec7d" + integrity sha512-+1u3F/XPNIdUwv8i1lDxHAxCvNNU0QIqgb1Ycn+Jnng8ITzWSvUqixRSM7NOazJuwhf65IV17f/VbKj8DmL26A== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojilib@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.4.0.tgz#ac518a8bb0d5f76dda57289ccb2fdf9d39ae721e" + integrity sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +emoticon@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-4.0.1.tgz#2d2bbbf231ce3a5909e185bbb64a9da703a1e749" + integrity sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^1.2.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" + integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-goat@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" + integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-util-attach-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz#344bde6a64c8a31d15231e5ee9e297566a691c2d" + integrity sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-build-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz#b6d0bced1dcc4f06f25cf0ceda2b2dcaf98168f1" + 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" + +estree-util-is-identifier-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== + +estree-util-to-js@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz#10a6fb924814e6abb62becf0d2bc4dea51d04f17" + integrity sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + +estree-util-value-to-estree@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz#0b7b5d6b6a4aaad5c60999ffbc265a985df98ac5" + integrity sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA== + dependencies: + "@types/estree" "^1.0.0" + is-plain-obj "^4.0.0" + +estree-util-visit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz#13a9a9f40ff50ed0c022f831ddf4b58d05446feb" + integrity sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^3.0.0" + +estree-walker@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eta@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eta/-/eta-2.2.0.tgz#eb8b5f8c4e8b6306561a455e62cd7492fe3a9b8a" + integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eval@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" + integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== + dependencies: + "@types/node" "*" + require-like ">= 0.1.1" + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + 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" + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + 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" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + 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" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fault@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" + integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== + dependencies: + format "^0.2.0" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +feed@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" + integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== + dependencies: + xml-js "^1.6.11" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + 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" + +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== + dependencies: + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +follow-redirects@^1.0.0: + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + 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" + +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^11.1.1: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + 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" + +fs-monkey@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +github-slugger@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + 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" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + 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" + +globby@^13.1.1: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + 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" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +got@^12.1.0: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + 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" + +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + 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" + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-yarn@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" + integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== + +hasown@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa" + integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== + dependencies: + function-bind "^1.1.2" + +hast-util-from-parse5@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651" + 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" + +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-raw@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.0.2.tgz#39b4a4886bd9f0a5dd42e86d02c966c2c152884c" + 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" + +hast-util-to-estree@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz#f2afe5e869ddf0cf690c75f9fc699f3180b51b19" + 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" + +hast-util-to-jsx-runtime@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz#3ed27caf8dc175080117706bf7269404a0aa4f7c" + 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" + +hast-util-to-parse5@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed" + 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" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +hastscript@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-8.0.0.tgz#4ef795ec8dee867101b9f23cc830d4baf4fd781a" + 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" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + 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" + +hoist-non-react-statics@^3.1.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== + +html-escaper@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + 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" + +html-minifier-terser@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz#18752e23a2f0ed4b0f550f217bb41693e975b942" + 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" + +html-tags@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== + +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + +html-webpack-plugin@^5.5.3: + version "5.6.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" + 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" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +htmlparser2@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + +http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + 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" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + 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" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http2-wrapper@^2.1.10: + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +image-size@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.1.1.tgz#ddd67d4dc340e52ac29ce5f546a09f4e29e840ac" + integrity sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ== + dependencies: + queue "6.0.2" + +immer@^9.0.7: + version "9.0.21" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== + +import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infima@0.2.0-alpha.43: + version "0.2.0-alpha.43" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.43.tgz#f7aa1d7b30b6c08afef441c726bac6150228cbe0" + integrity sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +inline-style-parser@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.2.tgz#d498b4e6de0373458fc610ff793f6b14ebf45633" + integrity sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ== + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-npm@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" + integrity sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-reference@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.2.tgz#154747a01f45cd962404ee89d43837af2cba247c" + integrity sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg== + dependencies: + "@types/estree" "*" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.4.1.tgz#b312d902b313f81e4eaf98b6361ba2b45cd694bb" + integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + 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" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.1.2: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jiti@^1.20.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + +joi@^17.9.2: + version "17.12.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.12.1.tgz#3347ecf4cd3301962d42191c021b165eef1f395b" + integrity sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ== + dependencies: + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.1.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +latest-version@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" + integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== + dependencies: + package-json "^8.1.0" + +launch-editor@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.8.1" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lilconfig@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +markdown-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" + integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== + +markdown-table@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" + integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== + +mdast-util-directive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz#3fb1764e705bbdf0afb0d3f889e4404c3e82561f" + 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" + +mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz#a6fc7b62f0994e973490e45262e4bc07607b04e0" + 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" + +mdast-util-from-markdown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz#52f14815ec291ed061f2922fd14d6689c810cb88" + 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" + +mdast-util-frontmatter@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz#f5f929eb1eb36c8a7737475c7eb438261f964ee8" + 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" + +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz#5baf35407421310a08e68c15e5d8821e8898ba2a" + 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" + +mdast-util-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz#25a1753c7d16db8bfd53cd84fe50562bd1e6d6a9" + 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" + +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + 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" + +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + 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" + +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + 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" + +mdast-util-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" + 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" + +mdast-util-mdx-expression@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz#4968b73724d320a379110d853e943a501bfd9d87" + 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" + +mdast-util-mdx-jsx@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.0.tgz#5f7f204cf3f380cba1a8441142406eede1bc7660" + integrity sha512-A8AJHlR7/wPQ3+Jre1+1rq040fX9A4Q1jG8JxmSNp/PLPHg80A6475wxTp3KzHpApFH6yWxFotHrJQA3dXP6/w== + 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" + +mdast-util-mdx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz#792f9cf0361b46bee1fdf1ef36beac424a099c41" + 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" + +mdast-util-mdxjs-esm@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + 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" + +mdast-util-phrasing@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3" + integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@^13.0.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz#1ae54d903150a10fe04d59f03b2b95fd210b2124" + 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" + +mdast-util-to-markdown@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz#9813f1d6e0cdaac7c244ec8c6dabfdb2102ea2b4" + 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" + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.1.2, memfs@^3.4.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== + dependencies: + fs-monkey "^1.0.4" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromark-core-commonmark@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz#50740201f0ee78c12a675bf3e68ffebc0bf931a3" + integrity sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA== + 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" + +micromark-extension-directive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz#527869de497a6de9024138479091bc885dae076b" + 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" + +micromark-extension-frontmatter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz#651c52ffa5d7a8eeed687c513cd869885882d67a" + 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" + +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz#f1e50b42e67d441528f39a67133eddde2bbabfd9" + 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" + +micromark-extension-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz#91afad310065a94b636ab1e9dab2c60d1aab953c" + 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" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz#6917db8e320da70e39ffbf97abdbff83e6783e61" + 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" + +micromark-extension-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz#2cf3fe352d9e089b7ef5fff003bdfe0da29649b7" + 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" + +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz#ee8b208f1ced1eb9fb11c19a23666e59d86d4838" + 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" + +micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + 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" + +micromark-extension-mdx-expression@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz#1407b9ce69916cf5e03a196ad9586889df25302a" + integrity sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ== + 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" + +micromark-extension-mdx-jsx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz#4aba0797c25efb2366a3fd2d367c6b1c1159f4f5" + 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" + +micromark-extension-mdx-md@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz#1d252881ea35d74698423ab44917e1f5b197b92d" + integrity sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-mdxjs-esm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz#de21b2b045fd2059bd00d36746081de38390d54a" + 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" + +micromark-extension-mdxjs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz#b5a2e0ed449288f3f6f6c544358159557549de18" + 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" + +micromark-factory-destination@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" + integrity sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" + integrity sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-mdx-expression@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz#f2a9724ce174f1751173beb2c1f88062d3373b1b" + integrity sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg== + 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" + +micromark-factory-space@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz#5e7afd5929c23b96566d0e1ae018ae4fcf81d030" + integrity sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" + integrity sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A== + 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" + +micromark-factory-whitespace@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" + integrity sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA== + 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" + +micromark-util-character@^1.0.0, micromark-util-character@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-character@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.0.tgz#31320ace16b4644316f6bf057531689c71e2aee1" + integrity sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" + integrity sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" + integrity sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" + integrity sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" + integrity sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" + integrity sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA== + 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" + +micromark-util-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" + integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== + +micromark-util-events-to-acorn@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz#4275834f5453c088bd29cd72dfbf80e3327cec07" + integrity sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA== + 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" + +micromark-util-html-tag-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" + integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" + integrity sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" + integrity sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" + integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz#9f412442d77e0c5789ffdf42377fa8a2bcbdf581" + integrity sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^1.0.0, micromark-util-symbol@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== + +micromark-util-symbol@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" + integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== + +micromark-util-types@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== + +micromark-util-types@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" + integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== + +micromark@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" + integrity sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ== + 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" + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + +mini-css-extract-plugin@^2.7.6: + version "2.8.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.0.tgz#1aeae2a90a954b6426c9e8311eab36b450f553a0" + integrity sha512-CxmUYPFcTgET1zImteG/LZOy/4T5rTojesQXkSNBiquhydn78tfbCE9sjIjnJ/UcjNjOC1bphTCCW5rrS7cXAg== + dependencies: + schema-utils "^4.0.0" + tapable "^2.2.1" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mrmime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-emoji@^2.1.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.1.3.tgz#93cfabb5cc7c3653aa52f29d6ffb7927d8047c06" + 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" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +normalize-url@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" + integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + 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" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9, open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + 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" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" + 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" + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" + 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" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + 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" + +parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" + +parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +periscopic@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" + integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^3.0.0" + is-reference "^3.0.0" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" + 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" + +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-discard-unused@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz#8974e9b143d887677304e558c1166d3762501142" + integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-loader@^7.3.3: + version "7.3.4" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.4.tgz#aed9b79ce4ed7e9e89e56199d25ad1ec8f606209" + integrity sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A== + dependencies: + cosmiconfig "^8.3.5" + jiti "^1.20.0" + semver "^7.5.4" + +postcss-merge-idents@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz#7753817c2e0b75d0853b56f78a89771e15ca04a1" + integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.1" + +postcss-merge-rules@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" + 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" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== + dependencies: + browserslist "^4.21.4" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz#7cbed92abd312b94aaea85b68226d3dec39a14e6" + 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" + +postcss-modules-scope@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz#32cfab55e84887c079a19bbb215e721d683ef134" + integrity sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-reduce-idents@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz#c89c11336c432ac4b28792f24778859a67dfba95" + integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.15" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" + integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-sort-media-queries@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz#04a5a78db3921eb78f28a1a781a2e68e65258128" + integrity sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw== + dependencies: + sort-css-media-queries "2.1.0" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss-zindex@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff" + integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== + +postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.26, postcss@^8.4.33: + version "8.4.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" + integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prism-react-renderer@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz#e59e5450052ede17488f6bc85de1553f584ff8d5" + integrity sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw== + dependencies: + "@types/prismjs" "^1.26.0" + clsx "^2.0.0" + +prismjs@^1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.6.2, prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^6.0.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.1.tgz#de8b79a7415fd2107dfbe65758bb2cc9dfcf60ac" + integrity sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pupa@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.1.0.tgz#f15610274376bbcc70c9a3aa8b505ea23f41c579" + integrity sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug== + dependencies: + escape-goat "^4.0.0" + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +queue@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + 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" + +rc@1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + 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" + +react-dom@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + +react-fast-compare@^3.2.0, react-fast-compare@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== + +react-helmet-async@*: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-2.0.4.tgz#50a4377778f380ed1d0136303916b38eff1bf153" + integrity sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ== + dependencies: + invariant "^2.2.4" + react-fast-compare "^3.2.2" + shallowequal "^1.1.0" + +react-helmet-async@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" + 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" + +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-json-view-lite@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/react-json-view-lite/-/react-json-view-lite-1.2.1.tgz#c59a0bea4ede394db331d482ee02e293d38f8218" + integrity sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ== + +react-loadable-ssr-addon-v5-slorber@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" + integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== + dependencies: + "@babel/runtime" "^7.10.3" + +react-router-config@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" + integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== + dependencies: + "@babel/runtime" "^7.1.2" + +react-router-dom@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" + 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" + +react-router@5.3.4, react-router@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" + 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" + +react@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + 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" + +readable-stream@^3.0.6: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reading-time@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" + integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + 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" + +registry-auth-token@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== + dependencies: + "@pnpm/npm-conf" "^2.1.0" + +registry-url@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" + integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== + dependencies: + rc "1.2.8" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +rehype-raw@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" + integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== + dependencies: + "@types/hast" "^3.0.0" + hast-util-raw "^9.0.0" + vfile "^6.0.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +remark-directive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remark-directive/-/remark-directive-3.0.0.tgz#34452d951b37e6207d2e2a4f830dc33442923268" + 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" + +remark-emoji@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-4.0.1.tgz#671bfda668047689e26b2078c7356540da299f04" + 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" + +remark-frontmatter@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz#b68d61552a421ec412c76f4f66c344627dc187a2" + 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" + +remark-gfm@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" + 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" + +remark-mdx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.0.1.tgz#8f73dd635c1874e44426e243f72c0977cf60e212" + integrity sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA== + dependencies: + mdast-util-mdx "^3.0.0" + micromark-extension-mdxjs "^3.0.0" + +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + 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" + +remark-rehype@^11.0.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.0.tgz#d5f264f42bcbd4d300f030975609d01a1697ccdc" + 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" + +remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + 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" + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve@^1.1.6, resolve@^1.14.2: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rtl-detect@^1.0.4: + version "1.1.2" + resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.1.2.tgz#ca7f0330af5c6bb626c15675c642ba85ad6273c6" + integrity sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ== + +rtlcss@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-4.1.1.tgz#f20409fcc197e47d1925996372be196fee900c0c" + integrity sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + postcss "^8.4.21" + strip-json-comments "^3.1.1" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + 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" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== + dependencies: + "@types/node-forge" "^1.3.0" + node-forge "^1" + +semver-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" + integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== + dependencies: + semver "^7.3.5" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + 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" + +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +serve-handler@^6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" + 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" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + 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" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-function-length@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" + integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== + dependencies: + define-data-property "^1.1.2" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3, shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +side-channel@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.5.tgz#9a84546599b48909fb6af1211708d23b1946221b" + integrity sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sirv@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" + integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== + dependencies: + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + +skin-tone@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/skin-tone/-/skin-tone-2.0.0.tgz#4e3933ab45c0d4f4f781745d64b9f4c208e41237" + integrity sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA== + dependencies: + unicode-emoji-modifier-base "^1.0.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +sort-css-media-queries@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz#7c85e06f79826baabb232f5560e9745d7a78c4ce" + integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.0: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + 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" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + 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" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +srcset@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/srcset/-/srcset-4.0.0.tgz#336816b665b14cd013ba545b6fe62357f86e65f4" + integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +std-env@^3.0.1: + version "3.7.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + 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" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-entities@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" + integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +style-to-object@^0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== + dependencies: + inline-style-parser "0.1.1" + +style-to-object@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.5.tgz#5e918349bc3a39eee3a804497d97fcbbf2f0d7c0" + integrity sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ== + dependencies: + inline-style-parser "0.2.2" + +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^2.7.0, svgo@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + 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" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.9: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + 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" + +terser@^5.10.0, terser@^5.15.1, terser@^5.26.0: + version "5.27.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.27.2.tgz#577a362515ff5635f98ba149643793a3973ba77e" + integrity sha512-sHXmLSkImesJ4p5apTeT63DsV4Obe1s37qT8qvwHRmVxKTBH7Rv9Wr26VcAMmLbmk9UliiwK8z+657NyJHHy/w== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tiny-invariant@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + +tiny-warning@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trough@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== + +tslib@^2.0.3, tslib@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +type-fest@^2.13.0, type-fest@^2.5.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-emoji-modifier-base@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz#dbbd5b54ba30f287e2a8d5a249da6c0cef369459" + integrity sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unified@^11.0.0, unified@^11.0.3, unified@^11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.4.tgz#f4be0ac0fe4c88cb873687c07c64c49ed5969015" + 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" + +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== + dependencies: + crypto-random-string "^4.0.0" + +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz#d94da4df596529d1faa3de506202f0c9a23f2200" + integrity sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-remove-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz#fea68a25658409c9460408bc6b4991b965b52163" + integrity sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== + dependencies: + "@types/unist" "^3.0.0" + unist-util-visit "^5.0.0" + +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + 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" + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-6.0.2.tgz#a6990253dfe6d5a02bd04fbb6a61543f55026b60" + 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" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utility-types@^3.10.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.11.0.tgz#607c40edb4f258915e901ea7995607fdf319424c" + integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vfile-location@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.2.tgz#220d9ca1ab6f8b2504a4db398f7ebc149f9cb464" + integrity sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg== + dependencies: + "@types/unist" "^3.0.0" + vfile "^6.0.0" + +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@^6.0.0, vfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.1.tgz#1e8327f41eac91947d4fe9d237a2dd9209762536" + integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + +webpack-bundle-analyzer@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz#84b7473b630a7b8c21c741f81d8fe4593208b454" + 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" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + 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" + +webpack-dev-server@^4.15.1: + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + 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" + +webpack-merge@^5.9.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.0" + +webpack-sources@^3.2.2, webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.88.1: + version "5.90.3" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.90.3.tgz#37b8f74d3ded061ba789bb22b31e82eed75bd9ac" + integrity sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA== + 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" + +webpackbar@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" + integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== + dependencies: + chalk "^4.1.0" + consola "^2.15.3" + pretty-time "^1.1.0" + std-env "^3.0.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + +wildcard@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + 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" + +ws@^7.3.1: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.13.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + +xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== + +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +zwitch@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From 28b80d3085891523d59c035943ae2a9961c60353 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 12:01:22 -0500 Subject: [PATCH 02/37] Adding github action to deploy automatically documentation site --- .github/workflows/deploy-gh-pages.yml | 44 ++++++++++++++++++++++ .github/workflows/test-deploy-gh-pages.yml | 29 ++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 .github/workflows/deploy-gh-pages.yml create mode 100644 .github/workflows/test-deploy-gh-pages.yml diff --git a/.github/workflows/deploy-gh-pages.yml b/.github/workflows/deploy-gh-pages.yml new file mode 100644 index 00000000..edfaacb8 --- /dev/null +++ b/.github/workflows/deploy-gh-pages.yml @@ -0,0 +1,44 @@ +name: Build and Deploy to GitHub Pages + +defaults: + run: + shell: bash + working-directory: ./docs + +on: + push: + paths: + - 'docs/**' + +jobs: + deploy: + name: Build and Deploy to GitHub Pages + runs-on: ubuntu-latest + defaults: + run: + shell: bash + working-directory: ./docs + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + cache: yarn + cache-dependency-path: docs/yarn.lock + - name: Install dependencies + run: yarn install --frozen-lockfile + - name: Build website + run: yarn build + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + # Build output to publish to the `gh-pages` branch: + publish_dir: ./docs/build + # The following lines assign commit authorship to the official + # GH-Actions bot for deploys to `gh-pages` branch: + # https://github.com/actions/checkout/issues/13#issuecomment-724415212 + # The GH actions bot is used by default if you didn't specify the two fields. + # You can swap them out with your own user credentials. + user_name: github-actions[bot] + user_email: 41898282+github-actions[bot]@users.noreply.github.com diff --git a/.github/workflows/test-deploy-gh-pages.yml b/.github/workflows/test-deploy-gh-pages.yml new file mode 100644 index 00000000..7f95853b --- /dev/null +++ b/.github/workflows/test-deploy-gh-pages.yml @@ -0,0 +1,29 @@ +name: Build GitHub Pages on PRs No Deploy + +defaults: + run: + shell: bash + working-directory: ./docs + +on: + pull_request: + paths: + - 'docs/**' + # Review gh actions docs if you want to further define triggers, paths, etc + # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on + +jobs: + test-deploy: + name: Build GitHub Pages + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + cache: yarn + cache-dependency-path: docs/yarn.lock + - name: Install dependencies + run: yarn install --frozen-lockfile + - name: Test build website + run: yarn build From c563e663f1a15ffab5d7b94938fdf49162aafdb4 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 12:05:01 -0500 Subject: [PATCH 03/37] Fixed link issue in intro.md --- docs/docs/intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/intro.md b/docs/docs/intro.md index 1cfa6309..38296961 100644 --- a/docs/docs/intro.md +++ b/docs/docs/intro.md @@ -59,4 +59,4 @@ can choose either of them independently. To find out about how you can easily make your existing application more secure, please refer to the following section: -* [Cookbook: A real world example](07-cookbook.md#a-real-world-application) +* [Cookbook: A real world example](cookbook.md#a-real-world-application) From a9cc0a36b71f0a720410628cdbe0e0b23b04e093 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 12:18:21 -0500 Subject: [PATCH 04/37] Fixed base URL --- README.md | 2 +- docs/docusaurus.config.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a66bc577..c738bd40 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ the `lmc_rbac.global.php.dist` file to your `config/autoload` folder. ## Documentation -The official documentation is available [here](https://lm-commons.github.io/lmc-rbac-mvc). +The official documentation is available [here](https://lm-commons.github.io/lmcrbacmvc). You can also find some Doctrine entities in the [/data](/data) folder that will help you to more quickly take advantage of LmcRbac. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 619d7ef8..2243bb2b 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -16,7 +16,7 @@ const config = { url: 'https://lm-commons.github.io', // Set the // pathname under which your site is served // For GitHub pages deployment, it is often '//' - baseUrl: '/lmc-rbac-mvc', + baseUrl: '/lmcrbacmvc', // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. From 87aebe59d85d8fecf4cbd5525521bface8ecca21 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 12:28:46 -0500 Subject: [PATCH 05/37] Fixed base URL --- docs/docusaurus.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 2243bb2b..7a50b666 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -16,7 +16,7 @@ const config = { url: 'https://lm-commons.github.io', // Set the // pathname under which your site is served // For GitHub pages deployment, it is often '//' - baseUrl: '/lmcrbacmvc', + baseUrl: '/lmcrbacmvc/', // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. From 75005635c1eff61806eb83e233a253ab3ba44f7a Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 15:20:38 -0500 Subject: [PATCH 06/37] Fixed base URL case --- docs/docusaurus.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 7a50b666..6a0308ed 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -16,7 +16,7 @@ const config = { url: 'https://lm-commons.github.io', // Set the // pathname under which your site is served // For GitHub pages deployment, it is often '//' - baseUrl: '/lmcrbacmvc/', + baseUrl: '/LmcRbacMvc/', // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. From 0fff079a673358d0e2edf4bf500bfa6b74859c9f Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 15:28:11 -0500 Subject: [PATCH 07/37] Added manual workflow dispatch --- .github/workflows/deploy-gh-pages.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/deploy-gh-pages.yml b/.github/workflows/deploy-gh-pages.yml index edfaacb8..597e149e 100644 --- a/.github/workflows/deploy-gh-pages.yml +++ b/.github/workflows/deploy-gh-pages.yml @@ -9,6 +9,8 @@ on: push: paths: - 'docs/**' + workflow_dispatch: + jobs: deploy: From 01b68a1ed04249ff83bd0d4109f7576a9ae851c5 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 15:41:05 -0500 Subject: [PATCH 08/37] Fixing baseurl --- docs/docusaurus.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 6a0308ed..1f62727f 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -16,12 +16,12 @@ const config = { url: 'https://lm-commons.github.io', // Set the // pathname under which your site is served // For GitHub pages deployment, it is often '//' - baseUrl: '/LmcRbacMvc/', + baseUrl: '/lmcrbacmvc/', // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. organizationName: 'LM Commons', // Usually your GitHub org/user name. - projectName: 'lmcrbacmvc', // Usually your repo name. + projectName: 'LmcRbacMvc', // Usually your repo name. onBrokenLinks: 'throw', onBrokenMarkdownLinks: 'warn', From b162a099166f8775c43fbba3964bbb311b6f0114 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 15:51:44 -0500 Subject: [PATCH 09/37] Fixing baseurl --- docs/docusaurus.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 1f62727f..523654ce 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -16,7 +16,7 @@ const config = { url: 'https://lm-commons.github.io', // Set the // pathname under which your site is served // For GitHub pages deployment, it is often '//' - baseUrl: '/lmcrbacmvc/', + baseUrl: '/lmc-rbac-mvc/', // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. From 985674bd025db5fc9fdb1e39cc39892e2ca491ee Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 15:56:39 -0500 Subject: [PATCH 10/37] Fixing baseurl --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c738bd40..a66bc577 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ the `lmc_rbac.global.php.dist` file to your `config/autoload` folder. ## Documentation -The official documentation is available [here](https://lm-commons.github.io/lmcrbacmvc). +The official documentation is available [here](https://lm-commons.github.io/lmc-rbac-mvc). You can also find some Doctrine entities in the [/data](/data) folder that will help you to more quickly take advantage of LmcRbac. From a55c89b9debc3536b486cfcaf77b64cca1cd5684 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 16:44:14 -0500 Subject: [PATCH 11/37] Fixing baseurl --- docs/docs/role-providers.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/role-providers.md b/docs/docs/role-providers.md index c98e447d..60669840 100644 --- a/docs/docs/role-providers.md +++ b/docs/docs/role-providers.md @@ -3,6 +3,7 @@ sidebar_position: 4 --- # Role providers + In this section, you will learn: * What are role providers From 5cd693638c38e941dcdeb5aaa48a400bbf63089f Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 17:09:44 -0500 Subject: [PATCH 12/37] Fixing baseurl --- docs/docusaurus.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 523654ce..84aa4794 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -20,7 +20,7 @@ const config = { // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. - organizationName: 'LM Commons', // Usually your GitHub org/user name. + organizationName: 'LM-Commons', // Usually your GitHub org/username. projectName: 'LmcRbacMvc', // Usually your repo name. onBrokenLinks: 'throw', @@ -64,7 +64,7 @@ const config = { // Replace with your project's social card image: 'img/LMC-social-card.png', navbar: { - title: 'LM-Commons Rbac Mvc', + title: 'LM-Commons LmcRbacMvc', logo: { alt: 'LM-Commons Logo', src: 'img/LMC-logo.png', From 8ab89734b0376a21ebc9f7b010c369559a319189 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 17:13:08 -0500 Subject: [PATCH 13/37] Fixing baseurl again --- README.md | 2 +- docs/docusaurus.config.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a66bc577..c738bd40 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ the `lmc_rbac.global.php.dist` file to your `config/autoload` folder. ## Documentation -The official documentation is available [here](https://lm-commons.github.io/lmc-rbac-mvc). +The official documentation is available [here](https://lm-commons.github.io/lmcrbacmvc). You can also find some Doctrine entities in the [/data](/data) folder that will help you to more quickly take advantage of LmcRbac. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 84aa4794..2db68326 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -16,12 +16,13 @@ const config = { url: 'https://lm-commons.github.io', // Set the // pathname under which your site is served // For GitHub pages deployment, it is often '//' - baseUrl: '/lmc-rbac-mvc/', + baseUrl: '/lmcrbacmvc/', // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. organizationName: 'LM-Commons', // Usually your GitHub org/username. projectName: 'LmcRbacMvc', // Usually your repo name. + trailingSlash: false, onBrokenLinks: 'throw', onBrokenMarkdownLinks: 'warn', From 7cbcd25f156b8fc1b1a3f2d529a249517d89d64b Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 17:15:13 -0500 Subject: [PATCH 14/37] Fixing baseurl again --- docs/docusaurus.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 2db68326..197f9863 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -16,7 +16,7 @@ const config = { url: 'https://lm-commons.github.io', // Set the // pathname under which your site is served // For GitHub pages deployment, it is often '//' - baseUrl: '/lmcrbacmvc/', + baseUrl: '/LmcRbacMvc/', // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. From f695030d253930c1f99f9aa86149bf495cc40ea9 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 22 Feb 2024 17:41:55 -0500 Subject: [PATCH 15/37] Fixing documentation link in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c738bd40..70d4b142 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ the `lmc_rbac.global.php.dist` file to your `config/autoload` folder. ## Documentation -The official documentation is available [here](https://lm-commons.github.io/lmcrbacmvc). +The official documentation is available [here](https://lm-commons.github.io/LmcRbacMvc). You can also find some Doctrine entities in the [/data](/data) folder that will help you to more quickly take advantage of LmcRbac. From d5580f48b065d1e1ef09a2056cbf386df1707208 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 29 Feb 2024 15:22:07 -0500 Subject: [PATCH 16/37] Fixes #3, #4, #38 and #52 --- composer.json | 2 +- config/module.config.php | 10 +- data/FlatRole.php.dist | 85 +++++----- data/Permission.php.dist | 33 ++-- data/README.md | 2 +- data/Role.php.dist | 147 +++++++++++++++++ phpunit.xml.dist | 12 +- src/Assertion/AssertionInterface.php | 2 +- src/Assertion/AssertionPluginManager.php | 16 +- src/Collector/RbacCollector.php | 45 ++---- src/Exception/ExceptionInterface.php | 2 +- src/Factory/AssertionPluginManagerFactory.php | 16 +- .../AuthenticationIdentityProviderFactory.php | 16 +- .../AuthorizationServiceDelegatorFactory.php | 14 +- src/Factory/AuthorizationServiceFactory.php | 19 +-- src/Factory/ControllerGuardFactory.php | 32 +--- .../ControllerPermissionsGuardFactory.php | 31 +--- src/Factory/GuardPluginManagerFactory.php | 20 +-- src/Factory/GuardsFactory.php | 16 +- src/Factory/HasRoleViewHelperFactory.php | 16 +- src/Factory/IsGrantedPluginFactory.php | 16 +- src/Factory/IsGrantedViewHelperFactory.php | 16 +- src/Factory/ModuleOptionsFactory.php | 21 +-- .../ObjectRepositoryRoleProviderFactory.php | 27 +--- src/Factory/RbacFactory.php | 14 +- src/Factory/RedirectStrategyFactory.php | 15 +- .../RoleProviderPluginManagerFactory.php | 16 +- src/Factory/RoleServiceFactory.php | 20 +-- src/Factory/RouteGuardFactory.php | 25 +-- src/Factory/RoutePermissionsGuardFactory.php | 27 +--- src/Factory/UnauthorizedStrategyFactory.php | 15 +- .../AuthenticationIdentityProvider.php | 7 +- src/Identity/IdentityInterface.php | 4 +- src/Identity/IdentityProviderInterface.php | 4 +- .../AuthorizationServiceInitializer.php | 19 +-- src/Module.php | 2 +- src/Mvc/Controller/Plugin/IsGranted.php | 11 +- src/Options/ModuleOptions.php | 78 ++++----- src/Options/RedirectStrategyOptions.php | 50 +++--- src/Options/UnauthorizedStrategyOptions.php | 10 +- src/Permission/PermissionInterface.php | 1 + src/Rbac/Rbac.php | 5 +- src/Role/InMemoryRoleProvider.php | 19 +-- src/Role/ObjectRepositoryRoleProvider.php | 24 +-- src/Role/RecursiveRoleIterator.php | 7 +- src/Role/RecursiveRoleIteratorStrategy.php | 5 +- src/Role/Role.php | 52 ------ src/Role/RoleProviderInterface.php | 4 +- src/Role/RoleProviderPluginManager.php | 28 +--- src/Role/TraversalStrategyInterface.php | 4 +- src/Service/AuthorizationService.php | 44 +++--- .../AuthorizationServiceAwareInterface.php | 2 +- .../AuthorizationServiceAwareTrait.php | 10 +- src/Service/AuthorizationServiceInterface.php | 8 +- src/Service/RoleService.php | 40 ++--- src/View/Helper/HasRole.php | 7 +- src/View/Helper/IsGranted.php | 11 +- src/View/Strategy/AbstractStrategy.php | 4 +- src/View/Strategy/RedirectStrategy.php | 12 +- src/View/Strategy/UnauthorizedStrategy.php | 7 +- tests/Asset/DummyGuard.php | 2 +- tests/Asset/FlatRole.php | 89 ----------- ...HierarchicalRole.php => FlatRole.php.dist} | 87 ++++++---- tests/Asset/HierarchicalRole.php.dist | 147 +++++++++++++++++ tests/Asset/Permission.php | 27 ++-- tests/Asset/Role.php | 148 ++++++++++++++++++ tests/Asset/SimpleAssertion.php | 6 +- tests/Collector/RbacCollectorTest.php | 13 +- .../AssertionPluginManagerFactoryTest.php | 2 +- ...henticationIdentityProviderFactoryTest.php | 2 +- .../AuthorizationServiceDelegatorTest.php | 1 - .../AuthorizationServiceFactoryTest.php | 10 +- .../Factory/GuardPluginManagerFactoryTest.php | 2 +- tests/Factory/GuardsFactoryTest.php | 4 +- tests/Factory/ModuleOptionsFactoryTest.php | 15 +- tests/Factory/RbacFactoryTest.php | 9 +- tests/Factory/RedirectStrategyFactoryTest.php | 2 +- .../RoleProviderPluginManagerFactoryTest.php | 2 +- tests/Factory/RoleServiceFactoryTest.php | 16 +- .../UnauthorizedStrategyFactoryTest.php | 2 +- tests/Guard/ControllerGuardTest.php | 24 +-- .../Guard/ControllerPermissionsGuardTest.php | 4 +- tests/Guard/GuardPluginManagerTest.php | 2 +- tests/Guard/RouteGuardTest.php | 44 +++--- tests/Guard/RoutePermissionsGuardTest.php | 33 +++- .../AuthorizationServiceInitializerTest.php | 13 +- tests/Options/ModuleOptionsTest.php | 4 +- tests/Options/RedirectStrategyOptionsTest.php | 2 +- .../UnauthorizedStrategyOptionsTest.php | 2 +- tests/Role/InMemoryRoleProviderTest.php | 5 +- .../Role/ObjectRepositoryRoleProviderTest.php | 113 ++++++++++--- tests/Role/RoleProviderPluginManagerTest.php | 8 - tests/Service/AuthorizationServiceTest.php | 19 ++- tests/Service/RoleServiceTest.php | 13 +- tests/Util/ServiceManagerFactory.php | 10 +- tests/testing.config.php | 8 +- 96 files changed, 1112 insertions(+), 1005 deletions(-) create mode 100644 data/Role.php.dist delete mode 100644 src/Role/Role.php delete mode 100644 tests/Asset/FlatRole.php rename tests/Asset/{HierarchicalRole.php => FlatRole.php.dist} (52%) create mode 100644 tests/Asset/HierarchicalRole.php.dist create mode 100644 tests/Asset/Role.php diff --git a/composer.json b/composer.json index 18fdc5d9..37142a2b 100644 --- a/composer.json +++ b/composer.json @@ -47,7 +47,7 @@ "laminas/laminas-i18n": "^2.7", "laminas/laminas-serializer": "^2.2", "laminas/laminas-view": "^2.12", - "phpunit/phpunit": "9.5.21", + "phpunit/phpunit": "10.5.11", "squizlabs/php_codesniffer": "^3.5.5", "php-coveralls/php-coveralls": "^2.2", "phpspec/prophecy-phpunit": "^2.0", diff --git a/config/module.config.php b/config/module.config.php index 51a1cc8e..a59128ed 100644 --- a/config/module.config.php +++ b/config/module.config.php @@ -18,12 +18,15 @@ return [ 'service_manager' => [ + 'aliases' => [ + 'Rbac' => 'rbac', + ], 'factories' => [ /* Factories that do not map to a class */ 'LmcRbacMvc\Guards' => \LmcRbacMvc\Factory\GuardsFactory::class, + 'rbac' => \LmcRbacMvc\Factory\RbacFactory::class, /* Factories that map to a class */ - \Rbac\Rbac::class => \LmcRbacMvc\Factory\RbacFactory::class, \LmcRbacMvc\Assertion\AssertionPluginManager::class => \LmcRbacMvc\Factory\AssertionPluginManagerFactory::class, \LmcRbacMvc\Collector\RbacCollector::class => \Laminas\ServiceManager\Factory\InvokableFactory::class, \LmcRbacMvc\Guard\GuardPluginManager::class => \LmcRbacMvc\Factory\GuardPluginManagerFactory::class, @@ -64,6 +67,10 @@ ] ], + /* + * Developer tools are now provided by the companion module LmcRbacMvcDevTools + * You can still use the config below but you are encouraged to use the new module + * 'laminas-developer-tools' => [ 'profiler' => [ 'collectors' => [ @@ -76,6 +83,7 @@ ], ], ], + */ 'lmc_rbac' => [ // Guard plugin manager diff --git a/data/FlatRole.php.dist b/data/FlatRole.php.dist index 109d6bba..5c8b204f 100644 --- a/data/FlatRole.php.dist +++ b/data/FlatRole.php.dist @@ -16,14 +16,21 @@ * and is licensed under the MIT license. */ + use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; +use Laminas\Permissions\Rbac\RoleInterface; use Doctrine\ORM\Mapping as ORM; -use Rbac\Role\RoleInterface; -use LmcRbac\Permission\PermissionInterface; + +/** + * There is no specific implementation of a flot role. + * A flot role is a simple utilization of the Laminas\Permission\Rbac\Role without children + */ + /** * @ORM\Entity - * @ORM\Table(name="roles") + * @ORM\Table(name="flat_roles") */ class FlatRole implements RoleInterface { @@ -32,83 +39,81 @@ class FlatRole implements RoleInterface * * @ORM\Id * @ORM\Column(type="integer") - * @ORM\GeneratedValue(strategy="AUTO") + * @ORM\GeneratedValue */ - protected $id; + private ?int $id; /** * @var string|null - * - * @ORM\Column(type="string", length=48, unique=true) + * @ORM\Column(type="string", length=32, unique=true) */ - protected $name; + protected ?string $name; /** - * @var PermissionInterface[]|\Doctrine\Common\Collections\Collection - * - * @ORM\ManyToMany(targetEntity="Permission", indexBy="name", fetch="EAGER", cascade={"persist"}) + * @var Collection + * @ORM\ManyToMany(targetEntity="Permission", indexBy="name", cascade={"persist"}, fetch="EAGER") */ - protected $permissions; + protected Collection $permissions; /** * Init the Doctrine collection */ - public function __construct() + public function __construct($name) { + $this->name = (string) $name; $this->permissions = new ArrayCollection(); } /** * Get the role identifier * - * @return int + * @return int|null */ - public function getId() + public function getId(): ?int { return $this->id; } /** - * Set the role name + * Add a permission * - * @param string $name + * @param string $name * @return void */ - public function setName($name) + public function addPermission(string $name):void { - $this->name = (string) $name; + $permission = new \LmcRbacMvcTest\Asset\Permission($name); + + $this->permissions[$name] = $permission; } - /** - * Get the role name - * - * @return string - */ - public function getName() + public function getName(): string { return $this->name; } - /** - * {@inheritDoc} - */ - public function addPermission($permission) + public function hasPermission(string $name): bool { - if (is_string($permission)) { - $permission = new Permission($permission); - } + return isset($this->permissions[$name]); + } - $this->permissions[(string) $permission] = $permission; + public function addChild(RoleInterface $child): void + { + // Do nothing } - /** - * {@inheritDoc} - */ - public function hasPermission($permission) + public function getChildren(): iterable { - // This can be a performance problem if your role has a lot of permissions. Please refer - // to the cookbook to an elegant way to solve this issue + return []; + } - return isset($this->permissions[(string) $permission]); + public function addParent(RoleInterface $parent): void + { + // Do nothing + } + + public function getParents(): iterable + { + return []; } } diff --git a/data/Permission.php.dist b/data/Permission.php.dist index 945a65f2..3556efbf 100644 --- a/data/Permission.php.dist +++ b/data/Permission.php.dist @@ -16,30 +16,27 @@ * and is licensed under the MIT license. */ + +use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; -use LmcRbac\Permission\PermissionInterface; /** * @ORM\Entity * @ORM\Table(name="permissions") */ -class Permission implements PermissionInterface +class Permission { /** - * @var int|null - * * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ - protected $id; + private ?int $id; /** - * @var string|null - * - * @ORM\Column(type="string", length=128, unique=true) + * @ORM\Column(type="string", length=32, unique=true) */ - protected $name; + private ?string $name; /** * Constructor @@ -52,18 +49,28 @@ class Permission implements PermissionInterface /** * Get the permission identifier * - * @return int + * @return int|null */ - public function getId() + public function getId(): ?int { return $this->id; } /** - * {@inheritDoc} + * Get the permission name + * + * @return string|null */ - public function __toString() + public function getName(): ?string { return $this->name; } + + /** + * + */ + public function __toString(): string + { + return $this->getName(); + } } diff --git a/data/README.md b/data/README.md index 67e21dd3..de848074 100644 --- a/data/README.md +++ b/data/README.md @@ -1,4 +1,4 @@ -These files are only provided as-in, and are not part of LmcRbac. They provide you some basic Doctrine ORM +These files are only provided as-in, and are not part of LmcRbacMvc. They provide you some basic Doctrine ORM entities that you can use as a starting point. ## Flat role or hierarchical role? diff --git a/data/Role.php.dist b/data/Role.php.dist new file mode 100644 index 00000000..1d66e677 --- /dev/null +++ b/data/Role.php.dist @@ -0,0 +1,147 @@ +name = $name; + $this->children = new ArrayCollection(); + $this->permissions = new ArrayCollection(); + } + + /** + * Get the role identifier + * + * @return int|null + */ + public function getId(): ?int + { + return $this->id; + } + + /** + * Add a permission + * + * @param string $name + * @return void + */ + public function addPermission(string $name):void + { + $permission = new Permission($name); + + $this->permissions[$name] = $permission; + } + + public function getName(): string + { + return $this->name; + } + + public function hasPermission(string $name): bool + { + return isset($this->permissions[$name]); + } + + public function addChild(RoleInterface $child): void + { + $this->children[] = $child; + } + + public function getChildren(): iterable + { + return $this->children; + } + + public function addParent(RoleInterface $parent): void + { + // TODO: Implement addParent() method. + } + + public function getParents(): iterable + { + return []; + //return $this->parents; + } +} diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 2bfda57b..81d34912 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,11 +1,11 @@ - - - - ./src - - + ./tests + + + ./src + + diff --git a/src/Assertion/AssertionInterface.php b/src/Assertion/AssertionInterface.php index 9724a59c..10a97e2f 100644 --- a/src/Assertion/AssertionInterface.php +++ b/src/Assertion/AssertionInterface.php @@ -39,5 +39,5 @@ interface AssertionInterface * @param mixed $context * @return bool */ - public function assert(AuthorizationService $authorizationService); + public function assert(AuthorizationService $authorizationService, mixed $context): bool; } diff --git a/src/Assertion/AssertionPluginManager.php b/src/Assertion/AssertionPluginManager.php index 43ab9b54..f5261dd0 100644 --- a/src/Assertion/AssertionPluginManager.php +++ b/src/Assertion/AssertionPluginManager.php @@ -20,6 +20,7 @@ use Laminas\ServiceManager\AbstractPluginManager; use LmcRbacMvc\Exception; +use Psr\Container\ContainerExceptionInterface; /** * Plugin manager to create assertions @@ -34,24 +35,27 @@ class AssertionPluginManager extends AbstractPluginManager /** * {@inheritDoc} */ - public function validate($plugin) + public function validate($instance): void { - if ($plugin instanceof AssertionInterface) { + if ($instance instanceof AssertionInterface) { return; // we're okay } throw new Exception\RuntimeException(sprintf( 'Assertions must implement "LmcRbacMvc\Assertion\AssertionInterface", but "%s" was given', - is_object($plugin) ? get_class($plugin) : gettype($plugin) + is_object($instance) ? get_class($instance) : gettype($instance) )); } /** - * {@inheritDoc} + * @param $instance + * @return void + * @throws ContainerExceptionInterface + * @deprecated Use method validate instead */ - public function validatePlugin($plugin) + public function validatePlugin($instance): void { - $this->validate($plugin); + $this->validate($instance); } /** diff --git a/src/Collector/RbacCollector.php b/src/Collector/RbacCollector.php index 08600630..77b40a6a 100644 --- a/src/Collector/RbacCollector.php +++ b/src/Collector/RbacCollector.php @@ -36,6 +36,7 @@ * * @author Michaël Gallego * @license MIT + * @deprecated Developer tools are now part of the companion module LmcRbacMvcDevTools. */ class RbacCollector implements CollectorInterface, Serializable { @@ -44,32 +45,20 @@ class RbacCollector implements CollectorInterface, Serializable */ const PRIORITY = -100; - /** - * @var array - */ - protected $collectedGuards = []; + protected array $collectedGuards = []; - /** - * @var array - */ - protected $collectedRoles = []; + protected array $collectedRoles = []; - /** - * @var array - */ - protected $collectedPermissions = []; + protected array $collectedPermissions = []; - /** - * @var array - */ - protected $collectedOptions = []; + protected array $collectedOptions = []; /** * Collector Name. * * @return string */ - public function getName() + public function getName(): string { return 'lmc_rbac'; } @@ -79,7 +68,7 @@ public function getName() * * @return integer */ - public function getPriority() + public function getPriority(): int { return self::PRIORITY; } @@ -90,7 +79,7 @@ public function getPriority() * @param MvcEvent $mvcEvent * @throws ReflectionException */ - public function collect(MvcEvent $mvcEvent) + public function collect(MvcEvent $mvcEvent): void { if (!$application = $mvcEvent->getApplication()) { return; @@ -116,7 +105,7 @@ public function collect(MvcEvent $mvcEvent) * @param ModuleOptions $moduleOptions * @return void */ - private function collectOptions(ModuleOptions $moduleOptions) + private function collectOptions(ModuleOptions $moduleOptions): void { $this->collectedOptions = [ 'guest_role' => $moduleOptions->getGuestRole(), @@ -127,10 +116,10 @@ private function collectOptions(ModuleOptions $moduleOptions) /** * Collect guards * - * @param array $guards + * @param array $guards * @return void */ - private function collectGuards($guards) + private function collectGuards(array $guards): void { $this->collectedGuards = []; @@ -146,14 +135,14 @@ private function collectGuards($guards) * @return void * @throws ReflectionException */ - private function collectIdentityRolesAndPermissions(RoleService $roleService) + private function collectIdentityRolesAndPermissions(RoleService $roleService): void { $identityRoles = $roleService->getIdentityRoles(); foreach ($identityRoles as $role) { $roleName = $role->getName(); - if (empty($role->hasChildren())) { + if (empty($role->getChildren())) { $this->collectedRoles[] = $roleName; } else { $iteratorIterator = new RecursiveIteratorIterator( @@ -178,7 +167,7 @@ private function collectIdentityRolesAndPermissions(RoleService $roleService) * @return void * @throws ReflectionException */ - private function collectPermissions(RoleInterface $role) + private function collectPermissions(RoleInterface $role): void { if (method_exists($role, 'getPermissions')) { $permissions = $role->getPermissions(); @@ -205,7 +194,7 @@ private function collectPermissions(RoleInterface $role) /** * @return array|string[] */ - public function getCollection() + public function getCollection(): array { return [ 'guards' => $this->collectedGuards, @@ -217,7 +206,7 @@ public function getCollection() /** * {@inheritDoc} */ - public function serialize() + public function serialize(): ?string { return serialize($this->__serialize()); } @@ -225,7 +214,7 @@ public function serialize() /** * {@inheritDoc} */ - public function unserialize($data) + public function unserialize($data): void { $collection = unserialize($data); if (!is_array($collection)) { diff --git a/src/Exception/ExceptionInterface.php b/src/Exception/ExceptionInterface.php index ee1cddfd..3d07d41a 100644 --- a/src/Exception/ExceptionInterface.php +++ b/src/Exception/ExceptionInterface.php @@ -19,7 +19,7 @@ namespace LmcRbacMvc\Exception; /** - * Base exception interface for ZfcRbac + * Base exception interface for LmcRbacMvc * * @author Michaël Gallego * @license MIT diff --git a/src/Factory/AssertionPluginManagerFactory.php b/src/Factory/AssertionPluginManagerFactory.php index 2512529a..a389e97a 100644 --- a/src/Factory/AssertionPluginManagerFactory.php +++ b/src/Factory/AssertionPluginManagerFactory.php @@ -33,24 +33,12 @@ class AssertionPluginManagerFactory implements FactoryInterface { /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return AssertionPluginManager + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): AssertionPluginManager { $config = $container->get('Config')['lmc_rbac']['assertion_manager']; return new AssertionPluginManager($container, $config); } - - /** - * {@inheritDoc} - * @return AssertionPluginManager - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator, AssertionPluginManager::class); - } } diff --git a/src/Factory/AuthenticationIdentityProviderFactory.php b/src/Factory/AuthenticationIdentityProviderFactory.php index 707f2f55..984801b8 100644 --- a/src/Factory/AuthenticationIdentityProviderFactory.php +++ b/src/Factory/AuthenticationIdentityProviderFactory.php @@ -33,25 +33,13 @@ class AuthenticationIdentityProviderFactory implements FactoryInterface { /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return AuthenticationIdentityProvider + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): AuthenticationIdentityProvider { /* @var AuthenticationService $authenticationProvider */ $authenticationProvider = $container->get(AuthenticationService::class); return new AuthenticationIdentityProvider($authenticationProvider); } - - /** - * {@inheritDoc} - * @return AuthenticationIdentityProvider - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator, AuthenticationIdentityProvider::class); - } } diff --git a/src/Factory/AuthorizationServiceDelegatorFactory.php b/src/Factory/AuthorizationServiceDelegatorFactory.php index a09adf52..4900e408 100644 --- a/src/Factory/AuthorizationServiceDelegatorFactory.php +++ b/src/Factory/AuthorizationServiceDelegatorFactory.php @@ -35,13 +35,9 @@ class AuthorizationServiceDelegatorFactory implements DelegatorFactoryInterface { /** - * @param ContainerInterface $container - * @param string $name - * @param callable $callback - * @param array|null $options - * @return mixed + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $name, callable $callback, array $options = null) + public function __invoke(ContainerInterface $container, $name, callable $callback, array $options = null): AuthorizationServiceAwareInterface { $instanceToDecorate = call_user_func($callback); @@ -60,11 +56,7 @@ public function __invoke(ContainerInterface $container, $name, callable $callbac } /** - * @param ServiceLocatorInterface $serviceLocator - * @param string $name - * @param string $requestedName - * @param callable $callback - * @return mixed + * {@inheritDoc} */ public function createDelegatorWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName, $callback) { diff --git a/src/Factory/AuthorizationServiceFactory.php b/src/Factory/AuthorizationServiceFactory.php index 5cee912b..83a37a28 100644 --- a/src/Factory/AuthorizationServiceFactory.php +++ b/src/Factory/AuthorizationServiceFactory.php @@ -18,9 +18,9 @@ namespace LmcRbacMvc\Factory; +use Laminas\Permissions\Rbac\Rbac; use Psr\Container\ContainerInterface; -use Laminas\ServiceManager\FactoryInterface; -use Laminas\ServiceManager\ServiceLocatorInterface; +use Laminas\ServiceManager\Factory\FactoryInterface; use LmcRbacMvc\Assertion\AssertionPluginManager; use LmcRbacMvc\Options\ModuleOptions; use LmcRbacMvc\Service\AuthorizationService; @@ -40,10 +40,10 @@ class AuthorizationServiceFactory implements FactoryInterface * @param array|null $options * @return AuthorizationService */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): AuthorizationService { - /* @var \Laminas\Permissions\Rbac\Rbac $rbac */ - $rbac = $container->get(\Rbac\Rbac::class); + /* @var Rbac $rbac */ + $rbac = $container->get('rbac'); /* @var RoleService $roleService */ $roleService = $container->get(RoleService::class); @@ -59,13 +59,4 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o return $authorizationService; } - - /** - * {@inheritDoc} - * @return AuthorizationService - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator, AuthorizationService::class); - } } diff --git a/src/Factory/ControllerGuardFactory.php b/src/Factory/ControllerGuardFactory.php index 43274007..3d3ea34e 100644 --- a/src/Factory/ControllerGuardFactory.php +++ b/src/Factory/ControllerGuardFactory.php @@ -33,13 +33,10 @@ */ class ControllerGuardFactory implements FactoryInterface { - /** - * @var array - */ - protected $options = []; + protected array $options = []; /** - * {@inheritDoc} + * @param array $options */ public function __construct(array $options = []) { @@ -47,44 +44,31 @@ public function __construct(array $options = []) } /** - * {@inheritDoc} + * @param array $options */ - public function setCreationOptions(array $options) + public function setCreationOptions(array $options): void { $this->options = $options; } /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return ControllerGuard + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): ControllerGuard { if (null === $options) { $options = []; } /* @var ModuleOptions $moduleOptions */ - $moduleOptions = $container->get('LmcRbacMvc\Options\ModuleOptions'); + $moduleOptions = $container->get(\LmcRbacMvc\Options\ModuleOptions::class); /* @var RoleService $roleService */ - $roleService = $container->get('LmcRbacMvc\Service\RoleService'); + $roleService = $container->get(\LmcRbacMvc\Service\RoleService::class); $controllerGuard = new ControllerGuard($roleService, $options); $controllerGuard->setProtectionPolicy($moduleOptions->getProtectionPolicy()); return $controllerGuard; } - - - /** - * {@inheritDoc} - * @return ControllerGuard - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator->getServiceLocator(), ControllerGuard::class, $this->options); - } } diff --git a/src/Factory/ControllerPermissionsGuardFactory.php b/src/Factory/ControllerPermissionsGuardFactory.php index 0e023150..cf842692 100644 --- a/src/Factory/ControllerPermissionsGuardFactory.php +++ b/src/Factory/ControllerPermissionsGuardFactory.php @@ -34,13 +34,10 @@ */ class ControllerPermissionsGuardFactory implements FactoryInterface { - /** - * @var array - */ - protected $options = []; + protected array $options = []; /** - * {@inheritDoc} + * @param array $options */ public function __construct(array $options = []) { @@ -48,43 +45,31 @@ public function __construct(array $options = []) } /** - * {@inheritDoc} + * @param array $options */ - public function setCreationOptions(array $options) + public function setCreationOptions(array $options): void { $this->options = $options; } /** - * @param ContainerInterface $container - * @param string $resolvedName - * @param array|null $options - * @return ControllerPermissionsGuard + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $resolvedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): ControllerPermissionsGuard { if (null === $options) { $options = []; } /* @var ModuleOptions $moduleOptions */ - $moduleOptions = $container->get('LmcRbacMvc\Options\ModuleOptions'); + $moduleOptions = $container->get(\LmcRbacMvc\Options\ModuleOptions::class); /* @var AuthorizationService $authorizationService */ - $authorizationService = $container->get('LmcRbacMvc\Service\AuthorizationService'); + $authorizationService = $container->get(\LmcRbacMvc\Service\AuthorizationService::class); $guard = new ControllerPermissionsGuard($authorizationService, $options); $guard->setProtectionPolicy($moduleOptions->getProtectionPolicy()); return $guard; } - - /** - * @param AbstractPluginManager|ServiceLocatorInterface $serviceLocator - * @return ControllerPermissionsGuard - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator->getServiceLocator(), ControllerPermissionsGuard::class, $this->options); - } } diff --git a/src/Factory/GuardPluginManagerFactory.php b/src/Factory/GuardPluginManagerFactory.php index 3c4e5b58..9a5cdea9 100644 --- a/src/Factory/GuardPluginManagerFactory.php +++ b/src/Factory/GuardPluginManagerFactory.php @@ -33,26 +33,12 @@ class GuardPluginManagerFactory implements FactoryInterface { /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return GuardPluginManager + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): GuardPluginManager { $config = $container->get('Config')['lmc_rbac']['guard_manager']; - $pluginManager = new GuardPluginManager($container, $config); - - return $pluginManager; - } - - /** - * {@inheritDoc} - * @return GuardPluginManager - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator, GuardPluginManager::class); + return new GuardPluginManager($container, $config); } } diff --git a/src/Factory/GuardsFactory.php b/src/Factory/GuardsFactory.php index f69b3117..89bc1728 100644 --- a/src/Factory/GuardsFactory.php +++ b/src/Factory/GuardsFactory.php @@ -34,12 +34,9 @@ class GuardsFactory implements FactoryInterface { /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return array + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): object|array { /* @var ModuleOptions $options */ $options = $container->get(ModuleOptions::class); @@ -59,13 +56,4 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o return $guards; } - - /** - * {@inheritDoc} - * @return GuardInterface[]|array - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator, GuardInterface::class); - } } diff --git a/src/Factory/HasRoleViewHelperFactory.php b/src/Factory/HasRoleViewHelperFactory.php index 2ab84721..64e59c57 100644 --- a/src/Factory/HasRoleViewHelperFactory.php +++ b/src/Factory/HasRoleViewHelperFactory.php @@ -33,25 +33,13 @@ class HasRoleViewHelperFactory implements FactoryInterface { /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return HasRole + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): HasRole { /* @var RoleService $roleService */ $roleService = $container->get(RoleService::class); return new HasRole($roleService); } - - /** - * {@inheritDoc} - * @return HasRole - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator->getServiceLocator(), HasRole::class); - } } diff --git a/src/Factory/IsGrantedPluginFactory.php b/src/Factory/IsGrantedPluginFactory.php index 6841f118..15ef11cb 100644 --- a/src/Factory/IsGrantedPluginFactory.php +++ b/src/Factory/IsGrantedPluginFactory.php @@ -33,25 +33,13 @@ class IsGrantedPluginFactory implements FactoryInterface { /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return IsGranted + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): IsGranted { /* @var AuthorizationService $authorizationService */ $authorizationService = $container->get(AuthorizationService::class); return new IsGranted($authorizationService); } - - /** - * {@inheritDoc} - * @return IsGranted - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator->getServiceLocator(), IsGranted::class); - } } diff --git a/src/Factory/IsGrantedViewHelperFactory.php b/src/Factory/IsGrantedViewHelperFactory.php index 09c638a8..56a904b6 100644 --- a/src/Factory/IsGrantedViewHelperFactory.php +++ b/src/Factory/IsGrantedViewHelperFactory.php @@ -33,25 +33,13 @@ class IsGrantedViewHelperFactory implements FactoryInterface { /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return IsGranted + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): IsGranted { /* @var AuthorizationService $authorizationService */ $authorizationService = $container->get(AuthorizationService::class); return new IsGranted($authorizationService); } - - /** - * {@inheritDoc} - * @return IsGranted - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator->getServiceLocator(), IsGranted::class); - } } diff --git a/src/Factory/ModuleOptionsFactory.php b/src/Factory/ModuleOptionsFactory.php index e240731e..eaf92a01 100644 --- a/src/Factory/ModuleOptionsFactory.php +++ b/src/Factory/ModuleOptionsFactory.php @@ -18,6 +18,7 @@ namespace LmcRbacMvc\Factory; +use Laminas\ServiceManager\Exception\ServiceNotCreatedException; use Psr\Container\ContainerInterface; use Laminas\ServiceManager\Factory\FactoryInterface; use Laminas\ServiceManager\ServiceLocatorInterface; @@ -31,23 +32,15 @@ */ class ModuleOptionsFactory implements FactoryInterface { - /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return ModuleOptions - */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) - { - return new ModuleOptions($container->get('Config')['lmc_rbac']); - } - /** * {@inheritDoc} - * @return ModuleOptions */ - public function createService(ServiceLocatorInterface $serviceLocator) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): ModuleOptions { - return $this($serviceLocator, ModuleOptions::class); + $config = $container->get('Config'); + if (!isset($config['lmc_rbac'])) { + throw new ServiceNotCreatedException("Could not find the `lmc_rbac' configuration array "); + } + return new ModuleOptions($container->get('Config')['lmc_rbac']); } } diff --git a/src/Factory/ObjectRepositoryRoleProviderFactory.php b/src/Factory/ObjectRepositoryRoleProviderFactory.php index 1605cbd6..13093fb0 100644 --- a/src/Factory/ObjectRepositoryRoleProviderFactory.php +++ b/src/Factory/ObjectRepositoryRoleProviderFactory.php @@ -34,13 +34,10 @@ */ class ObjectRepositoryRoleProviderFactory implements FactoryInterface { - /** - * @var array - */ - protected $options = []; + protected array $options = []; /** - * {@inheritDoc} + * @param array $options */ public function __construct(array $options = []) { @@ -48,20 +45,17 @@ public function __construct(array $options = []) } /** - * {@inheritDoc} + * @param array $options */ - public function setCreationOptions(array $options) + public function setCreationOptions(array $options): void { $this->options = $options; } /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return ObjectRepositoryRoleProvider + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): ObjectRepositoryRoleProvider { $objectRepository = null; @@ -89,13 +83,4 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o you sure you specified either the "object_repository" option or "object_manager"/"class_name" options?' ); } - - /** - * {@inheritDoc} - * @return ObjectRepositoryRoleProvider - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator->getServiceLocator(), ObjectRepositoryRoleProvider::class, $this->options); - } } diff --git a/src/Factory/RbacFactory.php b/src/Factory/RbacFactory.php index dd48a05d..3ef4f757 100644 --- a/src/Factory/RbacFactory.php +++ b/src/Factory/RbacFactory.php @@ -19,10 +19,8 @@ namespace LmcRbacMvc\Factory; use Psr\Container\ContainerInterface; -use LmcRbacMvc\Rbac\Rbac; -use Rbac\Traversal\Strategy\GeneratorStrategy; +use Laminas\Permissions\Rbac\Rbac; use Laminas\ServiceManager\Factory\FactoryInterface; -use Laminas\ServiceManager\ServiceLocatorInterface; /** * @author Michaël Gallego @@ -36,16 +34,8 @@ class RbacFactory implements FactoryInterface * @param array|null $options * @return Rbac */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): Rbac { return new Rbac(); } - - /** - * {@inheritDoc} - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator, Rbac::class); - } } diff --git a/src/Factory/RedirectStrategyFactory.php b/src/Factory/RedirectStrategyFactory.php index 6eeffe67..384759e9 100644 --- a/src/Factory/RedirectStrategyFactory.php +++ b/src/Factory/RedirectStrategyFactory.php @@ -34,12 +34,9 @@ class RedirectStrategyFactory implements FactoryInterface { /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return RedirectStrategy + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): RedirectStrategy { /* @var ModuleOptions $moduleOptions */ $moduleOptions = $container->get(ModuleOptions::class); @@ -48,12 +45,4 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o return new RedirectStrategy($moduleOptions->getRedirectStrategy(), $authenticationService); } - - /** - * {@inheritDoc} - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator, RedirectStrategy::class); - } } diff --git a/src/Factory/RoleProviderPluginManagerFactory.php b/src/Factory/RoleProviderPluginManagerFactory.php index 86eda746..d62fc743 100644 --- a/src/Factory/RoleProviderPluginManagerFactory.php +++ b/src/Factory/RoleProviderPluginManagerFactory.php @@ -32,24 +32,12 @@ class RoleProviderPluginManagerFactory implements FactoryInterface { /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return RoleProviderPluginManager + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): RoleProviderPluginManager { $config = $container->get('Config')['lmc_rbac']['role_provider_manager']; return new RoleProviderPluginManager($container, $config); } - - /** - * {@inheritDoc} - * @return RoleProviderPluginManager - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator, RoleProviderPluginManager::class); - } } diff --git a/src/Factory/RoleServiceFactory.php b/src/Factory/RoleServiceFactory.php index af71965a..201e0e2b 100644 --- a/src/Factory/RoleServiceFactory.php +++ b/src/Factory/RoleServiceFactory.php @@ -18,6 +18,7 @@ namespace LmcRbacMvc\Factory; +use Laminas\ServiceManager\Exception\ServiceNotCreatedException; use Psr\Container\ContainerInterface; use Laminas\ServiceManager\Factory\FactoryInterface; use Laminas\ServiceManager\ServiceLocatorInterface; @@ -39,12 +40,9 @@ class RoleServiceFactory implements FactoryInterface { /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return RoleService + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): RoleService { /* @var ModuleOptions $moduleOptions */ $moduleOptions = $container->get(ModuleOptions::class); @@ -55,13 +53,12 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o $roleProviderConfig = $moduleOptions->getRoleProvider(); if (empty($roleProviderConfig)) { - throw new RuntimeException('No role provider has been set for LmcRbacMvc'); + throw new ServiceNotCreatedException('No role provider has been set for LmcRbacMvc'); } /* @var RoleProviderPluginManager $pluginManager */ $pluginManager = $container->get(RoleProviderPluginManager::class); - /* @var RoleProviderInterface $roleProvider */ reset($roleProviderConfig); $roleProvider = $pluginManager->get(key($roleProviderConfig), current($roleProviderConfig)); @@ -73,13 +70,4 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o return $roleService; } - - /** - * {@inheritDoc} - * @return RoleService - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator, RoleService::class); - } } diff --git a/src/Factory/RouteGuardFactory.php b/src/Factory/RouteGuardFactory.php index 177d9dfe..64474cfb 100644 --- a/src/Factory/RouteGuardFactory.php +++ b/src/Factory/RouteGuardFactory.php @@ -36,10 +36,10 @@ class RouteGuardFactory implements FactoryInterface /** * @var array */ - protected $options = []; + protected array $options = []; /** - * {@inheritDoc} + * @param array $options */ public function __construct(array $options = []) { @@ -47,20 +47,17 @@ public function __construct(array $options = []) } /** - * {@inheritDoc} + * @param array $options */ - public function setCreationOptions(array $options) + public function setCreationOptions(array $options): void { $this->options = $options; } /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return RouteGuard + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): RouteGuard { if (null === $options) { $options = []; @@ -77,14 +74,4 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o return $routeGuard; } - - - /** - * {@inheritDoc} - * @return RouteGuard - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator->getServiceLocator(), RouteGuard::class, $this->options); - } } diff --git a/src/Factory/RoutePermissionsGuardFactory.php b/src/Factory/RoutePermissionsGuardFactory.php index 9cf1ad90..9701d150 100644 --- a/src/Factory/RoutePermissionsGuardFactory.php +++ b/src/Factory/RoutePermissionsGuardFactory.php @@ -35,13 +35,10 @@ */ class RoutePermissionsGuardFactory implements FactoryInterface { - /** - * @var array - */ - protected $options = []; + protected array $options = []; /** - * {@inheritDoc} + * @param array $options */ public function __construct(array $options = []) { @@ -49,20 +46,17 @@ public function __construct(array $options = []) } /** - * {@inheritDoc} + * @param array $options */ - public function setCreationOptions(array $options) + public function setCreationOptions(array $options): void { $this->options = $options; } /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return RoutePermissionsGuard + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): RoutePermissionsGuard { if (null === $options) { $options = []; @@ -79,13 +73,4 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o return $routeGuard; } - - /** - * @param \Laminas\ServiceManager\AbstractPluginManager|ServiceLocatorInterface $serviceLocator - * @return RouteGuard - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator->getServiceLocator(), RoutePermissionsGuard::class, $this->options); - } } diff --git a/src/Factory/UnauthorizedStrategyFactory.php b/src/Factory/UnauthorizedStrategyFactory.php index 68799c58..a8b2a4c1 100644 --- a/src/Factory/UnauthorizedStrategyFactory.php +++ b/src/Factory/UnauthorizedStrategyFactory.php @@ -33,24 +33,13 @@ class UnauthorizedStrategyFactory implements FactoryInterface { /** - * @param ContainerInterface $container - * @param string $requestedName - * @param array|null $options - * @return UnauthorizedStrategy + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + public function __invoke(ContainerInterface $container, $requestedName, array $options = null): UnauthorizedStrategy { /* @var ModuleOptions $moduleOptions */ $moduleOptions = $container->get(ModuleOptions::class); return new UnauthorizedStrategy($moduleOptions->getUnauthorizedStrategy()); } - - /** - * {@inheritDoc} - */ - public function createService(ServiceLocatorInterface $serviceLocator) - { - return $this($serviceLocator, UnauthorizedStrategy::class); - } } diff --git a/src/Identity/AuthenticationIdentityProvider.php b/src/Identity/AuthenticationIdentityProvider.php index b2fffbcb..9b1ebcc4 100644 --- a/src/Identity/AuthenticationIdentityProvider.php +++ b/src/Identity/AuthenticationIdentityProvider.php @@ -28,10 +28,7 @@ */ class AuthenticationIdentityProvider implements IdentityProviderInterface { - /** - * @var AuthenticationServiceInterface - */ - protected $authenticationService; + protected AuthenticationServiceInterface $authenticationService; /** * Constructor @@ -46,7 +43,7 @@ public function __construct(AuthenticationServiceInterface $authenticationServic /** * {@inheritDoc} */ - public function getIdentity() + public function getIdentity(): ?IdentityInterface { return $this->authenticationService->getIdentity(); } diff --git a/src/Identity/IdentityInterface.php b/src/Identity/IdentityInterface.php index c9c52b8a..3cf05a6a 100644 --- a/src/Identity/IdentityInterface.php +++ b/src/Identity/IdentityInterface.php @@ -18,7 +18,7 @@ namespace LmcRbacMvc\Identity; -use Rbac\Role\RoleInterface; +use Laminas\Permissions\Rbac\RoleInterface; /** * Interface for an identity @@ -33,5 +33,5 @@ interface IdentityInterface * * @return string[]|RoleInterface[] */ - public function getRoles(); + public function getRoles(): array; } diff --git a/src/Identity/IdentityProviderInterface.php b/src/Identity/IdentityProviderInterface.php index d252ef37..4b9a7fe3 100644 --- a/src/Identity/IdentityProviderInterface.php +++ b/src/Identity/IdentityProviderInterface.php @@ -19,7 +19,7 @@ namespace LmcRbacMvc\Identity; /** - * An identity provider is an object that returns an object that implement ZfcRbac\Identity\IdentityInterface + * An identity provider is an object that returns an object that implement LmcRbacMvc\Identity\IdentityInterface * * @author Michaël Gallego * @license MIT @@ -31,5 +31,5 @@ interface IdentityProviderInterface * * @return IdentityInterface|null */ - public function getIdentity(); + public function getIdentity(): ?IdentityInterface; } diff --git a/src/Initializer/AuthorizationServiceInitializer.php b/src/Initializer/AuthorizationServiceInitializer.php index b48c61a8..1bedadb0 100644 --- a/src/Initializer/AuthorizationServiceInitializer.php +++ b/src/Initializer/AuthorizationServiceInitializer.php @@ -33,26 +33,13 @@ class AuthorizationServiceInitializer implements InitializerInterface { /** - * @param ContainerInterface $container - * @param object $instance + * {@inheritDoc} */ - public function __invoke(ContainerInterface $container, $instance) + public function __invoke(ContainerInterface $container, $instance): void { if ($instance instanceof AuthorizationServiceAwareInterface) { - $authorizationService = $container->get('LmcRbacMvc\Service\AuthorizationService'); + $authorizationService = $container->get(\LmcRbacMvc\Service\AuthorizationService::class); $instance->setAuthorizationService($authorizationService); } } - - /** - * @see \Laminas\ServiceManager\Initializer\InitializerInterface::initialize() - */ - public function initialize($instance, ServiceLocatorInterface $serviceLocator) - { - if ($serviceLocator instanceof AbstractPluginManager) { - $serviceLocator = $serviceLocator->getServiceLocator(); - } - - $this($serviceLocator, $instance); - } } diff --git a/src/Module.php b/src/Module.php index b8fe223f..60197ddf 100644 --- a/src/Module.php +++ b/src/Module.php @@ -35,7 +35,7 @@ class Module implements BootstrapListenerInterface, ConfigProviderInterface /** * {@inheritDoc} */ - public function onBootstrap(EventInterface $event) + public function onBootstrap(EventInterface $event): void { /* @var Application $application */ $application = $event->getTarget(); diff --git a/src/Mvc/Controller/Plugin/IsGranted.php b/src/Mvc/Controller/Plugin/IsGranted.php index 1f55b67f..2f90ba99 100644 --- a/src/Mvc/Controller/Plugin/IsGranted.php +++ b/src/Mvc/Controller/Plugin/IsGranted.php @@ -29,10 +29,7 @@ */ class IsGranted extends AbstractPlugin { - /** - * @var AuthorizationServiceInterface - */ - private $authorizationService; + private AuthorizationServiceInterface $authorizationService; /** * Constructor @@ -47,11 +44,11 @@ public function __construct(AuthorizationServiceInterface $authorizationService) /** * Check against the given permission * - * @param string $permission - * @param mixed $context + * @param string $permission + * @param mixed|null $context * @return bool */ - public function __invoke($permission, $context = null) + public function __invoke(string $permission, mixed $context = null): bool { return $this->authorizationService->isGranted($permission, $context); } diff --git a/src/Options/ModuleOptions.php b/src/Options/ModuleOptions.php index ac4f87ac..85b2d77f 100644 --- a/src/Options/ModuleOptions.php +++ b/src/Options/ModuleOptions.php @@ -32,59 +32,43 @@ class ModuleOptions extends AbstractOptions { /** * Key of the identity provider used to retrieve the identity - * - * @var string */ - protected $identityProvider = 'LmcRbacMvc\Identity\AuthenticationIdentityProvider'; + protected string $identityProvider = 'LmcRbacMvc\Identity\AuthenticationIdentityProvider'; /** * Guest role (used when no identity is found) - * - * @var string */ - protected $guestRole = 'guest'; + protected string $guestRole = 'guest'; /** * Guards - * - * @var array */ - protected $guards = []; + protected array $guards = []; /** * Assertion map - * - * @var array */ - protected $assertionMap = []; + protected array $assertionMap = []; /** * Protection policy for guards (can be "deny" or "allow") - * - * @var string */ - protected $protectionPolicy = GuardInterface::POLICY_ALLOW; + protected string $protectionPolicy = GuardInterface::POLICY_ALLOW; /** * A configuration for role provider - * - * @var array */ - protected $roleProvider = []; + protected array $roleProvider = []; /** * Options for the unauthorized strategy - * - * @var UnauthorizedStrategyOptions|null */ - protected $unauthorizedStrategy; + protected ?UnauthorizedStrategyOptions $unauthorizedStrategy = null; /** * Options for the redirect strategy - * - * @var RedirectStrategyOptions|null */ - protected $redirectStrategy; + protected ?RedirectStrategyOptions $redirectStrategy = null; /** * Constructor @@ -100,12 +84,12 @@ public function __construct($options = null) /** * Set the key of the identity provider used to retrieve the identity * - * @param string $identityProvider + * @param string $identityProvider * @return void */ - public function setIdentityProvider($identityProvider) + public function setIdentityProvider(string $identityProvider): void { - $this->identityProvider = (string) $identityProvider; + $this->identityProvider = $identityProvider; } /** @@ -113,7 +97,7 @@ public function setIdentityProvider($identityProvider) * * @return string */ - public function getIdentityProvider() + public function getIdentityProvider(): string { return $this->identityProvider; } @@ -124,7 +108,7 @@ public function getIdentityProvider() * @param array $assertionMap * @return void */ - public function setAssertionMap(array $assertionMap) + public function setAssertionMap(array $assertionMap): void { $this->assertionMap = $assertionMap; } @@ -134,7 +118,7 @@ public function setAssertionMap(array $assertionMap) * * @return array */ - public function getAssertionMap() + public function getAssertionMap(): array { return $this->assertionMap; } @@ -145,9 +129,9 @@ public function getAssertionMap() * @param string $guestRole * @return void */ - public function setGuestRole($guestRole) + public function setGuestRole(string $guestRole): void { - $this->guestRole = (string) $guestRole; + $this->guestRole = $guestRole; } /** @@ -155,7 +139,7 @@ public function setGuestRole($guestRole) * * @return string */ - public function getGuestRole() + public function getGuestRole(): string { return $this->guestRole; } @@ -166,7 +150,7 @@ public function getGuestRole() * @param array $guards * @return void */ - public function setGuards(array $guards) + public function setGuards(array $guards): void { $this->guards = $guards; } @@ -176,7 +160,7 @@ public function setGuards(array $guards) * * @return array */ - public function getGuards() + public function getGuards(): array { return $this->guards; } @@ -184,11 +168,11 @@ public function getGuards() /** * Set the protection policy for guards * - * @param string $protectionPolicy - * @throws Exception\RuntimeException + * @param string $protectionPolicy * @return void + *@throws Exception\RuntimeException */ - public function setProtectionPolicy($protectionPolicy) + public function setProtectionPolicy(string $protectionPolicy): void { if ($protectionPolicy !== GuardInterface::POLICY_ALLOW && $protectionPolicy !== GuardInterface::POLICY_DENY) { throw new Exception\RuntimeException(sprintf( @@ -205,7 +189,7 @@ public function setProtectionPolicy($protectionPolicy) * * @return string */ - public function getProtectionPolicy() + public function getProtectionPolicy(): string { return $this->protectionPolicy; } @@ -216,7 +200,7 @@ public function getProtectionPolicy() * @param array $roleProvider * @throws Exception\RuntimeException */ - public function setRoleProvider(array $roleProvider) + public function setRoleProvider(array $roleProvider): void { if (count($roleProvider) > 1) { throw new Exception\RuntimeException( @@ -232,7 +216,7 @@ public function setRoleProvider(array $roleProvider) * * @return array */ - public function getRoleProvider() + public function getRoleProvider(): array { return $this->roleProvider; } @@ -242,7 +226,7 @@ public function getRoleProvider() * * @param array $unauthorizedStrategy */ - public function setUnauthorizedStrategy(array $unauthorizedStrategy) + public function setUnauthorizedStrategy(array $unauthorizedStrategy): void { $this->unauthorizedStrategy = new UnauthorizedStrategyOptions($unauthorizedStrategy); } @@ -250,9 +234,9 @@ public function setUnauthorizedStrategy(array $unauthorizedStrategy) /** * Get the unauthorized strategy options * - * @return UnauthorizedStrategyOptions + * @return UnauthorizedStrategyOptions|null */ - public function getUnauthorizedStrategy() + public function getUnauthorizedStrategy(): ?UnauthorizedStrategyOptions { if (null === $this->unauthorizedStrategy) { $this->unauthorizedStrategy = new UnauthorizedStrategyOptions(); @@ -266,7 +250,7 @@ public function getUnauthorizedStrategy() * * @param array $redirectStrategy */ - public function setRedirectStrategy(array $redirectStrategy) + public function setRedirectStrategy(array $redirectStrategy): void { $this->redirectStrategy = new RedirectStrategyOptions($redirectStrategy); } @@ -274,9 +258,9 @@ public function setRedirectStrategy(array $redirectStrategy) /** * Get the redirect strategy options * - * @return RedirectStrategyOptions + * @return RedirectStrategyOptions|null */ - public function getRedirectStrategy() + public function getRedirectStrategy(): ?RedirectStrategyOptions { if (null === $this->redirectStrategy) { $this->redirectStrategy = new RedirectStrategyOptions(); diff --git a/src/Options/RedirectStrategyOptions.php b/src/Options/RedirectStrategyOptions.php index ddb2baf7..afe5abf6 100644 --- a/src/Options/RedirectStrategyOptions.php +++ b/src/Options/RedirectStrategyOptions.php @@ -30,52 +30,42 @@ class RedirectStrategyOptions extends AbstractOptions { /** * Should the user be redirected when connected and not authorized - * - * @var bool */ - protected $redirectWhenConnected = true; + protected bool $redirectWhenConnected = true; /** * The name of the route to redirect when a user is connected and not authorized - * - * @var string */ - protected $redirectToRouteConnected = 'home'; + protected string $redirectToRouteConnected = 'home'; /** * The name of the route to redirect when a user is disconnected and not authorized - * - * @var string */ - protected $redirectToRouteDisconnected = 'login'; + protected string $redirectToRouteDisconnected = 'login'; /** * Should the previous URI should be appended as a query param? - * - * @var bool */ - protected $appendPreviousUri = true; + protected bool $appendPreviousUri = true; /** * If appendPreviousUri is enabled, key to use in query params that hold the previous URI - * - * @var string */ - protected $previousUriQueryKey = 'redirectTo'; + protected string $previousUriQueryKey = 'redirectTo'; /** * @param bool $redirectWhenConnected * @return void */ - public function setRedirectWhenConnected($redirectWhenConnected) + public function setRedirectWhenConnected(bool $redirectWhenConnected): void { - $this->redirectWhenConnected = (bool) $redirectWhenConnected; + $this->redirectWhenConnected = $redirectWhenConnected; } /** * @return bool */ - public function getRedirectWhenConnected() + public function getRedirectWhenConnected(): bool { return $this->redirectWhenConnected; } @@ -84,15 +74,15 @@ public function getRedirectWhenConnected() * @param string $redirectToRouteConnected * @return void */ - public function setRedirectToRouteConnected($redirectToRouteConnected) + public function setRedirectToRouteConnected(string $redirectToRouteConnected): void { - $this->redirectToRouteConnected = (string) $redirectToRouteConnected; + $this->redirectToRouteConnected = $redirectToRouteConnected; } /** * @return string */ - public function getRedirectToRouteConnected() + public function getRedirectToRouteConnected(): string { return $this->redirectToRouteConnected; } @@ -101,15 +91,15 @@ public function getRedirectToRouteConnected() * @param string $redirectToRouteDisconnected * @return void */ - public function setRedirectToRouteDisconnected($redirectToRouteDisconnected) + public function setRedirectToRouteDisconnected(string $redirectToRouteDisconnected): void { - $this->redirectToRouteDisconnected = (string) $redirectToRouteDisconnected; + $this->redirectToRouteDisconnected = $redirectToRouteDisconnected; } /** * @return string */ - public function getRedirectToRouteDisconnected() + public function getRedirectToRouteDisconnected(): string { return $this->redirectToRouteDisconnected; } @@ -117,15 +107,15 @@ public function getRedirectToRouteDisconnected() /** * @param boolean $appendPreviousUri */ - public function setAppendPreviousUri($appendPreviousUri) + public function setAppendPreviousUri(bool $appendPreviousUri): void { - $this->appendPreviousUri = (bool) $appendPreviousUri; + $this->appendPreviousUri = $appendPreviousUri; } /** * @return boolean */ - public function getAppendPreviousUri() + public function getAppendPreviousUri(): bool { return $this->appendPreviousUri; } @@ -133,15 +123,15 @@ public function getAppendPreviousUri() /** * @param string $previousUriQueryKey */ - public function setPreviousUriQueryKey($previousUriQueryKey) + public function setPreviousUriQueryKey(string $previousUriQueryKey): void { - $this->previousUriQueryKey = (string) $previousUriQueryKey; + $this->previousUriQueryKey = $previousUriQueryKey; } /** * @return string */ - public function getPreviousUriQueryKey() + public function getPreviousUriQueryKey(): string { return $this->previousUriQueryKey; } diff --git a/src/Options/UnauthorizedStrategyOptions.php b/src/Options/UnauthorizedStrategyOptions.php index 6f3ef396..c86baabd 100644 --- a/src/Options/UnauthorizedStrategyOptions.php +++ b/src/Options/UnauthorizedStrategyOptions.php @@ -30,23 +30,21 @@ class UnauthorizedStrategyOptions extends AbstractOptions { /** * Template to use - * - * @var string */ - protected $template = 'error/403'; + protected string $template = 'error/403'; /** * @param string $template */ - public function setTemplate($template) + public function setTemplate(string $template): void { - $this->template = (string) $template; + $this->template = $template; } /** * @return string */ - public function getTemplate() + public function getTemplate(): string { return $this->template; } diff --git a/src/Permission/PermissionInterface.php b/src/Permission/PermissionInterface.php index 056d2eed..a4148757 100644 --- a/src/Permission/PermissionInterface.php +++ b/src/Permission/PermissionInterface.php @@ -26,6 +26,7 @@ * * @author Michaël Gallego * @license MIT + * @deprecated * TODO Remove deprecated interface */ interface PermissionInterface diff --git a/src/Rbac/Rbac.php b/src/Rbac/Rbac.php index bd9a50d6..4f481998 100644 --- a/src/Rbac/Rbac.php +++ b/src/Rbac/Rbac.php @@ -9,6 +9,9 @@ use Laminas\Permissions\Rbac\AssertionInterface; use Laminas\Permissions\Rbac\Exception; +/** + * @deprecated + */ class Rbac extends LaminasRbac{ /** * Return all the roles @@ -80,4 +83,4 @@ public function hasRole($role): bool return parent::hasRole($role); } -} \ No newline at end of file +} diff --git a/src/Role/InMemoryRoleProvider.php b/src/Role/InMemoryRoleProvider.php index 47eee89e..902e8151 100644 --- a/src/Role/InMemoryRoleProvider.php +++ b/src/Role/InMemoryRoleProvider.php @@ -19,6 +19,7 @@ namespace LmcRbacMvc\Role; use Laminas\Permissions\Rbac\RoleInterface; +use Laminas\Permissions\Rbac\Role; /** * Simple role providers that store them in memory (ideal for small websites) @@ -42,20 +43,16 @@ class InMemoryRoleProvider implements RoleProviderInterface { /** * Role storage - * - * @var array */ - private $roles = []; + private array $roles = []; /** * Roles config - * - * @var array */ - private $rolesConfig = []; + private array $rolesConfig = []; /** - * @param array + * @param array $rolesConfig */ public function __construct(array $rolesConfig) { @@ -65,7 +62,7 @@ public function __construct(array $rolesConfig) /** * {@inheritDoc} */ - public function getRoles(array $roleNames) + public function getRoles(array $roleNames): array { $roles = []; @@ -79,9 +76,9 @@ public function getRoles(array $roleNames) * Get role by role name * * @param $roleName - * @return RoleInterface + * @return RoleInterface|Role */ - protected function getRole($roleName) + protected function getRole($roleName): RoleInterface|Role { if (isset($this->roles[$roleName])) { return $this->roles[$roleName]; @@ -107,7 +104,7 @@ protected function getRole($roleName) $role = new Role($roleName); } - $permissions = isset($roleConfig['permissions']) ? $roleConfig['permissions'] : []; + $permissions = $roleConfig['permissions'] ?? []; foreach ($permissions as $permission) { $role->addPermission($permission); } diff --git a/src/Role/ObjectRepositoryRoleProvider.php b/src/Role/ObjectRepositoryRoleProvider.php index 7758fb79..b539f2f3 100644 --- a/src/Role/ObjectRepositoryRoleProvider.php +++ b/src/Role/ObjectRepositoryRoleProvider.php @@ -29,28 +29,20 @@ */ class ObjectRepositoryRoleProvider implements RoleProviderInterface { - /** - * @var ObjectRepository - */ - private $objectRepository; - /** - * @var string - */ - private $roleNameProperty; + private ObjectRepository $objectRepository; - /** - * @var array - */ - private $roleCache = []; + private string $roleNameProperty; + + private array $roleCache = []; /** * Constructor * * @param ObjectRepository $objectRepository - * @param string $roleNameProperty + * @param string $roleNameProperty */ - public function __construct(ObjectRepository $objectRepository, $roleNameProperty) + public function __construct(ObjectRepository $objectRepository, string $roleNameProperty) { $this->objectRepository = $objectRepository; $this->roleNameProperty = $roleNameProperty; @@ -61,7 +53,7 @@ public function __construct(ObjectRepository $objectRepository, $roleNamePropert * * @return void */ - public function clearRoleCache() + public function clearRoleCache(): void { $this->roleCache = []; } @@ -69,7 +61,7 @@ public function clearRoleCache() /** * {@inheritDoc} */ - public function getRoles(array $roleNames) + public function getRoles(array $roleNames): array { $key = implode($roleNames); diff --git a/src/Role/RecursiveRoleIterator.php b/src/Role/RecursiveRoleIterator.php index 469da604..ddb42eae 100644 --- a/src/Role/RecursiveRoleIterator.php +++ b/src/Role/RecursiveRoleIterator.php @@ -57,12 +57,11 @@ public function hasChildren() : bool if (!$current instanceof RoleInterface) { return false; } - - return $current->hasChildren(); + return !empty($current->getChildren()); } - + /** - * @return RecursiveRoleIterator + * @return RecursiveRoleIterator|null */ public function getChildren() :? RecursiveRoleIterator { diff --git a/src/Role/RecursiveRoleIteratorStrategy.php b/src/Role/RecursiveRoleIteratorStrategy.php index 86632e34..95453347 100644 --- a/src/Role/RecursiveRoleIteratorStrategy.php +++ b/src/Role/RecursiveRoleIteratorStrategy.php @@ -20,6 +20,7 @@ use Laminas\Permissions\Rbac\RoleInterface; use RecursiveIteratorIterator; +use Traversable; /** * Create a {@link RecursiveRoleIterator} and wrap it into a {@link RecursiveIteratorIterator} @@ -27,10 +28,10 @@ class RecursiveRoleIteratorStrategy implements TraversalStrategyInterface { /** - * @param RoleInterface[] $roles + * @param RoleInterface[]|Traversable $roles * @return RecursiveIteratorIterator */ - public function getRolesIterator($roles) + public function getRolesIterator(Traversable|array $roles): Traversable { return new RecursiveIteratorIterator( new RecursiveRoleIterator($roles), diff --git a/src/Role/Role.php b/src/Role/Role.php deleted file mode 100644 index 7e636160..00000000 --- a/src/Role/Role.php +++ /dev/null @@ -1,52 +0,0 @@ -children instanceof \Doctrine\ORM\PersistentCollection ) - return $this->children->toArray(); - else - return array_values($this->children); - } - - /** - * Get the parent roles. - * - * @return RoleInterface[] - */ - public function getParents(): array - { - return $this->parents; - } - - /** - * {@inheritDoc} - */ - public function hasChildren() - { - return !empty($this->children); - } - - /** - * Check if a role is a descendant. - */ - protected function hasDescendant(RoleInterface $role): bool - { - if(empty($this->children)) - $this->children = []; - - return parent::hasDescendant($role); - } -} \ No newline at end of file diff --git a/src/Role/RoleProviderInterface.php b/src/Role/RoleProviderInterface.php index f0272d46..a4585786 100644 --- a/src/Role/RoleProviderInterface.php +++ b/src/Role/RoleProviderInterface.php @@ -23,7 +23,7 @@ /** * A role provider is an object that collect roles from string and convert them to RoleInterface instances * - * Data can come from anywhere. ZfcRbac is bundled with two providers that allow to load roles from database + * Data can come from anywhere. LmcRbacMvc is bundled with two providers that allow to load roles from database * or from memory * * @author Michaël Gallego @@ -37,5 +37,5 @@ interface RoleProviderInterface * @param string[] $roleNames * @return RoleInterface[] */ - public function getRoles(array $roleNames); + public function getRoles(array $roleNames): array; } diff --git a/src/Role/RoleProviderPluginManager.php b/src/Role/RoleProviderPluginManager.php index cdd83419..d3a00c68 100644 --- a/src/Role/RoleProviderPluginManager.php +++ b/src/Role/RoleProviderPluginManager.php @@ -32,10 +32,7 @@ */ class RoleProviderPluginManager extends AbstractPluginManager { - /** - * @var array - */ - protected $invokableClasses = [ + protected array $invokableClasses = [ 'LmcRbacMvc\Role\InMemoryRoleProvider' => InMemoryRoleProvider::class, ]; @@ -49,32 +46,15 @@ class RoleProviderPluginManager extends AbstractPluginManager /** * {@inheritDoc} */ - public function validate($plugin) + public function validate($instance): void { - if ($plugin instanceof RoleProviderInterface) { + if ($instance instanceof RoleProviderInterface) { return; // we're okay } throw new Exception\RuntimeException(sprintf( 'Role provider must implement "LmcRbacMvc\Role\RoleProviderInterface", but "%s" was given', - is_object($plugin) ? get_class($plugin) : gettype($plugin) + is_object($instance) ? get_class($instance) : gettype($instance) )); } - - /** - * {@inheritDoc} - * @throws \Interop\Container\Exception\ContainerException - */ - public function validatePlugin($plugin) - { - $this->validate($plugin); - } - - /** - * {@inheritDoc} - */ - protected function canonicalizeName($name) - { - return $name; - } } diff --git a/src/Role/TraversalStrategyInterface.php b/src/Role/TraversalStrategyInterface.php index 8ea0b0da..4b5ff967 100644 --- a/src/Role/TraversalStrategyInterface.php +++ b/src/Role/TraversalStrategyInterface.php @@ -27,8 +27,8 @@ interface TraversalStrategyInterface { /** - * @param RoleInterface[]|Traversable + * @param Traversable|RoleInterface[] $roles * @return Traversable */ - public function getRolesIterator($roles); + public function getRolesIterator(Traversable|array $roles): Traversable; } diff --git a/src/Service/AuthorizationService.php b/src/Service/AuthorizationService.php index 58672ab8..ced6f83f 100644 --- a/src/Service/AuthorizationService.php +++ b/src/Service/AuthorizationService.php @@ -18,7 +18,7 @@ namespace LmcRbacMvc\Service; -use LmcRbacMvc\Rbac\Rbac; +use Laminas\Permissions\Rbac\Rbac; use LmcRbacMvc\Permission\PermissionInterface; use LmcRbacMvc\Assertion\AssertionPluginManager; use LmcRbacMvc\Assertion\AssertionInterface; @@ -37,22 +37,22 @@ class AuthorizationService implements AuthorizationServiceInterface /** * @var Rbac */ - protected $rbac; + protected Rbac $rbac; /** * @var RoleService */ - protected $roleService; + protected RoleService $roleService; /** * @var AssertionPluginManager */ - protected $assertionPluginManager; + protected AssertionPluginManager $assertionPluginManager; /** * @var array */ - protected $assertions = []; + protected array $assertions = []; /** * Constructor @@ -71,11 +71,11 @@ public function __construct(Rbac $rbac, RoleService $roleService, AssertionPlugi /** * Set an assertion * - * @param string|PermissionInterface $permission - * @param string|callable|AssertionInterface $assertion + * @param string|PermissionInterface $permission + * @param callable|string|AssertionInterface $assertion * @return void */ - public function setAssertion($permission, $assertion) + public function setAssertion(PermissionInterface|string $permission, callable|AssertionInterface|string $assertion): void { $this->assertions[(string) $permission] = $assertion; } @@ -86,7 +86,7 @@ public function setAssertion($permission, $assertion) * @param array $assertions * @return void */ - public function setAssertions(array $assertions) + public function setAssertions(array $assertions): void { $this->assertions = $assertions; } @@ -97,7 +97,7 @@ public function setAssertions(array $assertions) * @param string|PermissionInterface $permission * @return bool */ - public function hasAssertion($permission) + public function hasAssertion(PermissionInterface|string $permission): bool { return isset($this->assertions[(string) $permission]); } @@ -107,7 +107,7 @@ public function hasAssertion($permission) * * @return IdentityInterface|null */ - public function getIdentity() + public function getIdentity(): ?IdentityInterface { return $this->roleService->getIdentity(); } @@ -115,21 +115,25 @@ public function getIdentity() /** * Check if the permission is granted to the current identity * - * @param string|PermissionInterface $permission - * @param mixed $context + * @param string $permission + * @param mixed|null $context * @return bool */ - public function isGranted($permission, $context = null) + public function isGranted(string $permission, mixed $context = null): bool { $roles = $this->roleService->getIdentityRoles(); // var_dump(__METHOD__,$roles); if (empty($roles)) { return false; } -// var_dump('Checking IsGranted by Rbac class'); - if (!$this->rbac->isGranted($roles, $permission)) { - return false; + // Iterate through roles + $allowed = false; + foreach ($roles as $role) { + if ($this->rbac->isGranted($role, $permission)) { + $allowed = true; + } } + if (!$allowed) return false; if ($this->hasAssertion($permission)) { return $this->assert($this->assertions[(string) $permission], $context); @@ -139,12 +143,12 @@ public function isGranted($permission, $context = null) } /** - * @param string|callable|AssertionInterface $assertion - * @param mixed $context + * @param callable|string|AssertionInterface $assertion + * @param mixed|null $context * @return bool * @throws Exception\InvalidArgumentException If an invalid assertion is passed */ - protected function assert($assertion, $context = null) + protected function assert(callable|AssertionInterface|string $assertion, mixed $context = null): bool { if (is_callable($assertion)) { return $assertion($this, $context); diff --git a/src/Service/AuthorizationServiceAwareInterface.php b/src/Service/AuthorizationServiceAwareInterface.php index b5d05178..917226fe 100644 --- a/src/Service/AuthorizationServiceAwareInterface.php +++ b/src/Service/AuthorizationServiceAwareInterface.php @@ -31,5 +31,5 @@ interface AuthorizationServiceAwareInterface * @param AuthorizationService $authorizationService * @return void */ - public function setAuthorizationService(AuthorizationService $authorizationService); + public function setAuthorizationService(AuthorizationService $authorizationService): void; } diff --git a/src/Service/AuthorizationServiceAwareTrait.php b/src/Service/AuthorizationServiceAwareTrait.php index 1766fafa..feabdae2 100644 --- a/src/Service/AuthorizationServiceAwareTrait.php +++ b/src/Service/AuthorizationServiceAwareTrait.php @@ -29,9 +29,9 @@ trait AuthorizationServiceAwareTrait /** * The AuthorizationService * - * @var AuthorizationService + * @var AuthorizationService|null */ - protected $authorizationService; + protected ?AuthorizationService $authorizationService = null; /** * Set the AuthorizationService @@ -41,7 +41,7 @@ trait AuthorizationServiceAwareTrait * @param AuthorizationService $authorizationService * @return void */ - public function setAuthorizationService(AuthorizationService $authorizationService) + public function setAuthorizationService(AuthorizationService $authorizationService): void { $this->authorizationService = $authorizationService; } @@ -49,9 +49,9 @@ public function setAuthorizationService(AuthorizationService $authorizationServi /** * Return the AuthorizationService * - * @return AuthorizationService + * @return AuthorizationService|null */ - public function getAuthorizationService() + public function getAuthorizationService(): ?AuthorizationService { return $this->authorizationService; } diff --git a/src/Service/AuthorizationServiceInterface.php b/src/Service/AuthorizationServiceInterface.php index 2e395da1..e306ff1a 100644 --- a/src/Service/AuthorizationServiceInterface.php +++ b/src/Service/AuthorizationServiceInterface.php @@ -18,8 +18,6 @@ namespace LmcRbacMvc\Service; -use Rbac\Permission\PermissionInterface; - /** * Minimal interface for an authorization service * @@ -31,9 +29,9 @@ interface AuthorizationServiceInterface /** * Check if the permission is granted to the current identity * - * @param string|PermissionInterface $permission - * @param mixed $context + * @param string $permission + * @param mixed|null $context * @return bool */ - public function isGranted($permission, $context = null); + public function isGranted(string $permission, mixed $context = null): bool; } diff --git a/src/Service/RoleService.php b/src/Service/RoleService.php index 211eeeb3..aecd0d27 100644 --- a/src/Service/RoleService.php +++ b/src/Service/RoleService.php @@ -34,25 +34,13 @@ */ class RoleService { - /** - * @var IdentityProviderInterface - */ - protected $identityProvider; + protected IdentityProviderInterface $identityProvider; - /** - * @var RoleProviderInterface - */ - protected $roleProvider; + protected RoleProviderInterface $roleProvider; - /** - * @var TraversalStrategyInterface - */ - protected $traversalStrategy; + protected TraversalStrategyInterface $traversalStrategy; - /** - * @var string - */ - protected $guestRole = ''; + protected string $guestRole = ''; /** * Constructor @@ -76,7 +64,7 @@ public function __construct( * * @param IdentityProviderInterface $identityProvider */ - public function setIdentityProvider(IdentityProviderInterface $identityProvider) + public function setIdentityProvider(IdentityProviderInterface $identityProvider): void { $this->identityProvider = $identityProvider; } @@ -86,7 +74,7 @@ public function setIdentityProvider(IdentityProviderInterface $identityProvider) * * @param RoleProviderInterface $roleProvider */ - public function setRoleProvider(RoleProviderInterface $roleProvider) + public function setRoleProvider(RoleProviderInterface $roleProvider): void { $this->roleProvider = $roleProvider; } @@ -94,10 +82,10 @@ public function setRoleProvider(RoleProviderInterface $roleProvider) /** * Set the guest role * - * @param string $guestRole + * @param string $guestRole * @return void */ - public function setGuestRole($guestRole) + public function setGuestRole(string $guestRole): void { $this->guestRole = (string) $guestRole; } @@ -107,7 +95,7 @@ public function setGuestRole($guestRole) * * @return string */ - public function getGuestRole() + public function getGuestRole(): string { return $this->guestRole; } @@ -117,7 +105,7 @@ public function getGuestRole() * * @return IdentityInterface|null */ - public function getIdentity() + public function getIdentity(): ?IdentityInterface { return $this->identityProvider->getIdentity(); } @@ -128,7 +116,7 @@ public function getIdentity() * @return RoleInterface[] * @throws Exception\RuntimeException */ - public function getIdentityRoles() + public function getIdentityRoles(): array { if (!$identity = $this->getIdentity()) { return $this->convertRoles([$this->guestRole]); @@ -152,7 +140,7 @@ public function getIdentityRoles() * @param string[]|RoleInterface[] $roles * @return bool */ - public function matchIdentityRoles(array $roles) + public function matchIdentityRoles(array $roles): bool { $identityRoles = $this->getIdentityRoles(); @@ -178,7 +166,7 @@ public function matchIdentityRoles(array $roles) * @param array|Traversable $roles * @return RoleInterface[] */ - protected function convertRoles($roles) + protected function convertRoles($roles): array { if ($roles instanceof Traversable) { $roles = iterator_to_array($roles); @@ -215,7 +203,7 @@ protected function convertRoles($roles) * @param array|RoleInterface[] $roles * @return string[] */ - protected function flattenRoles(array $roles) + protected function flattenRoles(array $roles): array { $roleNames = []; $iterator = $this->traversalStrategy->getRolesIterator($roles); diff --git a/src/View/Helper/HasRole.php b/src/View/Helper/HasRole.php index 6d894914..afc66908 100644 --- a/src/View/Helper/HasRole.php +++ b/src/View/Helper/HasRole.php @@ -29,10 +29,7 @@ */ class HasRole extends AbstractHelper { - /** - * @var RoleService - */ - private $roleService; + private RoleService $roleService; /** * Constructor @@ -48,7 +45,7 @@ public function __construct(RoleService $roleService) * @param string|string[] $roleOrRoles * @return bool */ - public function __invoke($roleOrRoles) + public function __invoke(array|string $roleOrRoles): bool { return $this->roleService->matchIdentityRoles((array)$roleOrRoles); } diff --git a/src/View/Helper/IsGranted.php b/src/View/Helper/IsGranted.php index f0f9df97..4c8ead0b 100644 --- a/src/View/Helper/IsGranted.php +++ b/src/View/Helper/IsGranted.php @@ -29,10 +29,7 @@ */ class IsGranted extends AbstractHelper { - /** - * @var AuthorizationServiceInterface - */ - private $authorizationService; + private AuthorizationServiceInterface $authorizationService; /** * Constructor @@ -47,11 +44,11 @@ public function __construct(AuthorizationServiceInterface $authorizationService) /** * Check against the given permission * - * @param string $permission - * @param mixed $context + * @param string $permission + * @param mixed|null $context * @return bool */ - public function __invoke($permission, $context = null) + public function __invoke(string $permission, mixed $context = null): bool { return $this->authorizationService->isGranted($permission, $context); } diff --git a/src/View/Strategy/AbstractStrategy.php b/src/View/Strategy/AbstractStrategy.php index e78ae601..d76dc76b 100644 --- a/src/View/Strategy/AbstractStrategy.php +++ b/src/View/Strategy/AbstractStrategy.php @@ -33,7 +33,7 @@ abstract class AbstractStrategy extends AbstractListenerAggregate /** * {@inheritDoc} */ - public function attach(EventManagerInterface $events, $priority = 1) + public function attach(EventManagerInterface $events, $priority = 1): void { $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this, 'onError'], $priority); } @@ -43,5 +43,5 @@ public function attach(EventManagerInterface $events, $priority = 1) * @param MvcEvent $event * @return void */ - abstract public function onError(MvcEvent $event); + abstract public function onError(MvcEvent $event): void; } diff --git a/src/View/Strategy/RedirectStrategy.php b/src/View/Strategy/RedirectStrategy.php index 49503ecb..bbbb3c61 100644 --- a/src/View/Strategy/RedirectStrategy.php +++ b/src/View/Strategy/RedirectStrategy.php @@ -32,15 +32,9 @@ */ class RedirectStrategy extends AbstractStrategy { - /** - * @var RedirectStrategyOptions - */ - protected $options; + protected RedirectStrategyOptions $options; - /** - * @var AuthenticationServiceInterface - */ - protected $authenticationService; + protected AuthenticationServiceInterface $authenticationService; /** * Constructor @@ -59,7 +53,7 @@ public function __construct(RedirectStrategyOptions $options, AuthenticationServ * @param MvcEvent $event * @return void */ - public function onError(MvcEvent $event) + public function onError(MvcEvent $event): void { // Do nothing if no error or if response is not HTTP response if (!($event->getParam('exception') instanceof UnauthorizedExceptionInterface) diff --git a/src/View/Strategy/UnauthorizedStrategy.php b/src/View/Strategy/UnauthorizedStrategy.php index 26b16b5d..980d943b 100644 --- a/src/View/Strategy/UnauthorizedStrategy.php +++ b/src/View/Strategy/UnauthorizedStrategy.php @@ -33,10 +33,7 @@ */ class UnauthorizedStrategy extends AbstractStrategy { - /** - * @var UnauthorizedStrategyOptions - */ - protected $options; + protected UnauthorizedStrategyOptions $options; /** * Constructor @@ -53,7 +50,7 @@ public function __construct(UnauthorizedStrategyOptions $options) * @param MvcEvent $event * @return void */ - public function onError(MvcEvent $event) + public function onError(MvcEvent $event): void { // Do nothing if no error or if response is not HTTP response if (!($event->getParam('exception') instanceof UnauthorizedExceptionInterface) diff --git a/tests/Asset/DummyGuard.php b/tests/Asset/DummyGuard.php index 7e93f011..9b5e2a84 100644 --- a/tests/Asset/DummyGuard.php +++ b/tests/Asset/DummyGuard.php @@ -28,7 +28,7 @@ class DummyGuard extends AbstractGuard * * @return bool */ - public function isGranted(MvcEvent $event) + public function isGranted(MvcEvent $event): bool { return false; } diff --git a/tests/Asset/FlatRole.php b/tests/Asset/FlatRole.php deleted file mode 100644 index 5c8edccc..00000000 --- a/tests/Asset/FlatRole.php +++ /dev/null @@ -1,89 +0,0 @@ -name = (string) $name; - $this->permissions = new ArrayCollection(); - } - - /** - * Get the role identifier - * - * @return int - */ - public function getId() - { - return $this->id; - } - - /** - * Add a permission - * - * @param PermissionInterface|string $permission - * @return void - */ - public function addPermission($permission):void - { - if (is_string($permission)) { - $name = $permission; - $permission = new Permission($name); - } - - $this->permissions[$permission->getName()] = $permission; - } -} diff --git a/tests/Asset/HierarchicalRole.php b/tests/Asset/FlatRole.php.dist similarity index 52% rename from tests/Asset/HierarchicalRole.php rename to tests/Asset/FlatRole.php.dist index 2b91de45..1bcce790 100644 --- a/tests/Asset/HierarchicalRole.php +++ b/tests/Asset/FlatRole.php.dist @@ -19,45 +19,49 @@ namespace LmcRbacMvcTest\Asset; use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; +use Laminas\Permissions\Rbac\RoleInterface; use Doctrine\ORM\Mapping as ORM; -use LmcRbacMvc\Permission\PermissionInterface; -use LmcRbacMvc\Role\Role as BaseHierarchicalRole; + +/** + * There is no specific implementation of a flot role. + * A flot role is a simple utilization of the Laminas\Permission\Rbac\Role without children + */ + /** * @ORM\Entity - * @ORM\Table(name="hierarchical_roles") + * @ORM\Table(name="flat_roles") */ -class HierarchicalRole extends BaseHierarchicalRole +#[ORM\Entity] +#[ORM\Table(name:"flat_roles")] +class FlatRole implements RoleInterface { /** * @var int|null * * @ORM\Id * @ORM\Column(type="integer") - * @ORM\GeneratedValue(strategy="AUTO") + * @ORM\GeneratedValue */ - protected $id; + #[ORM\Id] + #[ORM\Column(type:"integer")] + #[ORM\GeneratedValue] + private ?int $id; /** * @var string|null - * * @ORM\Column(type="string", length=32, unique=true) */ - protected $name; - - /** - * @var \Laminas\Permissions\Rbac\RoleInterface[]|\Doctrine\Common\Collections\Collection - * - * @ORM\ManyToMany(targetEntity="HierarchicalRole") - */ - protected $children; + #[ORM\Column(type:"string", length:32, unique:true)] + protected ?string $name; /** - * @var PermissionInterface[]|\Doctrine\Common\Collections\Collection - * - * @ORM\ManyToMany(targetEntity="Permission", indexBy="name", fetch="EAGER") + * @var Collection + * @ORM\ManyToMany(targetEntity="Permission", indexBy="name", cascade={"persist"}, fetch="EAGER") */ - protected $permissions; + #[ORM\ManyToMany(targetEntity: "Permission", cascade: ["persist"], fetch: "EAGER", indexBy: "name")] + protected Collection $permissions; /** * Init the Doctrine collection @@ -71,9 +75,9 @@ public function __construct($name) /** * Get the role identifier * - * @return int + * @return int|null */ - public function getId() + public function getId(): ?int { return $this->id; } @@ -81,16 +85,43 @@ public function getId() /** * Add a permission * - * @param PermissionInterface|string $permission + * @param string $name * @return void */ - public function addPermission($permission):void + public function addPermission(string $name):void + { + $permission = new Permission($name); + + $this->permissions[$name] = $permission; + } + + public function getName(): string { - if (is_string($permission)) { - $name = $permission; - $permission = new Permission($name); - } + return $this->name; + } + + public function hasPermission(string $name): bool + { + return isset($this->permissions[$name]); + } + + public function addChild(RoleInterface $child): void + { + // Do nothing + } - $this->permissions[$permission->getName()] = $permission; + public function getChildren(): iterable + { + return []; + } + + public function addParent(RoleInterface $parent): void + { + // Do nothing + } + + public function getParents(): iterable + { + return []; } } diff --git a/tests/Asset/HierarchicalRole.php.dist b/tests/Asset/HierarchicalRole.php.dist new file mode 100644 index 00000000..c3a66691 --- /dev/null +++ b/tests/Asset/HierarchicalRole.php.dist @@ -0,0 +1,147 @@ +name = $name; + $this->children = new ArrayCollection(); + $this->permissions = new ArrayCollection(); + } + + /** + * Get the role identifier + * + * @return int|null + */ + public function getId(): ?int + { + return $this->id; + } + + /** + * Add a permission + * + * @param string $name + * @return void + */ + public function addPermission(string $name):void + { + $permission = new Permission($name); + + $this->permissions[$name] = $permission; + } + + public function getName(): string + { + return $this->name; + } + + public function hasPermission(string $name): bool + { + return isset($this->permissions[$name]); + } + + public function addChild(RoleInterface $child): void + { + $this->children[] = $child; + } + + public function getChildren(): iterable + { + return $this->children; + } + + public function addParent(RoleInterface $parent): void + { + // TODO: Implement addParent() method. + } + + public function getParents(): iterable + { + return []; + //return $this->parents; + } +} diff --git a/tests/Asset/Permission.php b/tests/Asset/Permission.php index 706c7ec4..650abbc1 100644 --- a/tests/Asset/Permission.php +++ b/tests/Asset/Permission.php @@ -25,23 +25,25 @@ * @ORM\Entity * @ORM\Table(name="permissions") */ +#[ORM\Entity] +#[ORM\Table(name:"permissions")] class Permission { /** - * @var int|null - * * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ - protected $id; + #[ORM\Id] + #[ORM\Column(type:"integer")] + #[ORM\GeneratedValue] + private ?int $id; /** - * @var string|null - * * @ORM\Column(type="string", length=32, unique=true) */ - protected $name; + #[ORM\Column(type:"string", length:32, unique:true)] + private ?string $name; /** * Constructor @@ -49,15 +51,14 @@ class Permission public function __construct($name) { $this->name = (string) $name; - $this->roles = new ArrayCollection(); } /** * Get the permission identifier * - * @return int + * @return int|null */ - public function getId() + public function getId(): ?int { return $this->id; } @@ -65,17 +66,17 @@ public function getId() /** * Get the permission name * - * @return string + * @return string|null */ - public function getName() + public function getName(): ?string { return $this->name; } /** - * {@inheritDoc} + * */ - public function __toString() + public function __toString(): string { return $this->getName(); } diff --git a/tests/Asset/Role.php b/tests/Asset/Role.php new file mode 100644 index 00000000..747affb9 --- /dev/null +++ b/tests/Asset/Role.php @@ -0,0 +1,148 @@ +name = $name; + $this->children = new ArrayCollection(); + $this->permissions = new ArrayCollection(); + } + + /** + * Get the role identifier + * + * @return int|null + */ + public function getId(): ?int + { + return $this->id; + } + + /** + * Add a permission + * + * @param string $name + * @return void + */ + public function addPermission(string $name):void + { + $permission = new Permission($name); + + $this->permissions[$name] = $permission; + } + + public function getName(): string + { + return $this->name; + } + + public function hasPermission(string $name): bool + { + return isset($this->permissions[$name]); + } + + public function addChild(RoleInterface $child): void + { + $this->children[] = $child; + } + + public function getChildren(): iterable + { + return $this->children; + } + + public function addParent(RoleInterface $parent): void + { + // TODO: Implement addParent() method. + } + + public function getParents(): iterable + { + return []; + //return $this->parents; + } +} diff --git a/tests/Asset/SimpleAssertion.php b/tests/Asset/SimpleAssertion.php index 2d78adbf..355ae1ff 100644 --- a/tests/Asset/SimpleAssertion.php +++ b/tests/Asset/SimpleAssertion.php @@ -26,12 +26,12 @@ class SimpleAssertion implements AssertionInterface /** * @var bool */ - protected $called = false; + protected bool $called = false; /** * {@inheritDoc} */ - public function assert(AuthorizationService $authorization, $context = false) + public function assert(AuthorizationService $authorizationService, $context = false): bool { $this->called = true; @@ -41,7 +41,7 @@ public function assert(AuthorizationService $authorization, $context = false) /** * @return bool */ - public function getCalled() + public function getCalled(): bool { return $this->called; } diff --git a/tests/Collector/RbacCollectorTest.php b/tests/Collector/RbacCollectorTest.php index 3efa2dae..d4aa219e 100644 --- a/tests/Collector/RbacCollectorTest.php +++ b/tests/Collector/RbacCollectorTest.php @@ -127,7 +127,7 @@ public function testCanCollect() 'permissions' => ['read'] ] ], - 'identity_role' => 'member' + 'identity_role' => ['member'] ]; //$serviceManager = $this->getMockBuilder('Laminas\ServiceManager\ServiceLocatorInterface')->getMock(); @@ -157,17 +157,6 @@ public function testCanCollect() $roleService = new RoleService($identityProvider, new InMemoryRoleProvider($dataToCollect['role_config']), new RecursiveRoleIteratorStrategy()); - /* - $serviceManager->expects($this->at(0)) - ->method('get') - ->with('LmcRbacMvc\Service\RoleService') - ->will($this->returnValue($roleService)); - - $serviceManager->expects($this->at(1)) - ->method('get') - ->with('LmcRbacMvc\Options\ModuleOptions') - ->will($this->returnValue(new ModuleOptions($dataToCollect['module_options']))); -*/ $serviceManager->setService('LmcRbacMvc\Service\RoleService', $roleService); $serviceManager->setService('LmcRbacMvc\Options\ModuleOptions', new ModuleOptions($dataToCollect['module_options'])); $collector = new RbacCollector(); diff --git a/tests/Factory/AssertionPluginManagerFactoryTest.php b/tests/Factory/AssertionPluginManagerFactoryTest.php index 5844ac47..f61e47b8 100644 --- a/tests/Factory/AssertionPluginManagerFactoryTest.php +++ b/tests/Factory/AssertionPluginManagerFactoryTest.php @@ -36,7 +36,7 @@ public function testFactory() ]); $factory = new AssertionPluginManagerFactory(); - $pluginManager = $factory->createService($serviceManager); + $pluginManager = $factory($serviceManager, 'LmcRbacMvc\Assertion\AssertionPluginManager'); $this->assertInstanceOf('LmcRbacMvc\Assertion\AssertionPluginManager', $pluginManager); } diff --git a/tests/Factory/AuthenticationIdentityProviderFactoryTest.php b/tests/Factory/AuthenticationIdentityProviderFactoryTest.php index 13be4acf..a9820be1 100644 --- a/tests/Factory/AuthenticationIdentityProviderFactoryTest.php +++ b/tests/Factory/AuthenticationIdentityProviderFactoryTest.php @@ -35,7 +35,7 @@ public function testFactory() ); $factory = new AuthenticationIdentityProviderFactory(); - $authenticationProvider = $factory->createService($serviceManager); + $authenticationProvider = $factory($serviceManager, 'LmcRbacMvc\Identity\AuthenticationIdentityProvider'); $this->assertInstanceOf('LmcRbacMvc\Identity\AuthenticationIdentityProvider', $authenticationProvider); } diff --git a/tests/Factory/AuthorizationServiceDelegatorTest.php b/tests/Factory/AuthorizationServiceDelegatorTest.php index 803cd969..f34341dd 100644 --- a/tests/Factory/AuthorizationServiceDelegatorTest.php +++ b/tests/Factory/AuthorizationServiceDelegatorTest.php @@ -61,7 +61,6 @@ public function testAuthorizationServiceIsNotInjectedWithoutDelegator() $serviceManager = ServiceManagerFactory::getServiceManager(); $serviceManager->setAllowOverride(true); -// $authorizationService = $this->getMock('LmcRbacMvc\Service\AuthorizationService', [], [], '', false); $authorizationService = $this->getMockBuilder('LmcRbacMvc\Service\AuthorizationService') ->disableOriginalConstructor() ->getMock(); diff --git a/tests/Factory/AuthorizationServiceFactoryTest.php b/tests/Factory/AuthorizationServiceFactoryTest.php index 67c7a7ab..6fa7d02b 100644 --- a/tests/Factory/AuthorizationServiceFactoryTest.php +++ b/tests/Factory/AuthorizationServiceFactoryTest.php @@ -18,20 +18,22 @@ namespace LmcRbacMvcTest\Factory; +use Laminas\Permissions\Rbac\Rbac; use Laminas\ServiceManager\ServiceManager; use LmcRbacMvc\Factory\AuthorizationServiceFactory; use LmcRbacMvc\Options\ModuleOptions; +use PHPUnit\Framework\TestCase; /** * @covers \LmcRbacMvc\Factory\AuthorizationServiceFactory */ -class AuthorizationServiceFactoryTest extends \PHPUnit\Framework\TestCase +class AuthorizationServiceFactoryTest extends TestCase { public function testFactory() { $serviceManager = new ServiceManager(); - $serviceManager->setService('Rbac\Rbac', $this->getMockBuilder(\LmcRbacMvc\Rbac\Rbac::class)->disableOriginalConstructor()->getMock()); + $serviceManager->setService('rbac', new Rbac()); $serviceManager->setService( 'LmcRbacMvc\Service\RoleService', @@ -48,8 +50,8 @@ public function testFactory() ); $factory = new AuthorizationServiceFactory(); - $authorizationService = $factory->createService($serviceManager); + $authorizationService = $factory($serviceManager, 'LmcRbacMvc\Service\AuthorizationService'); - $this->assertInstanceOf('LmcRbacMvc\Service\AuthorizationService', $authorizationService); + $this->assertInstanceOf(\LmcRbacMvc\Service\AuthorizationService::class, $authorizationService); } } diff --git a/tests/Factory/GuardPluginManagerFactoryTest.php b/tests/Factory/GuardPluginManagerFactoryTest.php index 4bfd0342..45d96081 100644 --- a/tests/Factory/GuardPluginManagerFactoryTest.php +++ b/tests/Factory/GuardPluginManagerFactoryTest.php @@ -37,7 +37,7 @@ public function testFactory() ]); $factory = new GuardPluginManagerFactory(); - $pluginManager = $factory->createService($serviceManager); + $pluginManager = $factory($serviceManager, GuardPluginManager::class); $this->assertInstanceOf(GuardPluginManager::class, $pluginManager); } diff --git a/tests/Factory/GuardsFactoryTest.php b/tests/Factory/GuardsFactoryTest.php index 3f9065f4..944a228d 100644 --- a/tests/Factory/GuardsFactoryTest.php +++ b/tests/Factory/GuardsFactoryTest.php @@ -66,7 +66,7 @@ public function testFactory() ); $factory = new GuardsFactory(); - $guards = $factory->createService($serviceManager); + $guards = $factory($serviceManager, ''); $this->assertIsArray($guards); @@ -89,7 +89,7 @@ public function testReturnArrayIfNoConfig() $serviceManager->setService('LmcRbacMvc\Options\ModuleOptions', $moduleOptions); $factory = new GuardsFactory(); - $guards = $factory->createService($serviceManager); + $guards = $factory($serviceManager, GuardsFactory::class); $this->assertIsArray($guards); diff --git a/tests/Factory/ModuleOptionsFactoryTest.php b/tests/Factory/ModuleOptionsFactoryTest.php index c52663f7..21421f30 100644 --- a/tests/Factory/ModuleOptionsFactoryTest.php +++ b/tests/Factory/ModuleOptionsFactoryTest.php @@ -18,6 +18,7 @@ namespace LmcRbacMvcTest\Factory; +use Laminas\ServiceManager\Exception\ServiceNotCreatedException; use Laminas\ServiceManager\ServiceManager; use LmcRbacMvc\Factory\ModuleOptionsFactory; @@ -34,8 +35,20 @@ public function testFactory() $serviceManager->setService('Config', $config); $factory = new ModuleOptionsFactory(); - $options = $factory->createService($serviceManager); + $options = $factory($serviceManager, 'LmcRbacMvc\Options\ModuleOptions' ); $this->assertInstanceOf('LmcRbacMvc\Options\ModuleOptions', $options); } + + public function testFactoryNotCreatedException() + { + $config = []; + + $serviceManager = new ServiceManager(); + $serviceManager->setService('Config', $config); + + $this->expectException(ServiceNotCreatedException::class); + $factory = new ModuleOptionsFactory(); + $options = $factory($serviceManager, 'LmcRbacMvc\Options\ModuleOptions' ); + } } diff --git a/tests/Factory/RbacFactoryTest.php b/tests/Factory/RbacFactoryTest.php index b3abe179..6a5911f1 100644 --- a/tests/Factory/RbacFactoryTest.php +++ b/tests/Factory/RbacFactoryTest.php @@ -20,20 +20,21 @@ use Laminas\ServiceManager\ServiceManager; use LmcRbacMvc\Factory\RbacFactory; +use Laminas\Permissions\Rbac\Rbac; +use PHPUnit\Framework\TestCase; /** * @covers LmcRbacMvc\Factory\RbacFactory */ -class RbacFactoryTest extends \PHPUnit\Framework\TestCase +class RbacFactoryTest extends TestCase { public function testCanCreateFromFactory() { $serviceManager = new ServiceManager(); $factory = new RbacFactory(); - $rbac = $factory->createService($serviceManager); + $rbac = $factory($serviceManager, 'rbac'); - $this->assertInstanceOf('LmcRbacMvc\Rbac\Rbac', $rbac); -// $this->assertInstanceOf('LmcRbacMvc\Role\TraversalStrategyInterface', $rbac->getTraversalStrategy()); + $this->assertInstanceOf(Rbac::class, $rbac); } } diff --git a/tests/Factory/RedirectStrategyFactoryTest.php b/tests/Factory/RedirectStrategyFactoryTest.php index f72f10f0..5e0d679b 100644 --- a/tests/Factory/RedirectStrategyFactoryTest.php +++ b/tests/Factory/RedirectStrategyFactoryTest.php @@ -51,7 +51,7 @@ public function testFactory() ->shouldBeCalled(); $factory = new RedirectStrategyFactory(); - $redirectStrategy = $factory->createService($serviceLocatorMock->reveal()); + $redirectStrategy = $factory($serviceLocatorMock->reveal(), 'LmcRbacMvc\View\Strategy\RedirectStrategy'); $this->assertInstanceOf('LmcRbacMvc\View\Strategy\RedirectStrategy', $redirectStrategy); } diff --git a/tests/Factory/RoleProviderPluginManagerFactoryTest.php b/tests/Factory/RoleProviderPluginManagerFactoryTest.php index cbc5bbb7..c0078c8f 100644 --- a/tests/Factory/RoleProviderPluginManagerFactoryTest.php +++ b/tests/Factory/RoleProviderPluginManagerFactoryTest.php @@ -37,7 +37,7 @@ public function testFactory() ]); $factory = new RoleProviderPluginManagerFactory(); - $pluginManager = $factory->createService($serviceManager); + $pluginManager = $factory($serviceManager,RoleProviderPluginManager::class); $this->assertInstanceOf(RoleProviderPluginManager::class, $pluginManager); } diff --git a/tests/Factory/RoleServiceFactoryTest.php b/tests/Factory/RoleServiceFactoryTest.php index e2bb1dfd..da4e3e0e 100644 --- a/tests/Factory/RoleServiceFactoryTest.php +++ b/tests/Factory/RoleServiceFactoryTest.php @@ -65,7 +65,7 @@ public function testFactory() $serviceManager->setService('LmcRbacMvc\Identity\AuthenticationProvider', $this->createMock('LmcRbacMvc\Identity\IdentityProviderInterface')); $factory = new RoleServiceFactory(); - $roleService = $factory->createService($serviceManager); + $roleService = $factory($serviceManager, 'LmcRbacMvc\Service\RoleService'); $this->assertInstanceOf('LmcRbacMvc\Service\RoleService', $roleService); $this->assertEquals('guest', $roleService->getGuestRole()); @@ -73,6 +73,7 @@ public function testFactory() } + /** TODO what are we testing here? */ public function testIfRoleArrayPointerBeyondArrayEnd() { $options = new ModuleOptions([ @@ -94,11 +95,6 @@ public function testIfRoleArrayPointerBeyondArrayEnd() $roleProvider = $this->createMock('\LmcRbacMvc\Role\RoleProviderInterface'); $rbac = $this->createMock('Laminas\Permissions\Rbac\Rbac'); -// $rbac->expects($this->once()) -// ->method('getTraversalStrategy') -// ->will($this->returnValue( -// $traversalStrategy -// )); $pluginManager = $this->createMock('\LmcRbacMvc\Role\RoleProviderPluginManager'); $pluginManager->expects($this->once()) @@ -114,13 +110,14 @@ public function testIfRoleArrayPointerBeyondArrayEnd() $serviceManager->setService('LmcRbacMvc\Role\RoleProviderPluginManager', $pluginManager); $serviceManager->setService('LmcRbacMvc\Identity\AuthenticationProvider', $this->createMock('LmcRbacMvc\Identity\IdentityProviderInterface')); + /* TODO what are we testing here? */ $factory = new RoleServiceFactory(); - $factory->createService($serviceManager); + $factory($serviceManager, ''); } public function testThrowExceptionIfNoRoleProvider() { - $this->ExpectException(\LmcRbacMvc\Exception\RuntimeException::class); + $this->expectException(\Laminas\ServiceManager\Exception\ServiceNotCreatedException::class); $options = new ModuleOptions([ 'identity_provider' => 'LmcRbacMvc\Identity\AuthenticationProvider', @@ -135,7 +132,8 @@ public function testThrowExceptionIfNoRoleProvider() $this->createMock('LmcRbacMvc\Identity\IdentityProviderInterface') ); + /** TODO what are we testing here since there are no assertion? */ $factory = new RoleServiceFactory(); - $factory->createService($serviceManager); + $factory($serviceManager, ''); } } diff --git a/tests/Factory/UnauthorizedStrategyFactoryTest.php b/tests/Factory/UnauthorizedStrategyFactoryTest.php index a2b5e286..96a7167d 100644 --- a/tests/Factory/UnauthorizedStrategyFactoryTest.php +++ b/tests/Factory/UnauthorizedStrategyFactoryTest.php @@ -43,7 +43,7 @@ public function testFactory() $serviceLocatorMock->get('LmcRbacMvc\Options\ModuleOptions')->willReturn($moduleOptionsMock)->shouldBeCalled(); $factory = new UnauthorizedStrategyFactory(); - $unauthorizedStrategy = $factory->createService($serviceLocatorMock->reveal()); + $unauthorizedStrategy = $factory($serviceLocatorMock->reveal(),'LmcRbacMvc\View\Strategy\UnauthorizedStrategy'); $this->assertInstanceOf('LmcRbacMvc\View\Strategy\UnauthorizedStrategy', $unauthorizedStrategy); } diff --git a/tests/Guard/ControllerGuardTest.php b/tests/Guard/ControllerGuardTest.php index 4f51881b..2a414f36 100644 --- a/tests/Guard/ControllerGuardTest.php +++ b/tests/Guard/ControllerGuardTest.php @@ -45,7 +45,7 @@ public function testAttachToRightEvent() $guard->attach($eventManager); } - public function rulesConversionProvider() + public static function rulesConversionProvider(): array { return [ // Without actions @@ -167,7 +167,7 @@ public function testRulesConversions(array $rules, array $expected) $this->assertEquals($expected, $reflProperty->getValue($controllerGuard)); } - public function controllerDataProvider() + public static function controllerDataProvider(): array { return [ // Test simple guard with both policies @@ -183,7 +183,7 @@ public function controllerDataProvider() 'rolesConfig' => [ 'admin' ], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -199,7 +199,7 @@ public function controllerDataProvider() 'rolesConfig' => [ 'admin' ], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_DENY ], @@ -223,7 +223,7 @@ public function controllerDataProvider() 'rolesConfig' => [ 'admin' ], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -245,7 +245,7 @@ public function controllerDataProvider() 'rolesConfig' => [ 'admin' ], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_DENY ], @@ -263,7 +263,7 @@ public function controllerDataProvider() 'rolesConfig' => [ 'member' ], - 'identityRole' => 'member', + 'identityRole' => ['member'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -279,7 +279,7 @@ public function controllerDataProvider() 'rolesConfig' => [ 'member' ], - 'identityRole' => 'member', + 'identityRole' => ['member'], 'isGranted' => false, 'policy' => GuardInterface::POLICY_DENY ], @@ -298,7 +298,7 @@ public function controllerDataProvider() 'rolesConfig' => [ 'member' ], - 'identityRole' => 'member', + 'identityRole' => ['member'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -315,7 +315,7 @@ public function controllerDataProvider() 'rolesConfig' => [ 'member' ], - 'identityRole' => 'member', + 'identityRole' => ['member'], 'isGranted' => false, 'policy' => GuardInterface::POLICY_DENY ], @@ -337,7 +337,7 @@ public function controllerDataProvider() ], 'guest' ], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -357,7 +357,7 @@ public function controllerDataProvider() ], 'guest' ], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_DENY ], diff --git a/tests/Guard/ControllerPermissionsGuardTest.php b/tests/Guard/ControllerPermissionsGuardTest.php index 57550a9c..5435e551 100644 --- a/tests/Guard/ControllerPermissionsGuardTest.php +++ b/tests/Guard/ControllerPermissionsGuardTest.php @@ -53,7 +53,7 @@ public function testAttachToRightEvent() $guard->attach($eventManager); } - public function rulesConversionProvider() + public static function rulesConversionProvider(): array { return [ // Without actions @@ -171,7 +171,7 @@ public function testRulesConversions(array $rules, array $expected) $this->assertEquals($expected, $reflProperty->getValue($controllerGuard)); } - public function controllerDataProvider() + public static function controllerDataProvider(): array { return [ // Test simple guard with both policies diff --git a/tests/Guard/GuardPluginManagerTest.php b/tests/Guard/GuardPluginManagerTest.php index afd4c9fa..a3cfaae6 100644 --- a/tests/Guard/GuardPluginManagerTest.php +++ b/tests/Guard/GuardPluginManagerTest.php @@ -27,7 +27,7 @@ */ class GuardPluginManagerTest extends \PHPUnit\Framework\TestCase { - public function guardProvider() + public static function guardProvider(): array { return [ [ diff --git a/tests/Guard/RouteGuardTest.php b/tests/Guard/RouteGuardTest.php index 56af7b08..418b5af3 100644 --- a/tests/Guard/RouteGuardTest.php +++ b/tests/Guard/RouteGuardTest.php @@ -56,7 +56,7 @@ public function testAssertRouteGuardPriority() $this->assertGreaterThan(ControllerGuard::EVENT_PRIORITY, RouteGuard::EVENT_PRIORITY); } - public function rulesConversionProvider() + public static function rulesConversionProvider(): array { return [ // Simple string to array conversion @@ -115,7 +115,7 @@ public function testRulesConversions(array $rules, array $expected) $this->assertEquals($expected, $reflProperty->getValue($routeGuard)); } - public function routeDataProvider() + public static function routeDataProvider(): array { return [ // Assert basic one-to-one mapping with both policies @@ -123,7 +123,7 @@ public function routeDataProvider() 'rules' => ['adminRoute' => 'admin'], 'matchedRouteName' => 'adminRoute', 'rolesConfig' => ['admin'], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -131,7 +131,7 @@ public function routeDataProvider() 'rules' => ['adminRoute' => 'admin'], 'matchedRouteName' => 'adminRoute', 'rolesConfig' => ['admin'], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_DENY ], @@ -159,7 +159,7 @@ public function routeDataProvider() 'rules' => ['admin/dashboard' => 'admin'], 'matchedRouteName' => 'admin/dashboard', 'rolesConfig' => ['admin'], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -167,7 +167,7 @@ public function routeDataProvider() 'rules' => ['admin/dashboard' => 'admin'], 'matchedRouteName' => 'admin/dashboard', 'rolesConfig' => ['admin'], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_DENY ], @@ -177,7 +177,7 @@ public function routeDataProvider() 'rules' => ['admin/*' => 'admin'], 'matchedRouteName' => 'admin/dashboard', 'rolesConfig' => ['admin'], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -185,7 +185,7 @@ public function routeDataProvider() 'rules' => ['admin/*' => 'admin'], 'matchedRouteName' => 'admin/dashboard', 'rolesConfig' => ['admin'], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_DENY ], @@ -195,7 +195,7 @@ public function routeDataProvider() 'rules' => ['fooBar/*' => 'admin'], 'matchedRouteName' => 'admin/fooBar/baz', 'rolesConfig' => ['admin'], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -203,7 +203,7 @@ public function routeDataProvider() 'rules' => ['fooBar/*' => 'admin'], 'matchedRouteName' => 'admin/fooBar/baz', 'rolesConfig' => ['admin'], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => false, 'policy' => GuardInterface::POLICY_DENY ], @@ -216,7 +216,7 @@ public function routeDataProvider() ], 'matchedRouteName' => 'route1', 'rolesConfig' => ['admin'], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -227,7 +227,7 @@ public function routeDataProvider() ], 'matchedRouteName' => 'route1', 'rolesConfig' => ['admin'], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_DENY ], @@ -240,7 +240,7 @@ public function routeDataProvider() ], 'matchedRouteName' => 'route3', 'rolesConfig' => ['admin'], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -251,7 +251,7 @@ public function routeDataProvider() ], 'matchedRouteName' => 'route3', 'rolesConfig' => ['admin'], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => false, 'policy' => GuardInterface::POLICY_DENY ], @@ -261,7 +261,7 @@ public function routeDataProvider() 'rules' => ['route' => 'admin'], 'matchedRouteName' => 'route', 'rolesConfig' => ['admin', 'guest'], - 'identityRole' => 'guest', + 'identityRole' => ['guest'], 'isGranted' => false, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -269,7 +269,7 @@ public function routeDataProvider() 'rules' => ['route' => 'admin'], 'matchedRouteName' => 'route', 'rolesConfig' => ['admin', 'guest'], - 'identityRole' => 'guest', + 'identityRole' => ['guest'], 'isGranted' => false, 'policy' => GuardInterface::POLICY_DENY ], @@ -287,7 +287,7 @@ public function routeDataProvider() ], 'guest' ], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -303,7 +303,7 @@ public function routeDataProvider() ], 'guest' ], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_DENY ], @@ -318,7 +318,7 @@ public function routeDataProvider() ], 'member' ], - 'identityRole' => 'member', + 'identityRole' => ['member'], 'isGranted' => false, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -331,7 +331,7 @@ public function routeDataProvider() ], 'member' ], - 'identityRole' => 'member', + 'identityRole' => ['member'], 'isGranted' => false, 'policy' => GuardInterface::POLICY_DENY ], @@ -341,7 +341,7 @@ public function routeDataProvider() 'rules' => ['home' => '*'], 'matchedRouteName' => 'home', 'rolesConfig' => ['admin'], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_ALLOW ], @@ -349,7 +349,7 @@ public function routeDataProvider() 'rules' => ['home' => '*'], 'matchedRouteName' => 'home', 'rolesConfig' => ['admin'], - 'identityRole' => 'admin', + 'identityRole' => ['admin'], 'isGranted' => true, 'policy' => GuardInterface::POLICY_DENY ], diff --git a/tests/Guard/RoutePermissionsGuardTest.php b/tests/Guard/RoutePermissionsGuardTest.php index 4e218658..d0d2e980 100644 --- a/tests/Guard/RoutePermissionsGuardTest.php +++ b/tests/Guard/RoutePermissionsGuardTest.php @@ -51,7 +51,7 @@ public function testAssertRoutePermissionsGuardPriority() $this->assertGreaterThan(ControllerGuard::EVENT_PRIORITY, RoutePermissionsGuard::EVENT_PRIORITY); } - public function rulesConversionProvider() + public static function rulesConversionProvider(): array { return [ // Simple string to array conversion @@ -105,7 +105,7 @@ public function testRulesConversions(array $rules, array $expected) $this->assertEquals($expected, $reflProperty->getValue($routeGuard)); } - public function routeDataProvider() + public static function routeDataProvider(): array { return [ // Assert basic one-to-one mapping with both policies @@ -337,15 +337,35 @@ public function routeDataProvider() 'isGranted' => true, 'policy' => GuardInterface::POLICY_DENY ], + [ + 'rules' => ['route' => [ + 'permissions' => ['post.edit', 'post.read'], + 'condition' => GuardInterface::CONDITION_OR + ]], + 'matchedRouteName' => 'route', + 'identityPermissions' => [['post.edit', null, false], ['post.read', null, true]], + 'isGranted' => true, + 'policy' => GuardInterface::POLICY_DENY + ], [ 'rules' => ['route' => [ 'permissions' => ['post.edit', 'post.read'], 'condition' => GuardInterface::CONDITION_AND ]], 'matchedRouteName' => 'route', - 'identityPermissions' => [['post.edit', null, true]], + 'identityPermissions' => [['post.edit', null, true], ['post.read', null, false]], 'isGranted' => false, 'policy' => GuardInterface::POLICY_DENY + ], + [ + 'rules' => ['route' => [ + 'permissions' => ['post.edit', 'post.read'], + 'condition' => GuardInterface::CONDITION_AND + ]], + 'matchedRouteName' => 'route', + 'identityPermissions' => [['post.edit', null, true], ['post.read', null, true]], + 'isGranted' => true, + 'policy' => GuardInterface::POLICY_DENY ] ]; } @@ -444,9 +464,10 @@ public function testProperlySetUnauthorizedAndTriggerEventOnUnauthorization() $this->assertInstanceOf('LmcRbacMvc\Exception\UnauthorizedException', $event->getParam('exception')); } - public function createRouteMatch(array $params = []) + public function createRouteMatch(array $params = []): RouteMatch { - $class = class_exists(V2RouteMatch::class) ? V2RouteMatch::class : RouteMatch::class; - return new $class($params); + return new RouteMatch($params); +// $class = class_exists(V2RouteMatch::class) ? V2RouteMatch::class : RouteMatch::class; +// return new $class($params); } } diff --git a/tests/Initializer/AuthorizationServiceInitializerTest.php b/tests/Initializer/AuthorizationServiceInitializerTest.php index 6084e1a9..79dd9404 100644 --- a/tests/Initializer/AuthorizationServiceInitializerTest.php +++ b/tests/Initializer/AuthorizationServiceInitializerTest.php @@ -17,6 +17,8 @@ */ namespace LmcRbacMvcTest\Initializer; +use Laminas\ServiceManager\ServiceManager; +use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; use Laminas\ServiceManager\ServiceLocatorInterface; use LmcRbacMvc\Initializer\AuthorizationServiceInitializer; @@ -27,7 +29,7 @@ * @author Aeneas Rekkas * @license MIT License */ -class AuthorizationServiceInitializerTest extends \PHPUnit\Framework\TestCase +class AuthorizationServiceInitializerTest extends TestCase { use ProphecyTrait; @@ -37,15 +39,12 @@ public function testInitializer() $initializer = new AuthorizationServiceInitializer(); $instance = new AuthorizationAwareFake(); - $serviceLocator = $this->prophesize(ServiceLocatorInterface::class)->willImplement(ContainerInterface::class); $authorizationService = $this->createMock('LmcRbacMvc\Service\AuthorizationService'); - $serviceLocator - ->get($authServiceClassName) - ->willReturn($authorizationService) - ->shouldBeCalled(); + $serviceManager = new ServiceManager(); + $serviceManager->setService(\LmcRbacMvc\Service\AuthorizationService::class, $authorizationService); - $initializer->initialize($instance, $serviceLocator->reveal()); + $initializer($serviceManager, $instance); $this->assertEquals($authorizationService, $instance->getAuthorizationService()); } diff --git a/tests/Options/ModuleOptionsTest.php b/tests/Options/ModuleOptionsTest.php index ce0d0a85..b6e2c45f 100644 --- a/tests/Options/ModuleOptionsTest.php +++ b/tests/Options/ModuleOptionsTest.php @@ -16,7 +16,7 @@ * and is licensed under the MIT license. */ -namespace LmcRbacMvcTest; +namespace LmcRbacMvcTest\Options; use LmcRbacMvc\Options\ModuleOptions; use LmcRbacMvcTest\Util\ServiceManagerFactory; @@ -28,7 +28,7 @@ class ModuleOptionsTest extends \PHPUnit\Framework\TestCase { public function testAssertModuleDefaultOptions() { - /** @var \LmcRbacMvc\Options\ModuleOptions $moduleOptions */ + /** @var ModuleOptions $moduleOptions */ $moduleOptions = ServiceManagerFactory::getServiceManager()->get('LmcRbacMvc\Options\ModuleOptions'); $this->assertEquals('LmcRbacMvc\Identity\AuthenticationIdentityProvider', $moduleOptions->getIdentityProvider()); diff --git a/tests/Options/RedirectStrategyOptionsTest.php b/tests/Options/RedirectStrategyOptionsTest.php index 8b0fd95d..dfaaf7de 100644 --- a/tests/Options/RedirectStrategyOptionsTest.php +++ b/tests/Options/RedirectStrategyOptionsTest.php @@ -16,7 +16,7 @@ * and is licensed under the MIT license. */ -namespace LmcRbacMvcTest; +namespace LmcRbacMvcTest\Options; use LmcRbacMvc\Options\RedirectStrategyOptions; diff --git a/tests/Options/UnauthorizedStrategyOptionsTest.php b/tests/Options/UnauthorizedStrategyOptionsTest.php index 59ccbf52..f6c7dafa 100644 --- a/tests/Options/UnauthorizedStrategyOptionsTest.php +++ b/tests/Options/UnauthorizedStrategyOptionsTest.php @@ -16,7 +16,7 @@ * and is licensed under the MIT license. */ -namespace LmcRbacMvcTest; +namespace LmcRbacMvcTest\Options; use LmcRbacMvc\Options\UnauthorizedStrategyOptions; diff --git a/tests/Role/InMemoryRoleProviderTest.php b/tests/Role/InMemoryRoleProviderTest.php index 71cc56c3..1d3c8bd2 100644 --- a/tests/Role/InMemoryRoleProviderTest.php +++ b/tests/Role/InMemoryRoleProviderTest.php @@ -18,11 +18,14 @@ namespace LmcRbacMvcTest\Role; +use LmcRbacMvc\Exception\RoleNotFoundException; use LmcRbacMvc\Role\InMemoryRoleProvider; +use PHPUnit\Framework\TestCase; + /** * @covers \LmcRbacMvc\Role\InMemoryRoleProvider */ -class InMemoryRoleProviderTest extends \PHPUnit\Framework\TestCase +class InMemoryRoleProviderTest extends TestCase { public function testInMemoryProvider() { diff --git a/tests/Role/ObjectRepositoryRoleProviderTest.php b/tests/Role/ObjectRepositoryRoleProviderTest.php index 77e8b25a..a9f43627 100644 --- a/tests/Role/ObjectRepositoryRoleProviderTest.php +++ b/tests/Role/ObjectRepositoryRoleProviderTest.php @@ -18,6 +18,7 @@ namespace LmcRbacMvcTest\Role; +use Doctrine\ORM\EntityManager; use Doctrine\ORM\Tools\SchemaTool; use Doctrine\ORM\Tools\ToolsException; use Doctrine\Persistence\ObjectManager; @@ -26,37 +27,103 @@ use LmcRbacMvc\Role\ObjectRepositoryRoleProvider; use LmcRbacMvcTest\Asset\FlatRole; use LmcRbacMvcTest\Asset\HierarchicalRole; +use LmcRbacMvcTest\Asset\Role; +use LmcRbacMvcTest\Asset\Permission; use LmcRbacMvcTest\Util\ServiceManagerFactory; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\NotFoundExceptionInterface; /** * @covers \LmcRbacMvc\Role\ObjectRepositoryRoleProvider */ class ObjectRepositoryRoleProviderTest extends \PHPUnit\Framework\TestCase { + protected ServiceManager $serviceManager; + + public static function roleProvider(): array + { + return [ + 'one-role-flat' => [ + 'rolesConfig' => [ + 'admin', + ], + 'rolesToCheck' => ['admin'], + ], + '2-roles-flat' => [ + 'rolesConfig' => [ + 'admin', + 'member', + ], + 'rolesToCheck' => ['admin', 'member', ] + ], + ]; + } + /** - * @var ServiceManager + * @dataProvider roleProvider */ - protected $serviceManager; + public function testObjectRepositoryProviderForFlatRole( array $rolesConfig, array $rolesToCheck) + { + $this->serviceManager = ServiceManagerFactory::getServiceManager(); + $objectManager = $this->getObjectManager(); + + // Let's add the roles + foreach ($rolesConfig as $name => $roleConfig) { + if (is_array($roleConfig)) { + $role = new Role($name); + if (isset($roleConfig['permissions'])) { + foreach ($roleConfig['permissions'] as $permission) { + $role->addPermission($permission); + } + } + } else { + $role = new Role($roleConfig); + } + $objectManager->persist($role); + } + $objectManager->flush(); + + $objectRepository = $objectManager->getRepository('LmcRbacMvcTest\Asset\Role'); + $objectRepositoryRoleProvider = new ObjectRepositoryRoleProvider($objectRepository, 'name'); + + // get the roles + $roles = $objectRepositoryRoleProvider->getRoles($rolesToCheck); + + $this->assertIsArray($roles); + $this->assertCount(count($rolesToCheck), $roles); - public function testObjectRepositoryProviderForFlatRole() + $i = 0; + foreach ($roles as $role) { + $this->assertInstanceOf('Laminas\Permissions\Rbac\RoleInterface', $role); + $this->assertEquals($rolesToCheck[$i], $role->getName()); + $i++; + } + } + + public function testObjectRepositoryProviderForFlatRoleWithPermissions() { $this->serviceManager = ServiceManagerFactory::getServiceManager(); $objectManager = $this->getObjectManager(); + // Create permission +// $permission = new Permission('manage'); +// $objectManager->persist($permission); +// $objectManager->flush(); + // Let's add some roles - $adminRole = new FlatRole('admin'); + $adminRole = new Role('admin'); + $adminRole->addPermission('manage'); + $adminRole->addPermission('write'); + $adminRole->addPermission('read'); $objectManager->persist($adminRole); - $memberRole = new FlatRole('member'); - $objectManager->persist($memberRole); - $objectManager->flush(); - $objectRepository = $objectManager->getRepository('LmcRbacMvcTest\Asset\FlatRole'); + $objectRepository = $objectManager->getRepository('LmcRbacMvcTest\Asset\Role'); $objectRepositoryRoleProvider = new ObjectRepositoryRoleProvider($objectRepository, 'name'); - // Get only the admin role + // Get only the role $roles = $objectRepositoryRoleProvider->getRoles(['admin']); $this->assertCount(1, $roles); @@ -64,6 +131,10 @@ public function testObjectRepositoryProviderForFlatRole() $this->assertInstanceOf('Laminas\Permissions\Rbac\RoleInterface', $roles[0]); $this->assertEquals('admin', $roles[0]->getName()); + $this->assertTrue($roles[0]->hasPermission('manage') ); + $this->assertTrue($roles[0]->hasPermission('read') ); + $this->assertTrue($roles[0]->hasPermission('write') ); + $this->assertFalse($roles[0]->hasPermission('foo') ); } public function testObjectRepositoryProviderForHierarchicalRole() @@ -72,20 +143,24 @@ public function testObjectRepositoryProviderForHierarchicalRole() $objectManager = $this->getObjectManager(); // Let's add some roles - $guestRole = new HierarchicalRole('guest'); +// $guestRole = new HierarchicalRole('guest'); + $guestRole = new Role('guest'); $objectManager->persist($guestRole); - $memberRole = new HierarchicalRole('member'); +// $memberRole = new HierarchicalRole('member'); + $memberRole = new Role('member'); $memberRole->addChild($guestRole); $objectManager->persist($memberRole); - $adminRole = new HierarchicalRole('admin'); +// $adminRole = new HierarchicalRole('admin'); + $adminRole = new Role('admin'); $adminRole->addChild($memberRole); $objectManager->persist($adminRole); $objectManager->flush(); - $objectRepository = $objectManager->getRepository('LmcRbacMvcTest\Asset\HierarchicalRole'); +// $objectRepository = $objectManager->getRepository('LmcRbacMvcTest\Asset\HierarchicalRole'); + $objectRepository = $objectManager->getRepository('LmcRbacMvcTest\Asset\Role'); $objectRepositoryRoleProvider = new ObjectRepositoryRoleProvider($objectRepository, 'name'); @@ -116,7 +191,7 @@ public function testObjectRepositoryProviderForHierarchicalRole() public function testRoleCacheOnConsecutiveCalls() { $objectRepository = $this->createMock('Doctrine\ORM\EntityRepository'); - $memberRole = new FlatRole('member'); + $memberRole = new Role('member'); $provider = new ObjectRepositoryRoleProvider($objectRepository, 'name'); $result = [$memberRole]; @@ -129,7 +204,7 @@ public function testRoleCacheOnConsecutiveCalls() public function testClearRoleCache() { $objectRepository = $this->createMock('Doctrine\ORM\EntityRepository'); - $memberRole = new FlatRole('member'); + $memberRole = new Role('member'); $provider = new ObjectRepositoryRoleProvider($objectRepository, 'name'); $result = [$memberRole]; @@ -145,7 +220,7 @@ public function testThrowExceptionIfAskedRoleIsNotFound() $this->serviceManager = ServiceManagerFactory::getServiceManager(); $objectManager = $this->getObjectManager(); - $objectRepository = $objectManager->getRepository('LmcRbacMvcTest\Asset\FlatRole'); + $objectRepository = $objectManager->getRepository('LmcRbacMvcTest\Asset\Role'); $objectRepositoryRoleProvider = new ObjectRepositoryRoleProvider($objectRepository, 'name'); $this->expectException( @@ -157,10 +232,12 @@ public function testThrowExceptionIfAskedRoleIsNotFound() } /** - * @return ObjectManager + * @return EntityManager|ObjectManager * @throws ToolsException + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface */ - private function getObjectManager() + private function getObjectManager(): \Doctrine\ORM\EntityManager|ObjectManager { /* @var $entityManager \Doctrine\ORM\EntityManager */ $entityManager = $this->serviceManager->get('Doctrine\\ORM\\EntityManager'); diff --git a/tests/Role/RoleProviderPluginManagerTest.php b/tests/Role/RoleProviderPluginManagerTest.php index d9f2bf75..413743da 100644 --- a/tests/Role/RoleProviderPluginManagerTest.php +++ b/tests/Role/RoleProviderPluginManagerTest.php @@ -26,14 +26,6 @@ */ class RoleProviderPluginManagerTest extends \PHPUnit\Framework\TestCase { - public function testValidationOfPluginSucceedsIfRoleProviderInterfaceIsImplemented() - { - $pluginMock = $this->createMock('LmcRbacMvc\Role\RoleProviderInterface'); - $pluginManager = new RoleProviderPluginManager(new ServiceManager()); - - $this->assertNull($pluginManager->validatePlugin($pluginMock)); - } - public function testValidationOfPluginFailsIfRoleProviderInterfaceIsNotImplemented() { $this->expectException('LmcRbacMvc\Exception\RuntimeException'); diff --git a/tests/Service/AuthorizationServiceTest.php b/tests/Service/AuthorizationServiceTest.php index a7871ae0..4b4a4c2e 100644 --- a/tests/Service/AuthorizationServiceTest.php +++ b/tests/Service/AuthorizationServiceTest.php @@ -32,7 +32,7 @@ */ class AuthorizationServiceTest extends \PHPUnit\Framework\TestCase { - public function grantedProvider() + public static function grantedProvider(): array { return [ // Simple is granted @@ -163,23 +163,26 @@ public function testDoNotCallAssertionIfThePermissionIsNotGranted() $this->assertFalse($authorizationService->isGranted('foo')); } + /** this test is no longer needed because of type checking is now enforced*/ + /** @deprecated */ public function testThrowExceptionForInvalidAssertion() { $role = $this->createMock('Laminas\Permissions\Rbac\RoleInterface'); $rbac = $this->createMock('LmcRbacMvc\Rbac\Rbac'); - $rbac->expects($this->once())->method('isGranted')->will($this->returnValue(true)); + //$rbac->expects($this->once())->method('isGranted')->will($this->returnValue(true)); $roleService = $this->createMock('LmcRbacMvc\Service\RoleService'); - $roleService->expects($this->once())->method('getIdentityRoles')->will($this->returnValue([$role])); + //$roleService->expects($this->once())->method('getIdentityRoles')->will($this->returnValue([$role])); $assertionPluginManager = $this->createMock('LmcRbacMvc\Assertion\AssertionPluginManager'); $authorizationService = new AuthorizationService($rbac, $roleService, $assertionPluginManager); - $this->expectException('LmcRbacMvc\Exception\InvalidArgumentException'); + //$this->expectException('LmcRbacMvc\Exception\InvalidArgumentException'); + $this->expectException(\TypeError::class); $authorizationService->setAssertion('foo', new \stdClass()); - $authorizationService->isGranted('foo'); + //$authorizationService->isGranted('foo'); } public function testDynamicAssertions() @@ -232,9 +235,9 @@ public function testAssertionMap() $this->assertTrue($authorizationService->hasAssertion('foo')); $this->assertTrue($authorizationService->hasAssertion('bar')); - $authorizationService->setAssertion('bar', null); - - $this->assertFalse($authorizationService->hasAssertion('bar')); + // This test is no longer valid due to type validation +// $authorizationService->setAssertion('bar', null); +// $this->assertFalse($authorizationService->hasAssertion('bar')); } /** diff --git a/tests/Service/RoleServiceTest.php b/tests/Service/RoleServiceTest.php index a99b31ce..5badfc09 100644 --- a/tests/Service/RoleServiceTest.php +++ b/tests/Service/RoleServiceTest.php @@ -33,7 +33,7 @@ */ class RoleServiceTest extends TestCase { - public function roleProvider() + public static function roleProvider(): array { return [ // No identity role @@ -229,21 +229,21 @@ public function testSetIdentityProvider() $identityProvider = $this->createMock(IdentityProviderInterface::class); $identityProvider->expects($this->any()) ->method('getIdentity') - ->will($this->returnValue('test')); + ->will($this->returnValue(null)); $roleService = new RoleService( $this->createMock(IdentityProviderInterface::class), new InMemoryRoleProvider([]), $this->createMock(TraversalStrategyInterface::class) ); $roleService->setIdentityProvider($identityProvider); - $this->assertEquals('test', $roleService->getIdentity()); + $this->assertNull($roleService->getIdentity()); } public function testSetRoleProvider() { $role = $this->createMock(RoleInterface::class); $identity = $this->createMock(IdentityInterface::class); - $identity->expects($this->once())->method('getRoles')->will($this->returnValue(new \ArrayObject([$role]))); + $identity->expects($this->once())->method('getRoles')->will($this->returnValue([$role])); $identityProvider = $this->createMock(IdentityProviderInterface::class); $identityProvider->expects($this->any()) @@ -290,6 +290,8 @@ public function testConvertRolesTraversable() } + /** @deprecated this is no longer needed since types are now checked */ + /* public function testThrowExceptionIfIdentityIsWrongType() { $this->expectException('LmcRbacMvc\Exception\RuntimeException'); @@ -299,13 +301,12 @@ public function testThrowExceptionIfIdentityIsWrongType() $identityProvider->expects($this->any()) ->method('getIdentity') ->will($this->returnValue(new \stdClass())); - $roleService = new RoleService( $identityProvider, $this->createMock('LmcRbacMvc\Role\RoleProviderInterface'), $this->createMock('LmcRbacMvc\Role\TraversalStrategyInterface') ); - $roleService->getIdentityRoles(); } + */ } diff --git a/tests/Util/ServiceManagerFactory.php b/tests/Util/ServiceManagerFactory.php index 719f7dab..210dbc79 100644 --- a/tests/Util/ServiceManagerFactory.php +++ b/tests/Util/ServiceManagerFactory.php @@ -32,13 +32,13 @@ abstract class ServiceManagerFactory /** * @var array */ - private static $config = []; + private static array $config = []; /** * @static * @param array $config */ - public static function setApplicationConfig(array $config) + public static function setApplicationConfig(array $config): void { static::$config = $config; } @@ -47,7 +47,7 @@ public static function setApplicationConfig(array $config) * @static * @return array */ - public static function getApplicationConfig() + public static function getApplicationConfig(): array { return static::$config; } @@ -56,11 +56,11 @@ public static function getApplicationConfig() * @param array|null $config * @return ServiceManager */ - public static function getServiceManager(array $config = null) + public static function getServiceManager(array $config = null): ServiceManager { $config = $config ?: static::getApplicationConfig(); $serviceManagerConfig = new ServiceManagerConfig( - isset($config['service_manager']) ? $config['service_manager'] : [] + $config['service_manager'] ?? [] ); $serviceManager = new ServiceManager(); $serviceManagerConfig->configureServiceManager($serviceManager); diff --git a/tests/testing.config.php b/tests/testing.config.php index ca2c8660..96136a01 100644 --- a/tests/testing.config.php +++ b/tests/testing.config.php @@ -21,7 +21,8 @@ 'doctrine' => [ 'driver' => [ 'application_driver' => [ - 'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', +// 'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', + 'class' => 'Doctrine\ORM\Mapping\Driver\AttributeDriver', 'cache' => 'array', 'paths' => [__DIR__ . '/Asset'] ], @@ -42,8 +43,9 @@ 'password' => null, 'dbname' => 'test', 'driver' => 'pdo_sqlite', - 'path' => null, - 'memory' => true, + 'path' => __DIR__ . "/../build/db.sqlite", +// 'path' => null, +// 'memory' => true, ], ], ], From 2824801c60b4fca53a014dec7a8ade1269044491 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Thu, 29 Feb 2024 15:26:55 -0500 Subject: [PATCH 17/37] CHanged ORM SQLite to in-memory storage --- tests/testing.config.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/testing.config.php b/tests/testing.config.php index 96136a01..a431e9c7 100644 --- a/tests/testing.config.php +++ b/tests/testing.config.php @@ -21,7 +21,6 @@ 'doctrine' => [ 'driver' => [ 'application_driver' => [ -// 'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 'class' => 'Doctrine\ORM\Mapping\Driver\AttributeDriver', 'cache' => 'array', 'paths' => [__DIR__ . '/Asset'] @@ -43,9 +42,9 @@ 'password' => null, 'dbname' => 'test', 'driver' => 'pdo_sqlite', - 'path' => __DIR__ . "/../build/db.sqlite", -// 'path' => null, -// 'memory' => true, +// 'path' => __DIR__ . "/../build/db.sqlite", + 'path' => null, + 'memory' => true, ], ], ], From 294ca1226e03c5af994a78936f6b95336e086252 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Fri, 1 Mar 2024 13:42:57 -0500 Subject: [PATCH 18/37] Update guards.md fix a remaining reference to zfc_rbac --- docs/docs/guards.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/guards.md b/docs/docs/guards.md index 04a6048b..8b6c403e 100644 --- a/docs/docs/guards.md +++ b/docs/docs/guards.md @@ -422,7 +422,7 @@ following code in your config: ```php return [ - 'zfc_rbac' => [ + 'lmc_rbac' => [ 'guard_manager' => [ 'factories' => [ 'Application\Guard\IpGuard' => 'Application\Factory\IpGuardFactory' From 92ebb625d50ad1b271fbdbf83c982e5b1fcf87bc Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Fri, 1 Mar 2024 14:09:07 -0500 Subject: [PATCH 19/37] Added __toString() method imported from zfr Rbac. Removed deprecation warning. --- src/Permission/PermissionInterface.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Permission/PermissionInterface.php b/src/Permission/PermissionInterface.php index a4148757..5ad416a1 100644 --- a/src/Permission/PermissionInterface.php +++ b/src/Permission/PermissionInterface.php @@ -21,14 +21,20 @@ /** * Interface that permissions must implement to be used with the AuthorizationService * - * Please note that currently the interface extends the one from RBAC, but starting in ZF3, the - * permission will be removed from RBAC component and moved here completely - * * @author Michaël Gallego * @license MIT - * @deprecated - * TODO Remove deprecated interface + * + * */ interface PermissionInterface { + /** + * Get the permission name + * + * You really must return the name of the permission as internally, the casting to string is used + * as an optimization to avoid type checking + * + * @return string + */ + public function __toString(); } From fe827f48b7c1f790d2c5e033180a7d6821721df2 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Fri, 1 Mar 2024 14:09:56 -0500 Subject: [PATCH 20/37] Added PermissionInterface interface --- tests/Asset/Permission.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Asset/Permission.php b/tests/Asset/Permission.php index 650abbc1..c68c9043 100644 --- a/tests/Asset/Permission.php +++ b/tests/Asset/Permission.php @@ -20,6 +20,7 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; +use LmcRbacMvc\Permission\PermissionInterface; /** * @ORM\Entity @@ -27,7 +28,7 @@ */ #[ORM\Entity] #[ORM\Table(name:"permissions")] -class Permission +class Permission implements PermissionInterface { /** * @ORM\Id From d67c7bee58454d7b070eaf811e52ae5f11fd4e50 Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Fri, 1 Mar 2024 14:10:12 -0500 Subject: [PATCH 21/37] Added PermissionInterface interface --- tests/Role/PermissionInterfaceTest.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 tests/Role/PermissionInterfaceTest.php diff --git a/tests/Role/PermissionInterfaceTest.php b/tests/Role/PermissionInterfaceTest.php new file mode 100644 index 00000000..bc9646db --- /dev/null +++ b/tests/Role/PermissionInterfaceTest.php @@ -0,0 +1,18 @@ +addPermission($permission); + $this->assertTrue($role->hasPermission('foo')); + } +} From 2762ce6d05c1f67a07d22ea46b3c1ba7f8d8d83c Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Fri, 1 Mar 2024 14:22:40 -0500 Subject: [PATCH 22/37] Removed locally created Rbac class. --- config/module.config.php | 5 +- src/Factory/AuthorizationServiceFactory.php | 5 +- src/Rbac/Rbac.php | 86 --------------------- src/Service/AuthorizationService.php | 20 ++--- tests/Factory/RoleServiceFactoryTest.php | 2 +- tests/Service/AuthorizationServiceTest.php | 54 +++++-------- 6 files changed, 34 insertions(+), 138 deletions(-) delete mode 100644 src/Rbac/Rbac.php diff --git a/config/module.config.php b/config/module.config.php index a59128ed..bc856b74 100644 --- a/config/module.config.php +++ b/config/module.config.php @@ -18,16 +18,13 @@ return [ 'service_manager' => [ - 'aliases' => [ - 'Rbac' => 'rbac', - ], 'factories' => [ /* Factories that do not map to a class */ 'LmcRbacMvc\Guards' => \LmcRbacMvc\Factory\GuardsFactory::class, - 'rbac' => \LmcRbacMvc\Factory\RbacFactory::class, /* Factories that map to a class */ \LmcRbacMvc\Assertion\AssertionPluginManager::class => \LmcRbacMvc\Factory\AssertionPluginManagerFactory::class, + // TODO Remove RbacCollector once it is moved to a separate library \LmcRbacMvc\Collector\RbacCollector::class => \Laminas\ServiceManager\Factory\InvokableFactory::class, \LmcRbacMvc\Guard\GuardPluginManager::class => \LmcRbacMvc\Factory\GuardPluginManagerFactory::class, \LmcRbacMvc\Identity\AuthenticationIdentityProvider::class => \LmcRbacMvc\Factory\AuthenticationIdentityProviderFactory::class, diff --git a/src/Factory/AuthorizationServiceFactory.php b/src/Factory/AuthorizationServiceFactory.php index 83a37a28..4f0978fa 100644 --- a/src/Factory/AuthorizationServiceFactory.php +++ b/src/Factory/AuthorizationServiceFactory.php @@ -42,9 +42,6 @@ class AuthorizationServiceFactory implements FactoryInterface */ public function __invoke(ContainerInterface $container, $requestedName, array $options = null): AuthorizationService { - /* @var Rbac $rbac */ - $rbac = $container->get('rbac'); - /* @var RoleService $roleService */ $roleService = $container->get(RoleService::class); @@ -54,7 +51,7 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o /* @var ModuleOptions $moduleOptions */ $moduleOptions = $container->get(ModuleOptions::class); - $authorizationService = new AuthorizationService($rbac, $roleService, $assertionPluginManager); + $authorizationService = new AuthorizationService($roleService, $assertionPluginManager); $authorizationService->setAssertions($moduleOptions->getAssertionMap()); return $authorizationService; diff --git a/src/Rbac/Rbac.php b/src/Rbac/Rbac.php deleted file mode 100644 index 4f481998..00000000 --- a/src/Rbac/Rbac.php +++ /dev/null @@ -1,86 +0,0 @@ -roles; - } - - /** - * Determines if access is granted by checking the role and child roles for permission. - * - * @param RoleInterface|string $role - * @param null|AssertionInterface|Callable $assertion - * @throws Exception\InvalidArgumentException If the role is not found. - * @throws Exception\InvalidArgumentException If the assertion is an invalid type. - */ - public function isGranted($role, string $permission, $assertion = null): bool - { - if ( is_array($role) && $role[0] instanceof RoleInterface) { - $role = $role[0]; - } - if (! $this->hasRole($role)) { - throw new Exception\InvalidArgumentException(sprintf( - 'No role with name "%s" could be found', - is_object($role) ? $role->getName() : $role - )); - } - - if (is_string($role)) { - $role = $this->getRole($role); - } - - $result = $role->hasPermission($permission); - if (false === $result || null === $assertion) { - return $result; - } - - if ( - ! $assertion instanceof AssertionInterface - && ! is_callable($assertion) - ) { - throw new Exception\InvalidArgumentException( - 'Assertions must be a Callable or an instance of Laminas\Permissions\Rbac\AssertionInterface' - ); - } - - if ($assertion instanceof AssertionInterface) { - return $result && $assertion->assert($this, $role, $permission); - } - - // Callable assertion provided. - return $result && $assertion($this, $role, $permission); - } - - /** - * Is a role registered? - * - * @param RoleInterface|string $role - */ - public function hasRole($role): bool - { - if(empty($this->roles)){ - $this->addRole($role); - } - - return parent::hasRole($role); - } - -} diff --git a/src/Service/AuthorizationService.php b/src/Service/AuthorizationService.php index ced6f83f..134c41b7 100644 --- a/src/Service/AuthorizationService.php +++ b/src/Service/AuthorizationService.php @@ -34,11 +34,6 @@ */ class AuthorizationService implements AuthorizationServiceInterface { - /** - * @var Rbac - */ - protected Rbac $rbac; - /** * @var RoleService */ @@ -57,13 +52,11 @@ class AuthorizationService implements AuthorizationServiceInterface /** * Constructor * - * @param Rbac $rbac * @param RoleService $roleService * @param AssertionPluginManager $assertionPluginManager */ - public function __construct(Rbac $rbac, RoleService $roleService, AssertionPluginManager $assertionPluginManager) + public function __construct(RoleService $roleService, AssertionPluginManager $assertionPluginManager) { - $this->rbac = $rbac; $this->roleService = $roleService; $this->assertionPluginManager = $assertionPluginManager; } @@ -122,14 +115,21 @@ public function getIdentity(): ?IdentityInterface public function isGranted(string $permission, mixed $context = null): bool { $roles = $this->roleService->getIdentityRoles(); -// var_dump(__METHOD__,$roles); + if (empty($roles)) { return false; } + + // Create a RBAC container and populate with the identity's roles + $rbac = new Rbac(); + foreach ($roles as $role) { + $rbac->addRole($role); + } + // Iterate through roles $allowed = false; foreach ($roles as $role) { - if ($this->rbac->isGranted($role, $permission)) { + if ($rbac->isGranted($role, $permission)) { $allowed = true; } } diff --git a/tests/Factory/RoleServiceFactoryTest.php b/tests/Factory/RoleServiceFactoryTest.php index da4e3e0e..af414eaa 100644 --- a/tests/Factory/RoleServiceFactoryTest.php +++ b/tests/Factory/RoleServiceFactoryTest.php @@ -43,7 +43,7 @@ public function testFactory() $traversalStrategy = $this->createMock('LmcRbacMvc\Role\RecursiveRoleIteratorStrategy'); $roleProvider = $this->createMock('\LmcRbacMvc\Role\RoleProviderInterface'); - $rbac = $this->createMock('LmcRbacMvc\Rbac\Rbac'); + $rbac = $this->createMock('Laminas\Permissions\Rbac\Rbac'); // $rbac->expects($this->once()) // ->method('getTraversalStrategy') // ->will($this->returnValue( diff --git a/tests/Service/AuthorizationServiceTest.php b/tests/Service/AuthorizationServiceTest.php index 4b4a4c2e..64bea95d 100644 --- a/tests/Service/AuthorizationServiceTest.php +++ b/tests/Service/AuthorizationServiceTest.php @@ -18,7 +18,8 @@ namespace LmcRbacMvcTest\Service; -use LmcRbacMvc\Rbac\Rbac; +use Laminas\Permissions\Rbac\Rbac; +use Laminas\Permissions\Rbac\Role; use LmcRbacMvc\Role\RecursiveRoleIteratorStrategy; use Laminas\ServiceManager\ServiceManager; use LmcRbacMvc\Role\InMemoryRoleProvider; @@ -125,14 +126,13 @@ public function testGranted($role, $permission, $context, $isGranted, $assertion ]; $identity = $this->createMock(\LmcRbacMvc\Identity\IdentityInterface::class); - $identity->expects($this->once())->method('getRoles')->will($this->returnValue((array) $role)); + $identity->expects($this->once())->method('getRoles')->willReturn((array) $role); $identityProvider = $this->createMock('LmcRbacMvc\Identity\IdentityProviderInterface'); $identityProvider->expects($this->any()) ->method('getIdentity') - ->will($this->returnValue($identity)); + ->willReturn($identity); - $rbac = new Rbac(new RecursiveRoleIteratorStrategy()); $roleService = new RoleService( $identityProvider, new InMemoryRoleProvider($roleConfig), @@ -140,7 +140,7 @@ public function testGranted($role, $permission, $context, $isGranted, $assertion ); $assertionPluginManager = new AssertionPluginManager(new ServiceManager(), $assertionPluginConfig); - $authorizationService = new AuthorizationService($rbac, $roleService, $assertionPluginManager); + $authorizationService = new AuthorizationService($roleService, $assertionPluginManager); $authorizationService->setAssertions($assertions); @@ -150,15 +150,14 @@ public function testGranted($role, $permission, $context, $isGranted, $assertion public function testDoNotCallAssertionIfThePermissionIsNotGranted() { $role = $this->createMock('Laminas\Permissions\Rbac\RoleInterface'); - $rbac = $this->createMock('LmcRbacMvc\Rbac\Rbac'); $roleService = $this->createMock('LmcRbacMvc\Service\RoleService'); - $roleService->expects($this->once())->method('getIdentityRoles')->will($this->returnValue([$role])); + $roleService->expects($this->once())->method('getIdentityRoles')->willReturn([$role]); $assertionPluginManager = $this->createMock('LmcRbacMvc\Assertion\AssertionPluginManager'); $assertionPluginManager->expects($this->never())->method('get'); - $authorizationService = new AuthorizationService($rbac, $roleService, $assertionPluginManager); + $authorizationService = new AuthorizationService($roleService, $assertionPluginManager); $this->assertFalse($authorizationService->isGranted('foo')); } @@ -167,36 +166,26 @@ public function testDoNotCallAssertionIfThePermissionIsNotGranted() /** @deprecated */ public function testThrowExceptionForInvalidAssertion() { - $role = $this->createMock('Laminas\Permissions\Rbac\RoleInterface'); - $rbac = $this->createMock('LmcRbacMvc\Rbac\Rbac'); - - //$rbac->expects($this->once())->method('isGranted')->will($this->returnValue(true)); - $roleService = $this->createMock('LmcRbacMvc\Service\RoleService'); - //$roleService->expects($this->once())->method('getIdentityRoles')->will($this->returnValue([$role])); $assertionPluginManager = $this->createMock('LmcRbacMvc\Assertion\AssertionPluginManager'); - $authorizationService = new AuthorizationService($rbac, $roleService, $assertionPluginManager); + $authorizationService = new AuthorizationService($roleService, $assertionPluginManager); - //$this->expectException('LmcRbacMvc\Exception\InvalidArgumentException'); $this->expectException(\TypeError::class); $authorizationService->setAssertion('foo', new \stdClass()); - //$authorizationService->isGranted('foo'); } public function testDynamicAssertions() { - $role = $this->createMock('Laminas\Permissions\Rbac\RoleInterface'); - $rbac = $this->createMock('LmcRbacMvc\Rbac\Rbac'); - - $rbac->expects($this->exactly(2))->method('isGranted')->will($this->returnValue(true)); + $role = new Role('user'); + $role->addPermission('foo'); $roleService = $this->createMock('LmcRbacMvc\Service\RoleService'); - $roleService->expects($this->exactly(2))->method('getIdentityRoles')->will($this->returnValue([$role])); + $roleService->expects($this->exactly(2))->method('getIdentityRoles')->willReturn([$role]); $assertionPluginManager = $this->createMock('LmcRbacMvc\Assertion\AssertionPluginManager'); - $authorizationService = new AuthorizationService($rbac, $roleService, $assertionPluginManager); + $authorizationService = new AuthorizationService($roleService, $assertionPluginManager); // Using a callable $called = false; @@ -223,35 +212,34 @@ function (AuthorizationService $injectedService) use ($authorizationService, &$c $this->assertTrue($assertion->getCalled()); } + /** + * @covers \LmcRbacMvc\Service\AuthorizationService::hasAssertion + * @covers \LmcRbacMvc\Service\AuthorizationService::setAssertion + */ public function testAssertionMap() { - $rbac = $this->createMock('LmcRbacMvc\Rbac\Rbac'); $roleService = $this->createMock('LmcRbacMvc\Service\RoleService'); $assertionPluginManager = $this->createMock('LmcRbacMvc\Assertion\AssertionPluginManager'); - $authorizationService = new AuthorizationService($rbac, $roleService, $assertionPluginManager); + $authorizationService = new AuthorizationService($roleService, $assertionPluginManager); $authorizationService->setAssertions(['foo' => 'bar', 'bar' => 'foo']); $this->assertTrue($authorizationService->hasAssertion('foo')); $this->assertTrue($authorizationService->hasAssertion('bar')); - - // This test is no longer valid due to type validation -// $authorizationService->setAssertion('bar', null); -// $this->assertFalse($authorizationService->hasAssertion('bar')); + $this->assertFalse($authorizationService->hasAssertion('test')); } /** - * @covers LmcRbacMvc\Service\AuthorizationService::getIdentity + * @covers \LmcRbacMvc\Service\AuthorizationService::getIdentity */ public function testGetIdentity() { - $rbac = $this->createMock('LmcRbacMvc\Rbac\Rbac'); $identity = $this->createMock('LmcRbacMvc\Identity\IdentityInterface'); $roleService = $this->createMock('LmcRbacMvc\Service\RoleService'); $assertionManager = $this->createMock('LmcRbacMvc\Assertion\AssertionPluginManager'); - $authorization = new AuthorizationService($rbac, $roleService, $assertionManager); + $authorization = new AuthorizationService($roleService, $assertionManager); - $roleService->expects($this->once())->method('getIdentity')->will($this->returnValue($identity)); + $roleService->expects($this->once())->method('getIdentity')->willReturn($identity); $this->assertSame($authorization->getIdentity(), $identity); } From ac13389c2295c8bfa7bf122ec59fb81fb4a5b48e Mon Sep 17 00:00:00 2001 From: Eric Richer Date: Mon, 4 Mar 2024 14:40:39 -0500 Subject: [PATCH 23/37] Added component installer extra info --- composer.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/composer.json b/composer.json index 37142a2b..12e3940e 100644 --- a/composer.json +++ b/composer.json @@ -71,6 +71,11 @@ "LmcRbacMvcTest\\": "tests" } }, + "extra": { + "laminas": { + "module": "LmcRbacMvc" + } + }, "scripts": { "test": "phpunit", "test-coverage": "phpunit --coverage-clover ./build/logs/clover.xml --exclude-group Functional", From 699574c1de1babdf7e33fa8f4db8e81f41bf74e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 00:42:41 +0000 Subject: [PATCH 24/37] Bump follow-redirects from 1.15.5 to 1.15.6 in /docs Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.5 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.5...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/yarn.lock b/docs/yarn.lock index 5985ebb1..bf7012d5 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -4064,9 +4064,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== follow-redirects@^1.0.0: - version "1.15.5" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" - integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== fork-ts-checker-webpack-plugin@^6.5.0: version "6.5.3" From d5ff08d061a8cd0cefd00b184593aae46432b652 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 24 Mar 2024 00:55:26 +0000 Subject: [PATCH 25/37] Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /docs Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 5.3.3 to 5.3.4. - [Release notes](https://github.com/webpack/webpack-dev-middleware/releases) - [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.3...v5.3.4) --- updated-dependencies: - dependency-name: webpack-dev-middleware dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/yarn.lock b/docs/yarn.lock index 5985ebb1..d220c438 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -8146,9 +8146,9 @@ webpack-bundle-analyzer@^4.9.0: ws "^7.3.1" webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + version "5.3.4" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" + integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== dependencies: colorette "^2.0.10" memfs "^3.4.3" From d3fb4946a5d6c252f5859ac673748dab8dacdc24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 18:27:26 +0000 Subject: [PATCH 26/37] Bump express from 4.18.2 to 4.19.2 in /docs Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/yarn.lock | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/yarn.lock b/docs/yarn.lock index 5985ebb1..2ace7cff 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -2700,13 +2700,13 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== +body-parser@1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== dependencies: bytes "3.1.2" - content-type "~1.0.4" + content-type "~1.0.5" debug "2.6.9" depd "2.0.0" destroy "1.2.0" @@ -2714,7 +2714,7 @@ body-parser@1.20.1: iconv-lite "0.4.24" on-finished "2.4.1" qs "6.11.0" - raw-body "2.5.1" + raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" @@ -3153,7 +3153,7 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@~1.0.4: +content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== @@ -3168,10 +3168,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== copy-text-to-clipboard@^3.2.0: version "3.2.0" @@ -3890,16 +3890,16 @@ execa@^5.0.0: strip-final-newline "^2.0.0" express@^4.17.3: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + version "4.19.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.1" + body-parser "1.20.2" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.6.0" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" @@ -6812,10 +6812,10 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" http-errors "2.0.0" From c2248fde146346d6ef10d321b7fbcc7b4a415df2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 10 Apr 2024 20:18:28 +0000 Subject: [PATCH 27/37] Add renovate.json --- renovate.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..5db72dd6 --- /dev/null +++ b/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:recommended" + ] +} From 2387db0ed74ad9f76e58138ad98d77933e36f477 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 10 Apr 2024 20:20:23 +0000 Subject: [PATCH 28/37] Update docusaurus monorepo to v3.2.1 --- docs/package.json | 8 +- docs/yarn.lock | 402 +++++++++++++++++++++++----------------------- 2 files changed, 206 insertions(+), 204 deletions(-) diff --git a/docs/package.json b/docs/package.json index 15463056..fc9bb80f 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,8 +14,8 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "3.1.1", - "@docusaurus/preset-classic": "3.1.1", + "@docusaurus/core": "3.2.1", + "@docusaurus/preset-classic": "3.2.1", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "prism-react-renderer": "^2.3.0", @@ -23,8 +23,8 @@ "react-dom": "^18.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.1.1", - "@docusaurus/types": "3.1.1" + "@docusaurus/module-type-aliases": "3.2.1", + "@docusaurus/types": "3.2.1" }, "browserslist": { "production": [ diff --git a/docs/yarn.lock b/docs/yarn.lock index 5985ebb1..72d1b04c 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -388,7 +388,7 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.22.7", "@babel/parser@^7.23.9": +"@babel/parser@^7.23.9": version "7.23.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== @@ -1210,10 +1210,10 @@ "@docsearch/css" "3.5.2" algoliasearch "^4.19.1" -"@docusaurus/core@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.1.1.tgz#29ce8df7a3d3d12ee8962d6d86133b87235ff17b" - integrity sha512-2nQfKFcf+MLEM7JXsXwQxPOmQAR6ytKMZVSx7tVi9HEm9WtfwBH1fp6bn8Gj4zLUhjWKCLoysQ9/Wm+EZCQ4yQ== +"@docusaurus/core@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.2.1.tgz#e9216f9f642b2139541e21f9eebbdb11e12f66da" + integrity sha512-ZeMAqNvy0eBv2dThEeMuNzzuu+4thqMQakhxsgT5s02A8LqRcdkg+rbcnuNqUIpekQ4GRx3+M5nj0ODJhBXo9w== dependencies: "@babel/core" "^7.23.3" "@babel/generator" "^7.23.3" @@ -1225,14 +1225,13 @@ "@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/cssnano-preset" "3.2.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/mdx-loader" "3.2.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" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-common" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" "@svgr/webpack" "^6.5.1" autoprefixer "^10.4.14" babel-loader "^9.1.3" @@ -1253,6 +1252,7 @@ detect-port "^1.5.1" escape-html "^1.0.3" eta "^2.2.0" + eval "^0.1.8" file-loader "^6.2.0" fs-extra "^11.1.1" html-minifier-terser "^7.2.0" @@ -1261,6 +1261,7 @@ leven "^3.1.0" lodash "^4.17.21" mini-css-extract-plugin "^2.7.6" + p-map "^4.0.0" postcss "^8.4.26" postcss-loader "^7.3.3" prompts "^2.4.2" @@ -1285,34 +1286,32 @@ webpack-merge "^5.9.0" webpackbar "^5.0.2" -"@docusaurus/cssnano-preset@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.1.1.tgz#03a4cb8e6d41654d7ff5ed79fddd73fd224feea4" - integrity sha512-LnoIDjJWbirdbVZDMq+4hwmrTl2yHDnBf9MLG9qyExeAE3ac35s4yUhJI8yyTCdixzNfKit4cbXblzzqMu4+8g== +"@docusaurus/cssnano-preset@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.2.1.tgz#b36041004e837574d0147fcc4932210cdb1efbc1" + integrity sha512-wTL9KuSSbMJjKrfu385HZEzAoamUsbKqwscAQByZw4k6Ja/RWpqgVvt/CbAC+aYEH6inLzOt+MjuRwMOrD3VBA== dependencies: cssnano-preset-advanced "^5.3.10" postcss "^8.4.26" postcss-sort-media-queries "^4.4.1" tslib "^2.6.0" -"@docusaurus/logger@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.1.1.tgz#423e8270c00a57b1b3a0cc8a3ee0a4c522a68387" - integrity sha512-BjkNDpQzewcTnST8trx4idSoAla6zZ3w22NqM/UMcFtvYJgmoE4layuTzlfql3VFPNuivvj7BOExa/+21y4X2Q== +"@docusaurus/logger@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.2.1.tgz#6032e421b0b40a2379a3973dcd230d1be49afaa1" + integrity sha512-0voOKJCn9RaM3np6soqEfo7SsVvf2C+CDTWhW+H/1AyBhybASpExtDEz+7ECck9TwPzFQ5tt+I3zVugUJbJWDg== dependencies: chalk "^4.1.2" tslib "^2.6.0" -"@docusaurus/mdx-loader@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.1.1.tgz#f79290abc5044bef1d7ecac4eccec887058b8e03" - integrity sha512-xN2IccH9+sv7TmxwsDJNS97BHdmlqWwho+kIVY4tcCXkp+k4QuzvWBeunIMzeayY4Fu13A6sAjHGv5qm72KyGA== +"@docusaurus/mdx-loader@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.2.1.tgz#bea07d47300a158537bc81553769acf72c91c6c3" + integrity sha512-Fs8tXhXKZjNkdGaOy1xSLXSwfjCMT73J3Zfrju2U16uGedRFRjgK0ojpK5tiC7TnunsL3tOFgp1BSMBRflX9gw== 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" + "@docusaurus/logger" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" "@mdx-js/mdx" "^3.0.0" "@slorber/remark-comment" "^1.0.0" escape-html "^1.0.3" @@ -1335,13 +1334,13 @@ vfile "^6.0.1" webpack "^5.88.1" -"@docusaurus/module-type-aliases@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.1.1.tgz#b304402b0535a13ebd4c0db1c368d2604d54d02f" - integrity sha512-xBJyx0TMfAfVZ9ZeIOb1awdXgR4YJMocIEzTps91rq+hJDFJgJaylDtmoRhUxkwuYmNK1GJpW95b7DLztSBJ3A== +"@docusaurus/module-type-aliases@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.2.1.tgz#fa8fd746890825b4301db2ddbe29d7cfbeee0380" + integrity sha512-FyViV5TqhL1vsM7eh29nJ5NtbRE6Ra6LP1PDcPvhwPSlA7eiWGRKAn3jWwMUcmjkos5SYY+sr0/feCdbM3eQHQ== dependencies: "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/types" "3.1.1" + "@docusaurus/types" "3.2.1" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1349,18 +1348,18 @@ react-helmet-async "*" react-loadable "npm:@docusaurus/react-loadable@5.5.2" -"@docusaurus/plugin-content-blog@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.1.1.tgz#16f4fd723227b2158461bba6b9bcc18c1926f7ea" - 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" +"@docusaurus/plugin-content-blog@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.2.1.tgz#1b28c45102abc4be1a57caba76672c5ccdacce63" + integrity sha512-lOx0JfhlGZoZu6pEJfeEpSISZR5dQbJGGvb42IP13G5YThNHhG9R9uoWuo4IOimPqBC7sHThdLA3VLevk61Fsw== + dependencies: + "@docusaurus/core" "3.2.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/mdx-loader" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-common" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" cheerio "^1.0.0-rc.12" feed "^4.2.2" fs-extra "^11.1.1" @@ -1372,18 +1371,19 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-docs@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.1.1.tgz#f2eddebf351dd8dd504a2c26061165c519e1f964" - 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" +"@docusaurus/plugin-content-docs@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.2.1.tgz#d3a36239aa11392b0fbed2eaea105c17f64f50ef" + integrity sha512-GHe5b/lCskAR8QVbfWAfPAApvRZgqk7FN3sOHgjCtjzQACZxkHmq6QqyqZ8Jp45V7lVck4wt2Xw2IzBJ7Cz3bA== + dependencies: + "@docusaurus/core" "3.2.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/mdx-loader" "3.2.1" + "@docusaurus/module-type-aliases" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-common" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" "@types/react-router-config" "^5.0.7" combine-promises "^1.1.0" fs-extra "^11.1.1" @@ -1393,98 +1393,98 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-pages@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.1.1.tgz#05aec68c2abeac2140c7a16d4c5b506bf4d19fb2" - 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" +"@docusaurus/plugin-content-pages@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.2.1.tgz#7e04c470958147ec8bf72c05d3608f1bb8307aab" + integrity sha512-TOqVfMVTAHqWNEGM94Drz+PUpHDbwFy6ucHFgyTx9zJY7wPNSG5EN+rd/mU7OvAi26qpOn2o9xTdUmb28QLjEQ== + dependencies: + "@docusaurus/core" "3.2.1" + "@docusaurus/mdx-loader" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" fs-extra "^11.1.1" tslib "^2.6.0" webpack "^5.88.1" -"@docusaurus/plugin-debug@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.1.1.tgz#cee5aae1fef288fb93f68894db79a2612e313d3f" - integrity sha512-xWeMkueM9wE/8LVvl4+Qf1WqwXmreMjI5Kgr7GYCDoJ8zu4kD+KaMhrh7py7MNM38IFvU1RfrGKacCEe2DRRfQ== +"@docusaurus/plugin-debug@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.2.1.tgz#59918ac654cbf0f7cf48d43fb9d944296d440784" + integrity sha512-AMKq8NuUKf2sRpN1m/sIbqbRbnmk+rSA+8mNU1LNxEl9BW9F/Gng8m9HKlzeyMPrf5XidzS1jqkuTLDJ6KIrFw== dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/types" "3.1.1" - "@docusaurus/utils" "3.1.1" + "@docusaurus/core" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils" "3.2.1" fs-extra "^11.1.1" react-json-view-lite "^1.2.0" tslib "^2.6.0" -"@docusaurus/plugin-google-analytics@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.1.1.tgz#bfc58205b4fcaf3222e04f9c3542f3bef9804887" - integrity sha512-+q2UpWTqVi8GdlLoSlD5bS/YpxW+QMoBwrPrUH/NpvpuOi0Of7MTotsQf9JWd3hymZxl2uu1o3PIrbpxfeDFDQ== +"@docusaurus/plugin-google-analytics@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.2.1.tgz#6cab8df9218b016ce508ff96dd39cf9c87cdc9e5" + integrity sha512-/rJ+9u+Px0eTCiF4TNcNtj3kHf8cp6K1HCwOTdbsSlz6Xn21syZYcy+f1VM9wF6HrvUkXUcbM5TDCvg2IRL6bQ== dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/types" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" + "@docusaurus/core" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" tslib "^2.6.0" -"@docusaurus/plugin-google-gtag@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.1.1.tgz#7e8b5aa6847a12461c104a65a335f4a45dae2f28" - integrity sha512-0mMPiBBlQ5LFHTtjxuvt/6yzh8v7OxLi3CbeEsxXZpUzcKO/GC7UA1VOWUoBeQzQL508J12HTAlR3IBU9OofSw== +"@docusaurus/plugin-google-gtag@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.2.1.tgz#b54e6bfa0ca2efac5ed02fea39cbf069d2893a2c" + integrity sha512-XtuJnlMvYfppeVdUyKiDIJAa/gTJKCQU92z8CLZZ9ibJdgVjFOLS10s0hIC0eL5z0U2u2loJz2rZ63HOkNHbBA== dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/types" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" + "@docusaurus/core" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" "@types/gtag.js" "^0.0.12" tslib "^2.6.0" -"@docusaurus/plugin-google-tag-manager@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.1.1.tgz#e1aae4d821e786d133386b4ae6e6fe66a4bc0089" - integrity sha512-d07bsrMLdDIryDtY17DgqYUbjkswZQr8cLWl4tzXrt5OR/T/zxC1SYKajzB3fd87zTu5W5klV5GmUwcNSMXQXA== +"@docusaurus/plugin-google-tag-manager@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.2.1.tgz#8b38237c154a377f6e199b77ecc871c6c6bb41a4" + integrity sha512-wiS/kE0Ny5pnjTxVCs8ljRnkL1RVMj59t6jmSsgEX7piDOoaXSMIUaoIt9ogS/v132uO0xEsxHstkRUZHQyPcQ== dependencies: - "@docusaurus/core" "3.1.1" - "@docusaurus/types" "3.1.1" - "@docusaurus/utils-validation" "3.1.1" + "@docusaurus/core" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" tslib "^2.6.0" -"@docusaurus/plugin-sitemap@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.1.1.tgz#8828bf5e2922273aad207a35189f22913e6a0dfd" - 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" +"@docusaurus/plugin-sitemap@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.2.1.tgz#306b3e34cfbe38582ccbbd85d83ce0bdd0ae4cf7" + integrity sha512-uWZ7AxzdeaQSTCwD2yZtOiEm9zyKU+wqCmi/Sf25kQQqqFSBZUStXfaQ8OHP9cecnw893ZpZ811rPhB/wfujJw== + dependencies: + "@docusaurus/core" "3.2.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-common" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" fs-extra "^11.1.1" sitemap "^7.1.1" tslib "^2.6.0" -"@docusaurus/preset-classic@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.1.1.tgz#15fd80012529dafd7e01cc0bce59d39ee6ad6bf5" - 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" - -"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": +"@docusaurus/preset-classic@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.2.1.tgz#25a18ebaf271ec91ab7430a76a9054f101593de1" + integrity sha512-E3OHSmttpEBcSMhfPBq3EJMBxZBM01W1rnaCUTXy9EHvkmB5AwgTfW1PwGAybPAX579ntE03R+2zmXdizWfKnQ== + dependencies: + "@docusaurus/core" "3.2.1" + "@docusaurus/plugin-content-blog" "3.2.1" + "@docusaurus/plugin-content-docs" "3.2.1" + "@docusaurus/plugin-content-pages" "3.2.1" + "@docusaurus/plugin-debug" "3.2.1" + "@docusaurus/plugin-google-analytics" "3.2.1" + "@docusaurus/plugin-google-gtag" "3.2.1" + "@docusaurus/plugin-google-tag-manager" "3.2.1" + "@docusaurus/plugin-sitemap" "3.2.1" + "@docusaurus/theme-classic" "3.2.1" + "@docusaurus/theme-common" "3.2.1" + "@docusaurus/theme-search-algolia" "3.2.1" + "@docusaurus/types" "3.2.1" + +"@docusaurus/react-loadable@5.5.2": version "5.5.2" resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== @@ -1492,23 +1492,23 @@ "@types/react" "*" prop-types "^15.6.2" -"@docusaurus/theme-classic@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.1.1.tgz#0a188c787fc4bf2bb525cc30c7aa34e555ee96b8" - 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" +"@docusaurus/theme-classic@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.2.1.tgz#0aea144bbbfa77b699f6eff7ffaeb36a1adc6c02" + integrity sha512-+vSbnQyoWjc6vRZi4vJO2dBU02wqzynsai15KK+FANZudrYaBHtkbLZAQhgmxzBGVpxzi87gRohlMm+5D8f4tA== + dependencies: + "@docusaurus/core" "3.2.1" + "@docusaurus/mdx-loader" "3.2.1" + "@docusaurus/module-type-aliases" "3.2.1" + "@docusaurus/plugin-content-blog" "3.2.1" + "@docusaurus/plugin-content-docs" "3.2.1" + "@docusaurus/plugin-content-pages" "3.2.1" + "@docusaurus/theme-common" "3.2.1" + "@docusaurus/theme-translations" "3.2.1" + "@docusaurus/types" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-common" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" "@mdx-js/react" "^3.0.0" clsx "^2.0.0" copy-text-to-clipboard "^3.2.0" @@ -1523,18 +1523,18 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-common@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.1.1.tgz#5a16893928b8379c9e83aef01d753e7e142459e2" - 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" +"@docusaurus/theme-common@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.2.1.tgz#017b0cf05de2a4fa7b117ee44f25a3e8541c8bb9" + integrity sha512-d+adiD7L9xv6EvfaAwUqdKf4orsM3jqgeqAM+HAjgL/Ux0GkVVnfKr+tsoe+4ow4rHe6NUt+nkkW8/K8dKdilA== + dependencies: + "@docusaurus/mdx-loader" "3.2.1" + "@docusaurus/module-type-aliases" "3.2.1" + "@docusaurus/plugin-content-blog" "3.2.1" + "@docusaurus/plugin-content-docs" "3.2.1" + "@docusaurus/plugin-content-pages" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-common" "3.2.1" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1544,19 +1544,19 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.1.1.tgz#5170cd68cc59d150416b070bdc6d15c363ddf5e1" - integrity sha512-tBH9VY5EpRctVdaAhT+b1BY8y5dyHVZGFXyCHgTrvcXQy5CV4q7serEX7U3SveNT9zksmchPyct6i1sFDC4Z5g== +"@docusaurus/theme-search-algolia@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.2.1.tgz#6617d43ab0726b744bf8e32eb8533417c0d66b7d" + integrity sha512-bzhCrpyXBXzeydNUH83II2akvFEGfhsNTPPWsk5N7e+odgQCQwoHhcF+2qILbQXjaoZ6B3c48hrvkyCpeyqGHw== 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" + "@docusaurus/core" "3.2.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/plugin-content-docs" "3.2.1" + "@docusaurus/theme-common" "3.2.1" + "@docusaurus/theme-translations" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-validation" "3.2.1" algoliasearch "^4.18.0" algoliasearch-helper "^3.13.3" clsx "^2.0.0" @@ -1566,18 +1566,18 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.1.1.tgz#117e91ba5e3a8178cb59f3028bf41de165a508c1" - integrity sha512-xvWQFwjxHphpJq5fgk37FXCDdAa2o+r7FX8IpMg+bGZBNXyWBu3MjZ+G4+eUVNpDhVinTc+j6ucL0Ain5KCGrg== +"@docusaurus/theme-translations@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.2.1.tgz#894f6cb5bb121aa45a4a5f1383b70a8e3ae6a5d9" + integrity sha512-jAUMkIkFfY+OAhJhv6mV8zlwY6J4AQxJPTgLdR2l+Otof9+QdJjHNh/ifVEu9q0lp3oSPlJj9l05AaP7Ref+cg== dependencies: fs-extra "^11.1.1" tslib "^2.6.0" -"@docusaurus/types@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.1.1.tgz#747c9dee8cf7c3b0e5ee7351bac5e9c4fdc7f259" - integrity sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg== +"@docusaurus/types@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.2.1.tgz#88ccd4b8fa236628a29c89b8b0f60f0cc4716b69" + integrity sha512-n/toxBzL2oxTtRTOFiGKsHypzn/Pm+sXyw+VSk1UbqbXQiHOwHwts55bpKwbcUgA530Is6kix3ELiFOv9GAMfw== dependencies: "@mdx-js/mdx" "^3.0.0" "@types/history" "^4.7.11" @@ -1589,30 +1589,32 @@ webpack "^5.88.1" webpack-merge "^5.9.0" -"@docusaurus/utils-common@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.1.1.tgz#b48fade63523fd40f3adb67b47c3371e5183c20b" - integrity sha512-eGne3olsIoNfPug5ixjepZAIxeYFzHHnor55Wb2P57jNbtVaFvij/T+MS8U0dtZRFi50QU+UPmRrXdVUM8uyMg== +"@docusaurus/utils-common@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.2.1.tgz#c275fd9984951244cc4f595ce6dfd0522e40c68d" + integrity sha512-N5vadULnRLiqX2QfTjVEU3u5vo6RG2EZTdyXvJdzDOdrLCGIZAfnf/VkssinFZ922sVfaFfQ4FnStdhn5TWdVg== dependencies: tslib "^2.6.0" -"@docusaurus/utils-validation@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.1.1.tgz#3a747349ed05aee0e4d543552b41f3c9467ee731" - integrity sha512-KlY4P9YVDnwL+nExvlIpu79abfEv6ZCHuOX4ZQ+gtip+Wxj0daccdReIWWtqxM/Fb5Cz1nQvUCc7VEtT8IBUAA== +"@docusaurus/utils-validation@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.2.1.tgz#42ff0d2ae11c81d199ea485f27b86b40779673ed" + integrity sha512-+x7IR9hNMXi62L1YAglwd0s95fR7+EtirjTxSN4kahYRWGqOi3jlQl1EV0az/yTEvKbxVvOPcdYicGu9dk4LJw== dependencies: - "@docusaurus/logger" "3.1.1" - "@docusaurus/utils" "3.1.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/utils" "3.2.1" + "@docusaurus/utils-common" "3.2.1" joi "^17.9.2" js-yaml "^4.1.0" tslib "^2.6.0" -"@docusaurus/utils@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.1.1.tgz#e822d14704e4b3bb451ca464a7cc56aea9b55a45" - integrity sha512-ZJfJa5cJQtRYtqijsPEnAZoduW6sjAQ7ZCWSZavLcV10Fw0Z3gSaPKA/B4micvj2afRZ4gZxT7KfYqe5H8Cetg== +"@docusaurus/utils@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.2.1.tgz#25247d071618bc7ece9bbc3d59f3ee1ac3ded727" + integrity sha512-DPkIS/EPc+pGAV798PUXgNzJFM3HJouoQXgr0KDZuJVz1EkWbDLOcQwLIz8Qx7liI9ddfkN/TXTRQdsTPZNakw== dependencies: - "@docusaurus/logger" "3.1.1" + "@docusaurus/logger" "3.2.1" + "@docusaurus/utils-common" "3.2.1" "@svgr/webpack" "^6.5.1" escape-string-regexp "^4.0.0" file-loader "^6.2.0" @@ -1624,6 +1626,7 @@ js-yaml "^4.1.0" lodash "^4.17.21" micromatch "^4.0.5" + prompts "^2.4.2" resolve-pathname "^3.0.0" shelljs "^0.8.5" tslib "^2.6.0" @@ -1830,15 +1833,6 @@ micromark-util-character "^1.1.0" micromark-util-symbol "^1.0.1" -"@slorber/static-site-generator-webpack-plugin@^4.0.7": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz#fc1678bddefab014e2145cbe25b3ce4e1cfc36f3" - integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== - dependencies: - eval "^0.1.8" - p-map "^4.0.0" - webpack-sources "^3.2.2" - "@svgr/babel-plugin-add-jsx-attribute@^6.5.1": version "6.5.1" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" @@ -6917,6 +6911,14 @@ react-loadable-ssr-addon-v5-slorber@^1.0.1: dependencies: "@babel/runtime" "^7.10.3" +"react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + react-router-config@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" @@ -8201,7 +8203,7 @@ webpack-merge@^5.9.0: flat "^5.0.2" wildcard "^2.0.0" -webpack-sources@^3.2.2, webpack-sources@^3.2.3: +webpack-sources@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== From 9b73bf990711f35cf33e27762e81cdfae316b24b Mon Sep 17 00:00:00 2001 From: "Eric Richer eric.richer@vistoconsulting.com" Date: Wed, 10 Apr 2024 16:43:23 -0400 Subject: [PATCH 29/37] Updated documentation config and support page for Slack --- docs/docs/support.md | 2 +- docs/docusaurus.config.js | 21 +++++---------------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/docs/docs/support.md b/docs/docs/support.md index 0f6119e2..6c75bfdb 100644 --- a/docs/docs/support.md +++ b/docs/docs/support.md @@ -4,7 +4,7 @@ title: Support --- - File issues at https://github.com/LM-Commons/LmcRbacMvc/issues. -- Ask questions in the [LM-Commons Gitter](https://gitter.im/LM-Commons/community) chat. +- Ask questions in the [LM-Commons Slack](https://join.slack.com/t/lm-commons/shared_invite/zt-2gankt2wj-FTS45hp1W~JEj1tWvDsUHQ) chat. ##### Notices and Disclaimers diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 197f9863..a00216fc 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -65,7 +65,7 @@ const config = { // Replace with your project's social card image: 'img/LMC-social-card.png', navbar: { - title: 'LM-Commons LmcRbacMvc', + title: 'LmcRbacMvc', logo: { alt: 'LM-Commons Logo', src: 'img/LMC-logo.png', @@ -106,21 +106,9 @@ const config = { title: 'Community', items: [ { - label: 'Gitter', - href: 'https://gitter.im/LM-Commons/community', + label: 'Slack', + href: 'https://join.slack.com/t/lm-commons/shared_invite/zt-2gankt2wj-FTS45hp1W~JEj1tWvDsUHQ', }, - - /* - { - label: 'Discord', - href: 'https://discordapp.com/invite/docusaurus', - }, - { - label: 'Twitter', - href: 'https://twitter.com/docusaurus', - }, - - */ ], }, { @@ -137,11 +125,12 @@ const config = { ], }, ], - copyright: `Copyright © ${new Date().getFullYear()} LM Commons Organization. Built with Docusaurus.`, + copyright: `Copyright © ${new Date().getFullYear()} LM-Commons Organization. Built with Docusaurus.`, }, prism: { theme: prismThemes.github, darkTheme: prismThemes.dracula, + additionalLanguages: ['bash', 'json', 'php'] }, }), }; From d4d20ef3811046246d9a3b5ab7c6a25246104dea Mon Sep 17 00:00:00 2001 From: "Eric Richer eric.richer@vistoconsulting.com" Date: Wed, 10 Apr 2024 16:48:25 -0400 Subject: [PATCH 30/37] Fixed GH workflows to deploy on push to master --- .github/workflows/deploy-gh-pages.yml | 2 ++ .github/workflows/test-deploy-gh-pages.yml | 3 +++ 2 files changed, 5 insertions(+) diff --git a/.github/workflows/deploy-gh-pages.yml b/.github/workflows/deploy-gh-pages.yml index 597e149e..f4a36672 100644 --- a/.github/workflows/deploy-gh-pages.yml +++ b/.github/workflows/deploy-gh-pages.yml @@ -7,6 +7,8 @@ defaults: on: push: + branches: + - 'master' paths: - 'docs/**' workflow_dispatch: diff --git a/.github/workflows/test-deploy-gh-pages.yml b/.github/workflows/test-deploy-gh-pages.yml index 7f95853b..98890a6b 100644 --- a/.github/workflows/test-deploy-gh-pages.yml +++ b/.github/workflows/test-deploy-gh-pages.yml @@ -6,6 +6,9 @@ defaults: working-directory: ./docs on: + push: + paths: + - 'docs/**' pull_request: paths: - 'docs/**' From 7005fa42c5a26272151cae457e1c9cc151628c3f Mon Sep 17 00:00:00 2001 From: "Eric Richer eric.richer@vistoconsulting.com" Date: Wed, 10 Apr 2024 16:52:31 -0400 Subject: [PATCH 31/37] Small config changes to test workflows --- docs/docusaurus.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index a00216fc..c4149a68 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -20,8 +20,8 @@ const config = { // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. - organizationName: 'LM-Commons', // Usually your GitHub org/username. - projectName: 'LmcRbacMvc', // Usually your repo name. + organizationName: 'LM-Commons', + projectName: 'LmcRbacMvc', trailingSlash: false, onBrokenLinks: 'throw', From 0ee4b333561e6c0435ef7d8ee9f6af4f73b459f3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 10 Apr 2024 21:00:26 +0000 Subject: [PATCH 32/37] Update actions/checkout action to v4 --- .github/workflows/deploy-gh-pages.yml | 2 +- .github/workflows/test-deploy-gh-pages.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-gh-pages.yml b/.github/workflows/deploy-gh-pages.yml index f4a36672..5a88406a 100644 --- a/.github/workflows/deploy-gh-pages.yml +++ b/.github/workflows/deploy-gh-pages.yml @@ -23,7 +23,7 @@ jobs: shell: bash working-directory: ./docs steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-node@v3 with: node-version: 18 diff --git a/.github/workflows/test-deploy-gh-pages.yml b/.github/workflows/test-deploy-gh-pages.yml index 98890a6b..7ba419f9 100644 --- a/.github/workflows/test-deploy-gh-pages.yml +++ b/.github/workflows/test-deploy-gh-pages.yml @@ -20,7 +20,7 @@ jobs: name: Build GitHub Pages runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-node@v3 with: node-version: 18 From 6a007f09eb1398789b0520aa6f28133b6c1426ab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 10 Apr 2024 21:03:58 +0000 Subject: [PATCH 33/37] Update actions/setup-node action to v4 --- .github/workflows/deploy-gh-pages.yml | 2 +- .github/workflows/test-deploy-gh-pages.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-gh-pages.yml b/.github/workflows/deploy-gh-pages.yml index 5a88406a..701e8adc 100644 --- a/.github/workflows/deploy-gh-pages.yml +++ b/.github/workflows/deploy-gh-pages.yml @@ -24,7 +24,7 @@ jobs: working-directory: ./docs steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: 18 cache: yarn diff --git a/.github/workflows/test-deploy-gh-pages.yml b/.github/workflows/test-deploy-gh-pages.yml index 7ba419f9..d67b3e75 100644 --- a/.github/workflows/test-deploy-gh-pages.yml +++ b/.github/workflows/test-deploy-gh-pages.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: 18 cache: yarn From efa8fb69809dc0178b4cd417646a9957596d46b3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 10 Apr 2024 21:05:32 +0000 Subject: [PATCH 34/37] Update peaceiris/actions-gh-pages action to v4 --- .github/workflows/deploy-gh-pages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-gh-pages.yml b/.github/workflows/deploy-gh-pages.yml index 701e8adc..5a6a1fc9 100644 --- a/.github/workflows/deploy-gh-pages.yml +++ b/.github/workflows/deploy-gh-pages.yml @@ -34,7 +34,7 @@ jobs: - name: Build website run: yarn build - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v3 + uses: peaceiris/actions-gh-pages@v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} # Build output to publish to the `gh-pages` branch: From b200a5c2127bba2ace4a9b3f5c5fb9809b7d5920 Mon Sep 17 00:00:00 2001 From: "Eric Richer eric.richer@vistoconsulting.com" Date: Fri, 12 Apr 2024 10:26:25 -0400 Subject: [PATCH 35/37] Updated README.md in docs --- docs/README.md | 52 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0c6c2c27..b62df12e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,41 +1,55 @@ -# Website +# Documentation Website -This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. +The Documentation Website is built using [Docusaurus](https://docusaurus.io/). + +If you want to make a contribution to the documentation, please follow these +instructions: + +1. Fork the `master` branch of this repository to your GitHub profile. Do not fork the `gh-pages` branch as it only contains the "built" version. +2. Create a branch to work on your changes +3. Test your changes locally (see below for instructions on how to use Docusaurus) +4. Create a Pull Request against the `master` branch to submit your changes + + +## Install and Develop with Docusaurus + +This is not a tutorial on how to use Docusaurus. Please refer to Docusaurus documentation. ### Installation +On your local fork of the Documentation, use `yarn` to install +the Docusaurus dependencies. + ``` $ yarn ``` ### Local Development -``` -$ yarn start -``` +Once the dependencies are installed, you can make changes to the documentation source files. + +Typically, only the files located under `/docs`, `/src` and `/blog` should be changed. -This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. +Changes to the navigation and footer are made to the `docusauraus.config.js` file. -### Build +To test locally your changes, run: ``` -$ yarn build +$ yarn start ``` -This command generates static content into the `build` directory and can be served using any static contents hosting service. +This command starts a local development server and opens up a browser window. Most changes are reflected live +without having to restart the server. -### Deployment +## Test builds -Using SSH: +A GitHub action is define to test builds. It will run on push to your fork. -``` -$ USE_SSH=true yarn deploy -``` +You may have to enable workflows on your fork before they are run. -Not using SSH: +## Submit changes -``` -$ GIT_USER= yarn deploy -``` +Once you are satisfied with your changes and the `Build GitHub Pages No Deploy` action has +passed successfully, then create and submit a Pull Request against the `master` branch of +the repository. -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. From da245a6e36f4e0c37a403cee78698641aeda69b0 Mon Sep 17 00:00:00 2001 From: "Eric Richer eric.richer@vistoconsulting.com" Date: Mon, 22 Apr 2024 16:31:58 -0400 Subject: [PATCH 36/37] Updated badges and Slack chat in README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 70d4b142..d5985944 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # LmcRbacMvc +[![Build](https://github.com/visto9259/LmcRbacMvc/actions/workflows/build_test.yml/badge.svg)](https://github.com/visto9259/LmcRbacMvc/actions/workflows/build_test.yml) [![Version](https://poser.pugx.org/lm-commons/lmc-rbac-mvc/version)](//packagist.org/packages/lm-commons/lmc-rbac-mvc) [![Total Downloads](https://poser.pugx.org/lm-commons/lmc-rbac-mvc/downloads)](//packagist.org/packages/lm-commons/lmc-rbac-mvc) [![License](https://poser.pugx.org/lm-commons/lmc-rbac-mvc/license)](//packagist.org/packages/lm-commons/lmc-rbac-mvc) -[![Master Branch Build Status](https://travis-ci.com/LM-Commons/LmcRbacMvc.svg?branch=master)](http://travis-ci.com/LM-Commons/LmcRbac) -[![Gitter](https://badges.gitter.im/LM-Commons/community.svg)](https://gitter.im/LM-Commons/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Coverage Status](https://coveralls.io/repos/github/LM-Commons/LmcRbacMvc/badge.svg?branch=master)](https://coveralls.io/github/LM-Commons/LmcRbacMvc?branch=master) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/LM-Commons/LmcRbacMvc/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/LM-Commons/LmcRbacMvc/?branch=master) +![Dynamic JSON Badge](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fapi.github.com%2Frepos%2Flm-commons%2Flmcrbacmvc%2Fproperties%2Fvalues&query=%24%5B%3A1%5D.value&label=Maintenance%20Status) +[![Static Badge](https://img.shields.io/badge/Chat_on-Slack-blue)](https://join.slack.com/t/lm-commons/shared_invite/zt-2gankt2wj-FTS45hp1W~JEj1tWvDsUHQ) Role-based access control module to provide additional features on top of Zend\Permissions\Rbac @@ -65,4 +65,4 @@ of LmcRbac. ## Support - File issues at https://github.com/LM-Commons/LmcRbacMvc/issues. -- Ask questions in the [LM-Commons gitter](https://gitter.im/LM-Commons/community) chat. +- Ask questions in the [LM-Commons Slack](https://join.slack.com/t/lm-commons/shared_invite/zt-2gankt2wj-FTS45hp1W~JEj1tWvDsUHQ) chat. From 4886825fc797d79a7dc95fcf9b5ea0ca97df77e7 Mon Sep 17 00:00:00 2001 From: "Eric Richer eric.richer@vistoconsulting.com" Date: Thu, 23 May 2024 15:05:35 -0400 Subject: [PATCH 37/37] Updated badges and Slack chat in README.md --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index b7c88d27..4d066768 100644 --- a/README.md +++ b/README.md @@ -10,13 +10,6 @@ Role-based access control module to provide additional features on top of Zend\Permissions\Rbac -Based on [ZF-Commons/zfc-rbac](https://github.com/ZF-Commons/zfc-rbac) v2.6.x. If you are looking for the Laminas version of zfc-rbac v3, please use [LM-Commons/LmcRbac](https://github.com/LM-Commons/LmcRbac). - -### Important Notes: - - -Role-based access control module to provide additional features on top of Laminas\Permissions\Rbac - ## Requirements - PHP 8.1 or higher